mepcli 1.3.2 → 2.0.0-beta.1

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 (291) hide show
  1. package/README.md +11 -2
  2. package/dist/{ansi.js → src/ansi.js} +17 -9
  3. package/dist/src/ansi.js.map +1 -0
  4. package/dist/{base.js → src/base.js} +82 -70
  5. package/dist/src/base.js.map +1 -0
  6. package/dist/{core.js → src/core.js} +266 -320
  7. package/dist/src/core.js.map +1 -0
  8. package/dist/src/data/countries.js +569 -0
  9. package/dist/src/data/countries.js.map +1 -0
  10. package/dist/src/data/licenses.js +480 -0
  11. package/dist/src/data/licenses.js.map +1 -0
  12. package/dist/{highlight.js → src/highlight.js} +77 -69
  13. package/dist/src/highlight.js.map +1 -0
  14. package/dist/src/index.js +66 -0
  15. package/dist/src/index.js.map +1 -0
  16. package/dist/{input.js → src/input.js} +47 -41
  17. package/dist/src/input.js.map +1 -0
  18. package/dist/src/pipeline.js +273 -0
  19. package/dist/src/pipeline.js.map +1 -0
  20. package/dist/{prompts → src/prompts}/autocomplete.js +58 -57
  21. package/dist/src/prompts/autocomplete.js.map +1 -0
  22. package/dist/{prompts → src/prompts}/box.js +86 -53
  23. package/dist/src/prompts/box.js.map +1 -0
  24. package/dist/{prompts → src/prompts}/breadcrumb-search.js +110 -98
  25. package/dist/src/prompts/breadcrumb-search.js.map +1 -0
  26. package/dist/{prompts → src/prompts}/breadcrumb.js +126 -121
  27. package/dist/src/prompts/breadcrumb.js.map +1 -0
  28. package/dist/{prompts → src/prompts}/byte.js +69 -52
  29. package/dist/src/prompts/byte.js.map +1 -0
  30. package/dist/{prompts → src/prompts}/calculator.js +79 -56
  31. package/dist/src/prompts/calculator.js.map +1 -0
  32. package/dist/{prompts → src/prompts}/calendar.js +167 -127
  33. package/dist/src/prompts/calendar.js.map +1 -0
  34. package/dist/{prompts → src/prompts}/checkbox.js +53 -49
  35. package/dist/src/prompts/checkbox.js.map +1 -0
  36. package/dist/{prompts → src/prompts}/code.js +88 -76
  37. package/dist/src/prompts/code.js.map +1 -0
  38. package/dist/{prompts → src/prompts}/color.js +68 -50
  39. package/dist/src/prompts/color.js.map +1 -0
  40. package/dist/{prompts → src/prompts}/confirm.js +22 -15
  41. package/dist/src/prompts/confirm.js.map +1 -0
  42. package/dist/{prompts → src/prompts}/connection-string.js +59 -36
  43. package/dist/src/prompts/connection-string.js.map +1 -0
  44. package/dist/{prompts → src/prompts}/cron.js +90 -59
  45. package/dist/src/prompts/cron.js.map +1 -0
  46. package/dist/src/prompts/curl-utils.js +71 -0
  47. package/dist/src/prompts/curl-utils.js.map +1 -0
  48. package/dist/{prompts → src/prompts}/curl.js +153 -132
  49. package/dist/src/prompts/curl.js.map +1 -0
  50. package/dist/{prompts → src/prompts}/data-inspector.js +96 -91
  51. package/dist/src/prompts/data-inspector.js.map +1 -0
  52. package/dist/{prompts → src/prompts}/date.js +64 -57
  53. package/dist/src/prompts/date.js.map +1 -0
  54. package/dist/{prompts → src/prompts}/dependency.js +84 -80
  55. package/dist/src/prompts/dependency.js.map +1 -0
  56. package/dist/{prompts → src/prompts}/dial.js +49 -35
  57. package/dist/src/prompts/dial.js.map +1 -0
  58. package/dist/src/prompts/diff.js +118 -0
  59. package/dist/src/prompts/diff.js.map +1 -0
  60. package/dist/{prompts → src/prompts}/draw.js +83 -80
  61. package/dist/src/prompts/draw.js.map +1 -0
  62. package/dist/src/prompts/editor.js +234 -0
  63. package/dist/src/prompts/editor.js.map +1 -0
  64. package/dist/{prompts → src/prompts}/emoji.js +80 -82
  65. package/dist/src/prompts/emoji.js.map +1 -0
  66. package/dist/{prompts → src/prompts}/exec.js +60 -46
  67. package/dist/src/prompts/exec.js.map +1 -0
  68. package/dist/src/prompts/file.js +217 -0
  69. package/dist/src/prompts/file.js.map +1 -0
  70. package/dist/{prompts → src/prompts}/form.js +63 -54
  71. package/dist/src/prompts/form.js.map +1 -0
  72. package/dist/{prompts → src/prompts}/fuzzy-multi-column.js +65 -53
  73. package/dist/src/prompts/fuzzy-multi-column.js.map +1 -0
  74. package/dist/{prompts → src/prompts}/fuzzy.js +66 -55
  75. package/dist/src/prompts/fuzzy.js.map +1 -0
  76. package/dist/src/prompts/gauge.js +137 -0
  77. package/dist/src/prompts/gauge.js.map +1 -0
  78. package/dist/{prompts → src/prompts}/grid.js +70 -57
  79. package/dist/src/prompts/grid.js.map +1 -0
  80. package/dist/{prompts → src/prompts}/heatmap.js +70 -64
  81. package/dist/src/prompts/heatmap.js.map +1 -0
  82. package/dist/{prompts → src/prompts}/ip.js +56 -36
  83. package/dist/src/prompts/ip.js.map +1 -0
  84. package/dist/{prompts → src/prompts}/kanban.js +63 -58
  85. package/dist/src/prompts/kanban.js.map +1 -0
  86. package/dist/src/prompts/keypress.js +54 -0
  87. package/dist/src/prompts/keypress.js.map +1 -0
  88. package/dist/src/prompts/license.js +144 -0
  89. package/dist/src/prompts/license.js.map +1 -0
  90. package/dist/{prompts → src/prompts}/list.js +46 -31
  91. package/dist/src/prompts/list.js.map +1 -0
  92. package/dist/{prompts → src/prompts}/map.js +93 -77
  93. package/dist/src/prompts/map.js.map +1 -0
  94. package/dist/{prompts → src/prompts}/match.js +91 -95
  95. package/dist/src/prompts/match.js.map +1 -0
  96. package/dist/{prompts → src/prompts}/miller.js +74 -67
  97. package/dist/src/prompts/miller.js.map +1 -0
  98. package/dist/{prompts → src/prompts}/multi-column-select.js +54 -44
  99. package/dist/src/prompts/multi-column-select.js.map +1 -0
  100. package/dist/{prompts → src/prompts}/multi-range.js +70 -52
  101. package/dist/src/prompts/multi-range.js.map +1 -0
  102. package/dist/{prompts → src/prompts}/multi-select.js +67 -58
  103. package/dist/src/prompts/multi-select.js.map +1 -0
  104. package/dist/{prompts → src/prompts}/number.js +51 -39
  105. package/dist/src/prompts/number.js.map +1 -0
  106. package/dist/{prompts → src/prompts}/otp.js +43 -27
  107. package/dist/src/prompts/otp.js.map +1 -0
  108. package/dist/{prompts → src/prompts}/pattern.js +74 -71
  109. package/dist/src/prompts/pattern.js.map +1 -0
  110. package/dist/{prompts → src/prompts}/phone.js +107 -118
  111. package/dist/src/prompts/phone.js.map +1 -0
  112. package/dist/src/prompts/quiz-select.js +114 -0
  113. package/dist/src/prompts/quiz-select.js.map +1 -0
  114. package/dist/src/prompts/quiz-text.js +98 -0
  115. package/dist/src/prompts/quiz-text.js.map +1 -0
  116. package/dist/{prompts → src/prompts}/range.js +85 -61
  117. package/dist/src/prompts/range.js.map +1 -0
  118. package/dist/{prompts → src/prompts}/rating.js +29 -24
  119. package/dist/src/prompts/rating.js.map +1 -0
  120. package/dist/{prompts → src/prompts}/regex.js +50 -36
  121. package/dist/src/prompts/regex.js.map +1 -0
  122. package/dist/{prompts → src/prompts}/region.js +62 -56
  123. package/dist/src/prompts/region.js.map +1 -0
  124. package/dist/{prompts → src/prompts}/schedule.js +82 -75
  125. package/dist/src/prompts/schedule.js.map +1 -0
  126. package/dist/{prompts → src/prompts}/scroll.js +61 -58
  127. package/dist/src/prompts/scroll.js.map +1 -0
  128. package/dist/src/prompts/seat.js +164 -0
  129. package/dist/src/prompts/seat.js.map +1 -0
  130. package/dist/{prompts → src/prompts}/select-range.js +58 -46
  131. package/dist/src/prompts/select-range.js.map +1 -0
  132. package/dist/{prompts → src/prompts}/select.js +65 -66
  133. package/dist/src/prompts/select.js.map +1 -0
  134. package/dist/{prompts → src/prompts}/semver.js +24 -13
  135. package/dist/src/prompts/semver.js.map +1 -0
  136. package/dist/src/prompts/shortcut.js +133 -0
  137. package/dist/src/prompts/shortcut.js.map +1 -0
  138. package/dist/{prompts → src/prompts}/slider.js +28 -23
  139. package/dist/src/prompts/slider.js.map +1 -0
  140. package/dist/src/prompts/slot.js +117 -0
  141. package/dist/src/prompts/slot.js.map +1 -0
  142. package/dist/{prompts → src/prompts}/snippet.js +82 -61
  143. package/dist/src/prompts/snippet.js.map +1 -0
  144. package/dist/{prompts → src/prompts}/sort-grid.js +64 -59
  145. package/dist/src/prompts/sort-grid.js.map +1 -0
  146. package/dist/{prompts → src/prompts}/sort.js +59 -49
  147. package/dist/src/prompts/sort.js.map +1 -0
  148. package/dist/src/prompts/spam.js +80 -0
  149. package/dist/src/prompts/spam.js.map +1 -0
  150. package/dist/{prompts → src/prompts}/spreadsheet.js +71 -70
  151. package/dist/src/prompts/spreadsheet.js.map +1 -0
  152. package/dist/{prompts → src/prompts}/table.js +52 -38
  153. package/dist/src/prompts/table.js.map +1 -0
  154. package/dist/{prompts → src/prompts}/text.js +74 -70
  155. package/dist/src/prompts/text.js.map +1 -0
  156. package/dist/{prompts → src/prompts}/time.js +105 -96
  157. package/dist/src/prompts/time.js.map +1 -0
  158. package/dist/src/prompts/toggle.js +53 -0
  159. package/dist/src/prompts/toggle.js.map +1 -0
  160. package/dist/{prompts → src/prompts}/transfer.js +71 -67
  161. package/dist/src/prompts/transfer.js.map +1 -0
  162. package/dist/{prompts → src/prompts}/tree-select.js +83 -86
  163. package/dist/src/prompts/tree-select.js.map +1 -0
  164. package/dist/{prompts → src/prompts}/tree.js +69 -67
  165. package/dist/src/prompts/tree.js.map +1 -0
  166. package/dist/src/prompts/wait.js +79 -0
  167. package/dist/src/prompts/wait.js.map +1 -0
  168. package/dist/src/spinner.js +105 -0
  169. package/dist/src/spinner.js.map +1 -0
  170. package/dist/{symbols.js → src/symbols.js} +32 -7
  171. package/dist/src/symbols.js.map +1 -0
  172. package/dist/{tasks.js → src/tasks.js} +104 -79
  173. package/dist/src/tasks.js.map +1 -0
  174. package/dist/src/theme.js +29 -0
  175. package/dist/src/theme.js.map +1 -0
  176. package/dist/src/types.js +8 -0
  177. package/dist/src/types.js.map +1 -0
  178. package/dist/{utils.js → src/utils.js} +196 -152
  179. package/dist/src/utils.js.map +1 -0
  180. package/package.json +16 -13
  181. package/dist/ansi.d.ts +0 -36
  182. package/dist/base.d.ts +0 -60
  183. package/dist/core.d.ts +0 -1072
  184. package/dist/data/countries.d.ts +0 -2
  185. package/dist/data/countries.js +0 -105
  186. package/dist/data/licenses.d.ts +0 -2
  187. package/dist/data/licenses.js +0 -109
  188. package/dist/highlight.d.ts +0 -7
  189. package/dist/index.d.ts +0 -48
  190. package/dist/index.js +0 -64
  191. package/dist/input.d.ts +0 -14
  192. package/dist/pipeline.d.ts +0 -39
  193. package/dist/pipeline.js +0 -54
  194. package/dist/prompts/autocomplete.d.ts +0 -22
  195. package/dist/prompts/box.d.ts +0 -21
  196. package/dist/prompts/breadcrumb-search.d.ts +0 -14
  197. package/dist/prompts/breadcrumb.d.ts +0 -32
  198. package/dist/prompts/byte.d.ts +0 -13
  199. package/dist/prompts/calculator.d.ts +0 -17
  200. package/dist/prompts/calendar.d.ts +0 -33
  201. package/dist/prompts/checkbox.d.ts +0 -13
  202. package/dist/prompts/code.d.ts +0 -19
  203. package/dist/prompts/color.d.ts +0 -14
  204. package/dist/prompts/confirm.d.ts +0 -8
  205. package/dist/prompts/connection-string.d.ts +0 -18
  206. package/dist/prompts/cron.d.ts +0 -13
  207. package/dist/prompts/curl-utils.d.ts +0 -25
  208. package/dist/prompts/curl-utils.js +0 -41
  209. package/dist/prompts/curl.d.ts +0 -41
  210. package/dist/prompts/data-inspector.d.ts +0 -22
  211. package/dist/prompts/date.d.ts +0 -12
  212. package/dist/prompts/dependency.d.ts +0 -16
  213. package/dist/prompts/dial.d.ts +0 -10
  214. package/dist/prompts/diff.d.ts +0 -10
  215. package/dist/prompts/diff.js +0 -101
  216. package/dist/prompts/draw.d.ts +0 -20
  217. package/dist/prompts/editor.d.ts +0 -14
  218. package/dist/prompts/editor.js +0 -203
  219. package/dist/prompts/emoji.d.ts +0 -18
  220. package/dist/prompts/exec.d.ts +0 -17
  221. package/dist/prompts/file.d.ts +0 -21
  222. package/dist/prompts/file.js +0 -210
  223. package/dist/prompts/form.d.ts +0 -18
  224. package/dist/prompts/fuzzy-multi-column.d.ts +0 -12
  225. package/dist/prompts/fuzzy.d.ts +0 -12
  226. package/dist/prompts/gauge.d.ts +0 -21
  227. package/dist/prompts/gauge.js +0 -130
  228. package/dist/prompts/grid.d.ts +0 -14
  229. package/dist/prompts/heatmap.d.ts +0 -13
  230. package/dist/prompts/ip.d.ts +0 -11
  231. package/dist/prompts/kanban.d.ts +0 -17
  232. package/dist/prompts/keypress.d.ts +0 -7
  233. package/dist/prompts/keypress.js +0 -55
  234. package/dist/prompts/license.d.ts +0 -9
  235. package/dist/prompts/license.js +0 -105
  236. package/dist/prompts/list.d.ts +0 -9
  237. package/dist/prompts/map.d.ts +0 -17
  238. package/dist/prompts/match.d.ts +0 -19
  239. package/dist/prompts/miller.d.ts +0 -15
  240. package/dist/prompts/multi-column-select.d.ts +0 -10
  241. package/dist/prompts/multi-range.d.ts +0 -9
  242. package/dist/prompts/multi-select.d.ts +0 -15
  243. package/dist/prompts/number.d.ts +0 -11
  244. package/dist/prompts/otp.d.ts +0 -10
  245. package/dist/prompts/pattern.d.ts +0 -22
  246. package/dist/prompts/phone.d.ts +0 -41
  247. package/dist/prompts/quiz-select.d.ts +0 -10
  248. package/dist/prompts/quiz-select.js +0 -104
  249. package/dist/prompts/quiz-text.d.ts +0 -11
  250. package/dist/prompts/quiz-text.js +0 -82
  251. package/dist/prompts/range.d.ts +0 -9
  252. package/dist/prompts/rating.d.ts +0 -8
  253. package/dist/prompts/regex.d.ts +0 -13
  254. package/dist/prompts/region.d.ts +0 -11
  255. package/dist/prompts/schedule.d.ts +0 -20
  256. package/dist/prompts/scroll.d.ts +0 -13
  257. package/dist/prompts/seat.d.ts +0 -17
  258. package/dist/prompts/seat.js +0 -165
  259. package/dist/prompts/select-range.d.ts +0 -8
  260. package/dist/prompts/select.d.ts +0 -15
  261. package/dist/prompts/semver.d.ts +0 -6
  262. package/dist/prompts/shortcut.d.ts +0 -9
  263. package/dist/prompts/shortcut.js +0 -135
  264. package/dist/prompts/slider.d.ts +0 -8
  265. package/dist/prompts/slot.d.ts +0 -16
  266. package/dist/prompts/slot.js +0 -107
  267. package/dist/prompts/snippet.d.ts +0 -19
  268. package/dist/prompts/sort-grid.d.ts +0 -16
  269. package/dist/prompts/sort.d.ts +0 -14
  270. package/dist/prompts/spam.d.ts +0 -17
  271. package/dist/prompts/spam.js +0 -62
  272. package/dist/prompts/spreadsheet.d.ts +0 -21
  273. package/dist/prompts/table.d.ts +0 -14
  274. package/dist/prompts/text.d.ts +0 -17
  275. package/dist/prompts/time.d.ts +0 -12
  276. package/dist/prompts/toggle.d.ts +0 -8
  277. package/dist/prompts/toggle.js +0 -47
  278. package/dist/prompts/transfer.d.ts +0 -18
  279. package/dist/prompts/tree-select.d.ts +0 -31
  280. package/dist/prompts/tree.d.ts +0 -20
  281. package/dist/prompts/wait.d.ts +0 -18
  282. package/dist/prompts/wait.js +0 -62
  283. package/dist/spinner.d.ts +0 -33
  284. package/dist/spinner.js +0 -89
  285. package/dist/symbols.d.ts +0 -33
  286. package/dist/tasks.d.ts +0 -57
  287. package/dist/theme.d.ts +0 -2
  288. package/dist/theme.js +0 -20
  289. package/dist/types.d.ts +0 -503
  290. package/dist/types.js +0 -5
  291. package/dist/utils.d.ts +0 -81
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "FilePrompt", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return FilePrompt;
9
+ }
10
+ });
11
+ const _ansi = require("../ansi");
12
+ const _base = require("../base");
13
+ const _theme = require("../theme");
14
+ const _symbols = require("../symbols");
15
+ const _fs = /*#__PURE__*/ _interop_require_wildcard(require("fs"));
16
+ const _path = /*#__PURE__*/ _interop_require_wildcard(require("path"));
17
+ function _define_property(obj, key, value) {
18
+ if (key in obj) {
19
+ Object.defineProperty(obj, key, {
20
+ value: value,
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true
24
+ });
25
+ } else {
26
+ obj[key] = value;
27
+ }
28
+ return obj;
29
+ }
30
+ function _getRequireWildcardCache(nodeInterop) {
31
+ if (typeof WeakMap !== "function") return null;
32
+ var cacheBabelInterop = new WeakMap();
33
+ var cacheNodeInterop = new WeakMap();
34
+ return (_getRequireWildcardCache = function(nodeInterop) {
35
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
36
+ })(nodeInterop);
37
+ }
38
+ function _interop_require_wildcard(obj, nodeInterop) {
39
+ if (!nodeInterop && obj && obj.__esModule) {
40
+ return obj;
41
+ }
42
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
43
+ return {
44
+ default: obj
45
+ };
46
+ }
47
+ var cache = _getRequireWildcardCache(nodeInterop);
48
+ if (cache && cache.has(obj)) {
49
+ return cache.get(obj);
50
+ }
51
+ var newObj = {
52
+ __proto__: null
53
+ };
54
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
55
+ for(var key in obj){
56
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
57
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
58
+ if (desc && (desc.get || desc.set)) {
59
+ Object.defineProperty(newObj, key, desc);
60
+ } else {
61
+ newObj[key] = obj[key];
62
+ }
63
+ }
64
+ }
65
+ newObj.default = obj;
66
+ if (cache) {
67
+ cache.set(obj, newObj);
68
+ }
69
+ return newObj;
70
+ }
71
+ let FilePrompt = class FilePrompt extends _base.Prompt {
72
+ /**
73
+ * Updates the suggestions list based on the current input path.
74
+ */ updateSuggestions() {
75
+ try {
76
+ // Determine the directory to scan and the partial file name
77
+ const isDirQuery = this.input.endsWith('/') || this.input.endsWith('\\');
78
+ const dir = isDirQuery ? this.input : _path.dirname(this.input) || '.';
79
+ const partial = isDirQuery ? '' : _path.basename(this.input);
80
+ if (_fs.existsSync(dir) && _fs.statSync(dir).isDirectory()) {
81
+ const files = _fs.readdirSync(dir);
82
+ this.suggestions = files.filter((f)=>f.toLowerCase().startsWith(partial.toLowerCase())).filter((f)=>{
83
+ const fullPath = _path.join(dir, f);
84
+ try {
85
+ const stats = _fs.statSync(fullPath);
86
+ const isDir = stats.isDirectory();
87
+ if (this.options.onlyDirectories && !isDir) return false;
88
+ if (this.options.extensions && !isDir) {
89
+ return this.options.extensions.some((ext)=>f.endsWith(ext));
90
+ }
91
+ return true;
92
+ } catch (_e) {
93
+ return false;
94
+ }
95
+ }).map((f)=>{
96
+ const fullPath = _path.join(dir, f);
97
+ try {
98
+ // Append separator if the file is a directory
99
+ if (_fs.statSync(fullPath).isDirectory()) return f + _path.sep;
100
+ } catch (_e) {}
101
+ return f;
102
+ });
103
+ } else {
104
+ this.suggestions = [];
105
+ }
106
+ } catch (_e) {
107
+ this.suggestions = [];
108
+ }
109
+ this.selectedSuggestion = -1;
110
+ }
111
+ render(firstRender) {
112
+ // Restore cursor position to the bottom before renderFrame clears the area
113
+ if (!firstRender && this.lastLinesUp > 0) {
114
+ this.print(`\x1b[${this.lastLinesUp}B`);
115
+ this.lastLinesUp = 0;
116
+ }
117
+ const icon = this.errorMsg ? `${_theme.theme.error}${_symbols.symbols.cross}` : `${_theme.theme.success}?`;
118
+ let output = `${icon} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} ${this.input}`;
119
+ if (this.suggestions.length > 0) {
120
+ output += '\n';
121
+ const maxShow = 5;
122
+ const displayed = this.suggestions.slice(0, maxShow);
123
+ displayed.forEach((s, i)=>{
124
+ if (i > 0) output += '\n';
125
+ if (i === this.selectedSuggestion) {
126
+ output += `${_theme.theme.main}${_symbols.symbols.pointer} ${s}${_ansi.ANSI.RESET}`;
127
+ } else {
128
+ output += ` ${s}`;
129
+ }
130
+ });
131
+ if (this.suggestions.length > maxShow) {
132
+ output += `\n ${_theme.theme.muted}...and ${this.suggestions.length - maxShow} more${_ansi.ANSI.RESET}`;
133
+ }
134
+ }
135
+ this.renderFrame(output);
136
+ // Move cursor back up to the input line
137
+ const totalLines = this.lastRenderHeight;
138
+ if (totalLines > 1) {
139
+ this.lastLinesUp = totalLines - 1;
140
+ this.print(`\x1b[${this.lastLinesUp}A`);
141
+ }
142
+ // Calculate horizontal cursor position on the input line
143
+ const prefix = `${icon} ${_theme.theme.title}${this.options.message} `;
144
+ const prefixLen = this.stripAnsi(prefix).length;
145
+ const targetCol = prefixLen + this.input.length;
146
+ this.print(_ansi.ANSI.CURSOR_LEFT);
147
+ if (targetCol > 0) this.print(`\x1b[${targetCol}C`);
148
+ this.print(_ansi.ANSI.SHOW_CURSOR);
149
+ }
150
+ cleanup() {
151
+ if (this.lastLinesUp > 0) {
152
+ this.print(`\x1b[${this.lastLinesUp}B`);
153
+ this.lastLinesUp = 0;
154
+ }
155
+ super.cleanup();
156
+ }
157
+ handleInput(char) {
158
+ if (char === '\t') {
159
+ if (this.suggestions.length > 0) {
160
+ // Use the selected suggestion or the first one available
161
+ const idx = this.selectedSuggestion === -1 ? 0 : this.selectedSuggestion;
162
+ const suggestion = this.suggestions[idx];
163
+ const isDir = this.input.endsWith('/') || this.input.endsWith('\\');
164
+ const dir = isDir ? this.input : _path.dirname(this.input);
165
+ // Construct the new path accurately
166
+ const baseDir = dir === '.' && !this.input.startsWith('.') ? '' : dir;
167
+ this.input = _path.join(baseDir, suggestion);
168
+ this.cursor = this.input.length;
169
+ // Immediately refresh suggestions for the new path
170
+ this.updateSuggestions();
171
+ this.render(false);
172
+ }
173
+ return;
174
+ }
175
+ if (char === '\r' || char === '\n') {
176
+ this.submit(this.input);
177
+ return;
178
+ }
179
+ if (this.isDown(char)) {
180
+ if (this.suggestions.length > 0) {
181
+ const count = Math.min(this.suggestions.length, 5);
182
+ this.selectedSuggestion = (this.selectedSuggestion + 1) % count;
183
+ this.render(false);
184
+ }
185
+ return;
186
+ }
187
+ if (this.isUp(char)) {
188
+ if (this.suggestions.length > 0) {
189
+ const count = Math.min(this.suggestions.length, 5);
190
+ this.selectedSuggestion = (this.selectedSuggestion - 1 + count) % count;
191
+ this.render(false);
192
+ }
193
+ return;
194
+ }
195
+ if (char === '\u0008' || char === '\x7f') {
196
+ if (this.input.length > 0) {
197
+ this.input = this.input.slice(0, -1);
198
+ this.updateSuggestions();
199
+ this.render(false);
200
+ }
201
+ return;
202
+ }
203
+ if (!/^[\x00-\x1F]/.test(char) && !char.startsWith('\x1b')) {
204
+ this.input += char;
205
+ this.updateSuggestions();
206
+ this.render(false);
207
+ }
208
+ }
209
+ constructor(options){
210
+ super(options), _define_property(this, "input", ''), _define_property(this, "cursor", 0), _define_property(this, "suggestions", []), _define_property(this, "selectedSuggestion", -1), _define_property(this, "errorMsg", ''), _define_property(this, "lastLinesUp", 0);
211
+ this.input = options.basePath || '';
212
+ this.cursor = this.input.length;
213
+ this.updateSuggestions();
214
+ }
215
+ };
216
+
217
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
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,25 +1,32 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FormPrompt = void 0;
4
- const ansi_1 = require("../ansi");
5
- const base_1 = require("../base");
6
- const theme_1 = require("../theme");
7
- const symbols_1 = require("../symbols");
8
- const utils_1 = require("../utils");
9
- class FormPrompt extends base_1.Prompt {
10
- constructor(options) {
11
- super(options);
12
- this.values = {};
13
- this.activeIndex = 0;
14
- this.fieldErrors = {};
15
- this.globalError = '';
16
- this.cursor = 0; // Cursor position for the ACTIVE field.
17
- this.lastLinesUp = 0; // To track cursor position after render
18
- this.options.fields.forEach(field => {
19
- this.values[field.name] = field.initial || '';
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
20
23
  });
21
- this.cursor = this.values[this.options.fields[0].name].length;
24
+ } else {
25
+ obj[key] = value;
22
26
  }
27
+ return obj;
28
+ }
29
+ let FormPrompt = class FormPrompt extends _base.Prompt {
23
30
  render(firstRender) {
24
31
  if (!firstRender && this.lastLinesUp > 0) {
25
32
  this.print(`\x1b[${this.lastLinesUp}B`);
@@ -27,30 +34,29 @@ class FormPrompt extends base_1.Prompt {
27
34
  this.lastLinesUp = 0;
28
35
  const outputLines = [];
29
36
  // Title
30
- outputLines.push(`${theme_1.theme.success}? ${ansi_1.ANSI.BOLD}${theme_1.theme.title}${this.options.message}${ansi_1.ANSI.RESET}`);
37
+ outputLines.push(`${_theme.theme.success}? ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}`);
31
38
  if (this.globalError) {
32
- outputLines.push(`${theme_1.theme.error}>> ${this.globalError}${ansi_1.ANSI.RESET}`);
39
+ outputLines.push(`${_theme.theme.error}>> ${this.globalError}${_ansi.ANSI.RESET}`);
33
40
  }
34
41
  let cursorLineIndex = -1;
35
42
  let cursorColIndex = 0;
36
- this.options.fields.forEach((field, index) => {
43
+ this.options.fields.forEach((field, index)=>{
37
44
  const isActive = index === this.activeIndex;
38
45
  const value = this.values[field.name];
39
46
  const error = this.fieldErrors[field.name];
40
47
  // Icon
41
48
  let icon = '';
42
49
  if (isActive) {
43
- icon = `${theme_1.theme.main}${symbols_1.symbols.pointer}`; // >
44
- }
45
- else {
50
+ icon = `${_theme.theme.main}${_symbols.symbols.pointer}`; // >
51
+ } else {
46
52
  icon = ' '; // indent
47
53
  }
48
54
  // Label
49
- const labelStyle = isActive ? `${theme_1.theme.main}${ansi_1.ANSI.BOLD}` : theme_1.theme.muted;
50
- const label = `${labelStyle}${field.message}:${ansi_1.ANSI.RESET}`;
55
+ const labelStyle = isActive ? `${_theme.theme.main}${_ansi.ANSI.BOLD}` : _theme.theme.muted;
56
+ const label = `${labelStyle}${field.message}:${_ansi.ANSI.RESET}`;
51
57
  // Value
52
58
  // Note: Use Secret/Password prompt for case sensitive input, Form prompt is for general text input
53
- const displayValue = isActive ? value : `${theme_1.theme.muted}${value}${ansi_1.ANSI.RESET}`;
59
+ const displayValue = isActive ? value : `${_theme.theme.muted}${value}${_ansi.ANSI.RESET}`;
54
60
  // Construct Line
55
61
  const line = `${icon} ${label} ${displayValue}`;
56
62
  outputLines.push(line);
@@ -60,29 +66,29 @@ class FormPrompt extends base_1.Prompt {
60
66
  const prefix = `${icon} ${label} `;
61
67
  const valuePrefix = value.substring(0, this.cursor);
62
68
  cursorLineIndex = outputLines.length - 1;
63
- cursorColIndex = (0, utils_1.stringWidth)(this.stripAnsi(prefix)) + (0, utils_1.stringWidth)(this.stripAnsi(valuePrefix));
69
+ cursorColIndex = (0, _utils.stringWidth)(this.stripAnsi(prefix)) + (0, _utils.stringWidth)(this.stripAnsi(valuePrefix));
64
70
  }
65
71
  // Error for this field
66
72
  if (error) {
67
- outputLines.push(` ${theme_1.theme.error}>> ${error}${ansi_1.ANSI.RESET}`);
73
+ outputLines.push(` ${_theme.theme.error}>> ${error}${_ansi.ANSI.RESET}`);
68
74
  }
69
75
  });
70
76
  // Instructions
71
77
  outputLines.push('');
72
- outputLines.push(`${ansi_1.ANSI.RESET}${theme_1.theme.muted}(Use Up/Down/Tab to navigate, Enter to submit)${ansi_1.ANSI.RESET}`);
78
+ outputLines.push(`${_ansi.ANSI.RESET}${_theme.theme.muted}(Use Up/Down/Tab to navigate, Enter to submit)${_ansi.ANSI.RESET}`);
73
79
  const output = outputLines.join('\n');
74
80
  this.renderFrame(output);
75
81
  // Position Cursor
76
- this.print(ansi_1.ANSI.SHOW_CURSOR);
82
+ this.print(_ansi.ANSI.SHOW_CURSOR);
77
83
  if (cursorLineIndex !== -1) {
78
84
  // Calculate lines up from bottom
79
85
  const totalLines = outputLines.length;
80
- const linesUp = (totalLines - 1) - cursorLineIndex;
86
+ const linesUp = totalLines - 1 - cursorLineIndex;
81
87
  if (linesUp > 0) {
82
88
  this.print(`\x1b[${linesUp}A`);
83
89
  this.lastLinesUp = linesUp;
84
90
  }
85
- this.print(ansi_1.ANSI.CURSOR_LEFT);
91
+ this.print(_ansi.ANSI.CURSOR_LEFT);
86
92
  if (cursorColIndex > 0) {
87
93
  this.print(`\x1b[${cursorColIndex}C`);
88
94
  }
@@ -90,7 +96,7 @@ class FormPrompt extends base_1.Prompt {
90
96
  }
91
97
  handleInput(char, key) {
92
98
  // Navigation: Up / Shift+Tab
93
- if (this.isUp(char) || (char === '\t' && key /* how to detect Shift+Tab? usually \u001b[Z */) || char === '\u001b[Z') {
99
+ if (this.isUp(char) || char === '\t' && key /* how to detect Shift+Tab? usually \u001b[Z */ || char === '\u001b[Z') {
94
100
  this.validateCurrentField();
95
101
  this.moveFocus(-1);
96
102
  return;
@@ -103,12 +109,11 @@ class FormPrompt extends base_1.Prompt {
103
109
  }
104
110
  // Enter
105
111
  if (char === '\r' || char === '\n') {
106
- this.validateCurrentField().then(isValid => {
112
+ this.validateCurrentField().then((isValid)=>{
107
113
  if (isValid) {
108
114
  if (this.activeIndex < this.options.fields.length - 1) {
109
115
  this.moveFocus(1);
110
- }
111
- else {
116
+ } else {
112
117
  // Submit
113
118
  this.submitForm();
114
119
  }
@@ -119,7 +124,7 @@ class FormPrompt extends base_1.Prompt {
119
124
  // Editing Active Field
120
125
  const activeField = this.options.fields[this.activeIndex];
121
126
  const val = this.values[activeField.name];
122
- if (char === '\u0008' || char === '\x7f') { // Backspace
127
+ if (char === '\u0008' || char === '\x7f') {
123
128
  if (this.cursor > 0) {
124
129
  const pre = val.slice(0, this.cursor - 1);
125
130
  const post = val.slice(this.cursor);
@@ -131,14 +136,12 @@ class FormPrompt extends base_1.Prompt {
131
136
  }
132
137
  // Left/Right arrow to move cursor within field
133
138
  if (this.isLeft(char)) {
134
- if (this.cursor > 0)
135
- this.cursor--;
139
+ if (this.cursor > 0) this.cursor--;
136
140
  this.render(false);
137
141
  return;
138
142
  }
139
143
  if (this.isRight(char)) {
140
- if (this.cursor < val.length)
141
- this.cursor++;
144
+ if (this.cursor < val.length) this.cursor++;
142
145
  this.render(false);
143
146
  return;
144
147
  }
@@ -157,8 +160,7 @@ class FormPrompt extends base_1.Prompt {
157
160
  if (event.scroll === 'up') {
158
161
  this.validateCurrentField();
159
162
  this.moveFocus(-1);
160
- }
161
- else if (event.scroll === 'down') {
163
+ } else if (event.scroll === 'down') {
162
164
  this.validateCurrentField();
163
165
  this.moveFocus(1);
164
166
  }
@@ -184,8 +186,7 @@ class FormPrompt extends base_1.Prompt {
184
186
  this.render(false);
185
187
  return false;
186
188
  }
187
- }
188
- catch (err) {
189
+ } catch (err) {
189
190
  this.fieldErrors[field.name] = err.message || 'Validation failed';
190
191
  this.render(false);
191
192
  return false;
@@ -207,26 +208,34 @@ class FormPrompt extends base_1.Prompt {
207
208
  this.globalError = '';
208
209
  // Validate all fields
209
210
  let allValid = true;
210
- for (const field of this.options.fields) {
211
+ for (const field of this.options.fields){
211
212
  const val = this.values[field.name];
212
213
  if (field.validate) {
213
214
  const res = await field.validate(val);
214
215
  if (res !== true) {
215
216
  this.fieldErrors[field.name] = typeof res === 'string' ? res : 'Invalid value';
216
217
  allValid = false;
217
- }
218
- else {
218
+ } else {
219
219
  delete this.fieldErrors[field.name];
220
220
  }
221
221
  }
222
222
  }
223
223
  if (allValid) {
224
224
  this.submit(this.values);
225
- }
226
- else {
225
+ } else {
227
226
  this.globalError = 'Please fix errors before submitting.';
228
227
  this.render(false);
229
228
  }
230
229
  }
231
- }
232
- exports.FormPrompt = FormPrompt;
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
@@ -0,0 +1 @@
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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"}