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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/dist/ansi.d.ts +36 -0
  2. package/dist/ansi.js +1 -0
  3. package/dist/base.d.ts +60 -0
  4. package/dist/base.js +1 -0
  5. package/dist/{src/core.js → core.d.ts} +175 -345
  6. package/dist/core.js +1 -0
  7. package/dist/data/countries.d.ts +2 -0
  8. package/dist/data/countries.js +1 -0
  9. package/dist/data/licenses.d.ts +2 -0
  10. package/dist/data/licenses.js +1 -0
  11. package/dist/highlight.d.ts +7 -0
  12. package/dist/highlight.js +1 -0
  13. package/dist/index.d.ts +48 -0
  14. package/dist/index.js +1 -0
  15. package/dist/input.d.ts +14 -0
  16. package/dist/input.js +1 -0
  17. package/dist/pipeline.d.ts +90 -0
  18. package/dist/pipeline.js +1 -0
  19. package/dist/prompts/autocomplete.d.ts +22 -0
  20. package/dist/prompts/autocomplete.js +1 -0
  21. package/dist/prompts/box.d.ts +21 -0
  22. package/dist/prompts/box.js +4 -0
  23. package/dist/prompts/breadcrumb-search.d.ts +14 -0
  24. package/dist/prompts/breadcrumb-search.js +2 -0
  25. package/dist/prompts/breadcrumb.d.ts +32 -0
  26. package/dist/prompts/breadcrumb.js +3 -0
  27. package/dist/prompts/byte.d.ts +13 -0
  28. package/dist/prompts/byte.js +5 -0
  29. package/dist/prompts/calculator.d.ts +17 -0
  30. package/dist/prompts/calculator.js +3 -0
  31. package/dist/prompts/calendar.d.ts +33 -0
  32. package/dist/prompts/calendar.js +3 -0
  33. package/dist/prompts/checkbox.d.ts +13 -0
  34. package/dist/prompts/checkbox.js +2 -0
  35. package/dist/prompts/code.d.ts +19 -0
  36. package/dist/prompts/code.js +4 -0
  37. package/dist/prompts/color.d.ts +14 -0
  38. package/dist/prompts/color.js +10 -0
  39. package/dist/prompts/confirm.d.ts +8 -0
  40. package/dist/prompts/confirm.js +1 -0
  41. package/dist/prompts/connection-string.d.ts +18 -0
  42. package/dist/prompts/connection-string.js +1 -0
  43. package/dist/prompts/cron.d.ts +13 -0
  44. package/dist/prompts/cron.js +4 -0
  45. package/dist/prompts/curl-utils.d.ts +25 -0
  46. package/dist/prompts/curl-utils.js +1 -0
  47. package/dist/prompts/curl.d.ts +41 -0
  48. package/dist/prompts/curl.js +12 -0
  49. package/dist/prompts/data-inspector.d.ts +22 -0
  50. package/dist/prompts/data-inspector.js +5 -0
  51. package/dist/prompts/date.d.ts +12 -0
  52. package/dist/prompts/date.js +2 -0
  53. package/dist/prompts/dependency.d.ts +16 -0
  54. package/dist/prompts/dependency.js +3 -0
  55. package/dist/prompts/dial.d.ts +10 -0
  56. package/dist/prompts/dial.js +3 -0
  57. package/dist/prompts/diff.d.ts +10 -0
  58. package/dist/prompts/diff.js +10 -0
  59. package/dist/prompts/draw.d.ts +20 -0
  60. package/dist/prompts/draw.js +6 -0
  61. package/dist/prompts/editor.d.ts +14 -0
  62. package/dist/prompts/editor.js +2 -0
  63. package/dist/prompts/emoji.d.ts +18 -0
  64. package/dist/prompts/emoji.js +5 -0
  65. package/dist/prompts/exec.d.ts +17 -0
  66. package/dist/prompts/exec.js +1 -0
  67. package/dist/prompts/file.d.ts +21 -0
  68. package/dist/prompts/file.js +2 -0
  69. package/dist/prompts/form.d.ts +18 -0
  70. package/dist/prompts/form.js +1 -0
  71. package/dist/prompts/fuzzy-multi-column.d.ts +12 -0
  72. package/dist/prompts/fuzzy-multi-column.js +2 -0
  73. package/dist/prompts/fuzzy.d.ts +12 -0
  74. package/dist/prompts/fuzzy.js +2 -0
  75. package/dist/prompts/gauge.d.ts +21 -0
  76. package/dist/prompts/gauge.js +4 -0
  77. package/dist/prompts/grid.d.ts +14 -0
  78. package/dist/prompts/grid.js +2 -0
  79. package/dist/prompts/heatmap.d.ts +13 -0
  80. package/dist/prompts/heatmap.js +2 -0
  81. package/dist/prompts/ip.d.ts +11 -0
  82. package/dist/prompts/ip.js +3 -0
  83. package/dist/prompts/kanban.d.ts +17 -0
  84. package/dist/prompts/kanban.js +4 -0
  85. package/dist/prompts/keypress.d.ts +7 -0
  86. package/dist/prompts/keypress.js +1 -0
  87. package/dist/prompts/license.d.ts +9 -0
  88. package/dist/prompts/license.js +13 -0
  89. package/dist/prompts/list.d.ts +9 -0
  90. package/dist/prompts/list.js +1 -0
  91. package/dist/prompts/map.d.ts +17 -0
  92. package/dist/prompts/map.js +5 -0
  93. package/dist/prompts/match.d.ts +19 -0
  94. package/dist/prompts/match.js +7 -0
  95. package/dist/prompts/miller.d.ts +15 -0
  96. package/dist/prompts/miller.js +2 -0
  97. package/dist/prompts/multi-column-select.d.ts +10 -0
  98. package/dist/prompts/multi-column-select.js +2 -0
  99. package/dist/prompts/multi-range.d.ts +9 -0
  100. package/dist/prompts/multi-range.js +3 -0
  101. package/dist/prompts/multi-select.d.ts +15 -0
  102. package/dist/prompts/multi-select.js +4 -0
  103. package/dist/prompts/number.d.ts +11 -0
  104. package/dist/prompts/number.js +2 -0
  105. package/dist/prompts/otp.d.ts +10 -0
  106. package/dist/prompts/otp.js +2 -0
  107. package/dist/prompts/pattern.d.ts +22 -0
  108. package/dist/prompts/pattern.js +4 -0
  109. package/dist/prompts/phone.d.ts +41 -0
  110. package/dist/prompts/phone.js +3 -0
  111. package/dist/prompts/quiz-select.d.ts +10 -0
  112. package/dist/prompts/quiz-select.js +7 -0
  113. package/dist/prompts/quiz-text.d.ts +11 -0
  114. package/dist/prompts/quiz-text.js +8 -0
  115. package/dist/prompts/range.d.ts +9 -0
  116. package/dist/prompts/range.js +1 -0
  117. package/dist/prompts/rating.d.ts +8 -0
  118. package/dist/prompts/rating.js +1 -0
  119. package/dist/prompts/regex.d.ts +13 -0
  120. package/dist/prompts/regex.js +5 -0
  121. package/dist/prompts/region.d.ts +11 -0
  122. package/dist/prompts/region.js +5 -0
  123. package/dist/prompts/schedule.d.ts +20 -0
  124. package/dist/prompts/schedule.js +5 -0
  125. package/dist/prompts/scroll.d.ts +13 -0
  126. package/dist/prompts/scroll.js +1 -0
  127. package/dist/prompts/seat.d.ts +17 -0
  128. package/dist/prompts/seat.js +5 -0
  129. package/dist/prompts/select-range.d.ts +8 -0
  130. package/dist/prompts/select-range.js +3 -0
  131. package/dist/prompts/select.d.ts +15 -0
  132. package/dist/prompts/select.js +2 -0
  133. package/dist/prompts/semver.d.ts +6 -0
  134. package/dist/prompts/semver.js +1 -0
  135. package/dist/prompts/shortcut.d.ts +9 -0
  136. package/dist/prompts/shortcut.js +1 -0
  137. package/dist/prompts/slider.d.ts +8 -0
  138. package/dist/prompts/slider.js +1 -0
  139. package/dist/prompts/slot.d.ts +16 -0
  140. package/dist/prompts/slot.js +8 -0
  141. package/dist/prompts/snippet.d.ts +19 -0
  142. package/dist/prompts/snippet.js +4 -0
  143. package/dist/prompts/sort-grid.d.ts +16 -0
  144. package/dist/prompts/sort-grid.js +2 -0
  145. package/dist/prompts/sort.d.ts +14 -0
  146. package/dist/prompts/sort.js +2 -0
  147. package/dist/prompts/spam.d.ts +17 -0
  148. package/dist/prompts/spam.js +2 -0
  149. package/dist/prompts/spreadsheet.d.ts +21 -0
  150. package/dist/prompts/spreadsheet.js +7 -0
  151. package/dist/prompts/table.d.ts +14 -0
  152. package/dist/prompts/table.js +3 -0
  153. package/dist/prompts/text.d.ts +17 -0
  154. package/dist/prompts/text.js +2 -0
  155. package/dist/prompts/time.d.ts +12 -0
  156. package/dist/prompts/time.js +2 -0
  157. package/dist/prompts/toggle.d.ts +8 -0
  158. package/dist/prompts/toggle.js +1 -0
  159. package/dist/prompts/transfer.d.ts +18 -0
  160. package/dist/prompts/transfer.js +5 -0
  161. package/dist/prompts/tree-select.d.ts +31 -0
  162. package/dist/prompts/tree-select.js +3 -0
  163. package/dist/prompts/tree.d.ts +20 -0
  164. package/dist/prompts/tree.js +3 -0
  165. package/dist/prompts/wait.d.ts +18 -0
  166. package/dist/prompts/wait.js +1 -0
  167. package/dist/spinner.d.ts +33 -0
  168. package/dist/spinner.js +3 -0
  169. package/dist/symbols.d.ts +33 -0
  170. package/dist/symbols.js +1 -0
  171. package/dist/tasks.d.ts +57 -0
  172. package/dist/tasks.js +1 -0
  173. package/dist/theme.d.ts +2 -0
  174. package/dist/theme.js +1 -0
  175. package/dist/types.d.ts +503 -0
  176. package/dist/types.js +1 -0
  177. package/dist/utils.d.ts +81 -0
  178. package/dist/utils.js +1 -0
  179. package/package.json +8 -9
  180. package/dist/src/ansi.js +0 -50
  181. package/dist/src/ansi.js.map +0 -1
  182. package/dist/src/base.js +0 -258
  183. package/dist/src/base.js.map +0 -1
  184. package/dist/src/core.js.map +0 -1
  185. package/dist/src/data/countries.js +0 -569
  186. package/dist/src/data/countries.js.map +0 -1
  187. package/dist/src/data/licenses.js +0 -480
  188. package/dist/src/data/licenses.js.map +0 -1
  189. package/dist/src/highlight.js +0 -185
  190. package/dist/src/highlight.js.map +0 -1
  191. package/dist/src/index.js +0 -66
  192. package/dist/src/index.js.map +0 -1
  193. package/dist/src/input.js +0 -158
  194. package/dist/src/input.js.map +0 -1
  195. package/dist/src/pipeline.js +0 -273
  196. package/dist/src/pipeline.js.map +0 -1
  197. package/dist/src/prompts/autocomplete.js +0 -171
  198. package/dist/src/prompts/autocomplete.js.map +0 -1
  199. package/dist/src/prompts/box.js +0 -225
  200. package/dist/src/prompts/box.js.map +0 -1
  201. package/dist/src/prompts/breadcrumb-search.js +0 -260
  202. package/dist/src/prompts/breadcrumb-search.js.map +0 -1
  203. package/dist/src/prompts/breadcrumb.js +0 -307
  204. package/dist/src/prompts/breadcrumb.js.map +0 -1
  205. package/dist/src/prompts/byte.js +0 -176
  206. package/dist/src/prompts/byte.js.map +0 -1
  207. package/dist/src/prompts/calculator.js +0 -243
  208. package/dist/src/prompts/calculator.js.map +0 -1
  209. package/dist/src/prompts/calendar.js +0 -430
  210. package/dist/src/prompts/calendar.js.map +0 -1
  211. package/dist/src/prompts/checkbox.js +0 -159
  212. package/dist/src/prompts/checkbox.js.map +0 -1
  213. package/dist/src/prompts/code.js +0 -271
  214. package/dist/src/prompts/code.js.map +0 -1
  215. package/dist/src/prompts/color.js +0 -165
  216. package/dist/src/prompts/color.js.map +0 -1
  217. package/dist/src/prompts/confirm.js +0 -55
  218. package/dist/src/prompts/confirm.js.map +0 -1
  219. package/dist/src/prompts/connection-string.js +0 -120
  220. package/dist/src/prompts/connection-string.js.map +0 -1
  221. package/dist/src/prompts/cron.js +0 -207
  222. package/dist/src/prompts/cron.js.map +0 -1
  223. package/dist/src/prompts/curl-utils.js +0 -71
  224. package/dist/src/prompts/curl-utils.js.map +0 -1
  225. package/dist/src/prompts/curl.js +0 -431
  226. package/dist/src/prompts/curl.js.map +0 -1
  227. package/dist/src/prompts/data-inspector.js +0 -261
  228. package/dist/src/prompts/data-inspector.js.map +0 -1
  229. package/dist/src/prompts/date.js +0 -185
  230. package/dist/src/prompts/date.js.map +0 -1
  231. package/dist/src/prompts/dependency.js +0 -283
  232. package/dist/src/prompts/dependency.js.map +0 -1
  233. package/dist/src/prompts/dial.js +0 -124
  234. package/dist/src/prompts/dial.js.map +0 -1
  235. package/dist/src/prompts/diff.js +0 -118
  236. package/dist/src/prompts/diff.js.map +0 -1
  237. package/dist/src/prompts/draw.js +0 -191
  238. package/dist/src/prompts/draw.js.map +0 -1
  239. package/dist/src/prompts/editor.js +0 -234
  240. package/dist/src/prompts/editor.js.map +0 -1
  241. package/dist/src/prompts/emoji.js +0 -226
  242. package/dist/src/prompts/emoji.js.map +0 -1
  243. package/dist/src/prompts/exec.js +0 -151
  244. package/dist/src/prompts/exec.js.map +0 -1
  245. package/dist/src/prompts/file.js +0 -217
  246. package/dist/src/prompts/file.js.map +0 -1
  247. package/dist/src/prompts/form.js +0 -241
  248. package/dist/src/prompts/form.js.map +0 -1
  249. package/dist/src/prompts/fuzzy-multi-column.js +0 -161
  250. package/dist/src/prompts/fuzzy-multi-column.js.map +0 -1
  251. package/dist/src/prompts/fuzzy.js +0 -147
  252. package/dist/src/prompts/fuzzy.js.map +0 -1
  253. package/dist/src/prompts/gauge.js +0 -137
  254. package/dist/src/prompts/gauge.js.map +0 -1
  255. package/dist/src/prompts/grid.js +0 -191
  256. package/dist/src/prompts/grid.js.map +0 -1
  257. package/dist/src/prompts/heatmap.js +0 -147
  258. package/dist/src/prompts/heatmap.js.map +0 -1
  259. package/dist/src/prompts/ip.js +0 -138
  260. package/dist/src/prompts/ip.js.map +0 -1
  261. package/dist/src/prompts/kanban.js +0 -233
  262. package/dist/src/prompts/kanban.js.map +0 -1
  263. package/dist/src/prompts/keypress.js +0 -54
  264. package/dist/src/prompts/keypress.js.map +0 -1
  265. package/dist/src/prompts/license.js +0 -144
  266. package/dist/src/prompts/license.js.map +0 -1
  267. package/dist/src/prompts/list.js +0 -124
  268. package/dist/src/prompts/list.js.map +0 -1
  269. package/dist/src/prompts/map.js +0 -262
  270. package/dist/src/prompts/map.js.map +0 -1
  271. package/dist/src/prompts/match.js +0 -271
  272. package/dist/src/prompts/match.js.map +0 -1
  273. package/dist/src/prompts/miller.js +0 -228
  274. package/dist/src/prompts/miller.js.map +0 -1
  275. package/dist/src/prompts/multi-column-select.js +0 -176
  276. package/dist/src/prompts/multi-column-select.js.map +0 -1
  277. package/dist/src/prompts/multi-range.js +0 -189
  278. package/dist/src/prompts/multi-range.js.map +0 -1
  279. package/dist/src/prompts/multi-select.js +0 -183
  280. package/dist/src/prompts/multi-select.js.map +0 -1
  281. package/dist/src/prompts/number.js +0 -166
  282. package/dist/src/prompts/number.js.map +0 -1
  283. package/dist/src/prompts/otp.js +0 -107
  284. package/dist/src/prompts/otp.js.map +0 -1
  285. package/dist/src/prompts/pattern.js +0 -252
  286. package/dist/src/prompts/pattern.js.map +0 -1
  287. package/dist/src/prompts/phone.js +0 -398
  288. package/dist/src/prompts/phone.js.map +0 -1
  289. package/dist/src/prompts/quiz-select.js +0 -114
  290. package/dist/src/prompts/quiz-select.js.map +0 -1
  291. package/dist/src/prompts/quiz-text.js +0 -98
  292. package/dist/src/prompts/quiz-text.js.map +0 -1
  293. package/dist/src/prompts/range.js +0 -164
  294. package/dist/src/prompts/range.js.map +0 -1
  295. package/dist/src/prompts/rating.js +0 -83
  296. package/dist/src/prompts/rating.js.map +0 -1
  297. package/dist/src/prompts/regex.js +0 -145
  298. package/dist/src/prompts/regex.js.map +0 -1
  299. package/dist/src/prompts/region.js +0 -170
  300. package/dist/src/prompts/region.js.map +0 -1
  301. package/dist/src/prompts/schedule.js +0 -270
  302. package/dist/src/prompts/schedule.js.map +0 -1
  303. package/dist/src/prompts/scroll.js +0 -155
  304. package/dist/src/prompts/scroll.js.map +0 -1
  305. package/dist/src/prompts/seat.js +0 -164
  306. package/dist/src/prompts/seat.js.map +0 -1
  307. package/dist/src/prompts/select-range.js +0 -148
  308. package/dist/src/prompts/select-range.js.map +0 -1
  309. package/dist/src/prompts/select.js +0 -163
  310. package/dist/src/prompts/select.js.map +0 -1
  311. package/dist/src/prompts/semver.js +0 -43
  312. package/dist/src/prompts/semver.js.map +0 -1
  313. package/dist/src/prompts/shortcut.js +0 -133
  314. package/dist/src/prompts/shortcut.js.map +0 -1
  315. package/dist/src/prompts/slider.js +0 -69
  316. package/dist/src/prompts/slider.js.map +0 -1
  317. package/dist/src/prompts/slot.js +0 -117
  318. package/dist/src/prompts/slot.js.map +0 -1
  319. package/dist/src/prompts/snippet.js +0 -228
  320. package/dist/src/prompts/snippet.js.map +0 -1
  321. package/dist/src/prompts/sort-grid.js +0 -151
  322. package/dist/src/prompts/sort-grid.js.map +0 -1
  323. package/dist/src/prompts/sort.js +0 -166
  324. package/dist/src/prompts/sort.js.map +0 -1
  325. package/dist/src/prompts/spam.js +0 -80
  326. package/dist/src/prompts/spam.js.map +0 -1
  327. package/dist/src/prompts/spreadsheet.js +0 -240
  328. package/dist/src/prompts/spreadsheet.js.map +0 -1
  329. package/dist/src/prompts/table.js +0 -120
  330. package/dist/src/prompts/table.js.map +0 -1
  331. package/dist/src/prompts/text.js +0 -317
  332. package/dist/src/prompts/text.js.map +0 -1
  333. package/dist/src/prompts/time.js +0 -211
  334. package/dist/src/prompts/time.js.map +0 -1
  335. package/dist/src/prompts/toggle.js +0 -53
  336. package/dist/src/prompts/toggle.js.map +0 -1
  337. package/dist/src/prompts/transfer.js +0 -207
  338. package/dist/src/prompts/transfer.js.map +0 -1
  339. package/dist/src/prompts/tree-select.js +0 -270
  340. package/dist/src/prompts/tree-select.js.map +0 -1
  341. package/dist/src/prompts/tree.js +0 -233
  342. package/dist/src/prompts/tree.js.map +0 -1
  343. package/dist/src/prompts/wait.js +0 -79
  344. package/dist/src/prompts/wait.js.map +0 -1
  345. package/dist/src/spinner.js +0 -105
  346. package/dist/src/spinner.js.map +0 -1
  347. package/dist/src/symbols.js +0 -66
  348. package/dist/src/symbols.js.map +0 -1
  349. package/dist/src/tasks.js +0 -231
  350. package/dist/src/tasks.js.map +0 -1
  351. package/dist/src/theme.js +0 -29
  352. package/dist/src/theme.js.map +0 -1
  353. package/dist/src/types.js +0 -8
  354. package/dist/src/types.js.map +0 -1
  355. package/dist/src/utils.js +0 -480
  356. package/dist/src/utils.js.map +0 -1
@@ -1,317 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "TextPrompt", {
6
- enumerable: true,
7
- get: function() {
8
- return TextPrompt;
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 TextPrompt = class TextPrompt extends _base.Prompt {
30
- triggerSuggest() {
31
- if (!this.options.suggest || this.cursor !== this.segments.length) {
32
- this.ghost = '';
33
- return;
34
- }
35
- const currentValue = this.segments.join('');
36
- const result = this.options.suggest(currentValue);
37
- if (result instanceof Promise) {
38
- result.then((suggestion)=>{
39
- // Check if value is still the same (avoid race condition)
40
- if (this.segments.join('') === currentValue) {
41
- if (suggestion.startsWith(currentValue) && suggestion.length > currentValue.length) {
42
- this.ghost = suggestion.slice(currentValue.length);
43
- } else {
44
- this.ghost = '';
45
- }
46
- this.render(false);
47
- }
48
- });
49
- } else {
50
- if (result.startsWith(currentValue) && result.length > currentValue.length) {
51
- this.ghost = result.slice(currentValue.length);
52
- } else {
53
- this.ghost = '';
54
- }
55
- // render will be called by the caller of triggerSuggest usually, but here we might need to ensure it
56
- }
57
- }
58
- render(firstRender) {
59
- if (!firstRender && this.lastLinesUp > 0) {
60
- this.print(`\x1b[${this.lastLinesUp}B`);
61
- }
62
- this.lastLinesUp = 0;
63
- // Calculate available width
64
- // 1. Prepare Prompt Label
65
- const icon = this.errorMsg ? `${_theme.theme.error}${_symbols.symbols.cross}` : `${_theme.theme.success}?`;
66
- const hint = this.options.multiline ? ` ${_theme.theme.muted}(Press Ctrl+D to submit)${_ansi.ANSI.RESET}` : '';
67
- const prefix = `${icon} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}${hint} `;
68
- // We need visual length of prefix to calculate available space for input on the first line
69
- const prefixVisualLen = this.stripAnsi(prefix).length;
70
- // 2. Prepare Value Display
71
- let displayValueLines = [];
72
- let cursorRelativeRow = 0;
73
- let cursorRelativeCol = 0; // Visual column index
74
- // Reconstruct value from segments for logic that needs raw string
75
- this.value = this.segments.join('');
76
- if (this.segments.length === 0 && this.options.placeholder && !this.errorMsg && !this.hasTyped) {
77
- // Placeholder case
78
- const placeholder = `${_theme.theme.muted}${this.options.placeholder}${_ansi.ANSI.RESET}`;
79
- displayValueLines = [
80
- placeholder
81
- ];
82
- cursorRelativeRow = 0;
83
- cursorRelativeCol = 0;
84
- } else {
85
- const maskChar = this.options.mask ?? (this.options.isPassword ? '*' : undefined);
86
- // Note: password masking replaces each grapheme with '*'
87
- // Split by lines (for multiline support)
88
- // Determine which line the cursor is on
89
- // We need to map 'cursor' (segments index) to line/col.
90
- // This is tricky because segments might contain '\n'.
91
- // safeSplit treats '\n' as a segment.
92
- let cursorLineIndex = 0;
93
- // Let's iterate segments to find cursor position (row, col)
94
- cursorLineIndex = 0;
95
- // If we want visual cursor position, we need visual width of segments.
96
- let visualColIndex = 0;
97
- for(let i = 0; i < this.cursor; i++){
98
- const seg = this.segments[i];
99
- if (seg === '\n') {
100
- cursorLineIndex++;
101
- visualColIndex = 0;
102
- } else {
103
- if (maskChar !== undefined) {
104
- visualColIndex += maskChar.length;
105
- } else {
106
- visualColIndex += this.getSegmentWidth(seg);
107
- }
108
- }
109
- }
110
- cursorRelativeRow = cursorLineIndex;
111
- cursorRelativeCol = visualColIndex;
112
- // Now prepare lines for display (scrolling/truncation)
113
- // We need to reconstruct lines from segments to apply styling/truncation logic per line.
114
- let currentLineSegments = [];
115
- const processedLines = []; // Array of segment arrays
116
- for (const seg of this.segments){
117
- if (seg === '\n') {
118
- processedLines.push(currentLineSegments);
119
- currentLineSegments = [];
120
- } else {
121
- currentLineSegments.push(seg);
122
- }
123
- }
124
- processedLines.push(currentLineSegments); // Last line
125
- processedLines.forEach((lineSegs)=>{
126
- // Reconstruct line string for display calculation
127
- // If password, join with *?
128
- let visibleLine = '';
129
- if (maskChar !== undefined) {
130
- visibleLine = maskChar.repeat(lineSegs.length);
131
- } else {
132
- visibleLine = lineSegs.join('');
133
- }
134
- displayValueLines.push(_theme.theme.main + visibleLine + _ansi.ANSI.RESET);
135
- });
136
- // Append ghost text if applicable
137
- if (this.ghost && this.cursor === this.segments.length && displayValueLines.length > 0) {
138
- displayValueLines[displayValueLines.length - 1] += _theme.theme.muted + this.ghost + _ansi.ANSI.RESET;
139
- }
140
- }
141
- // 3. Assemble Output
142
- let output = '';
143
- displayValueLines.forEach((lineStr, idx)=>{
144
- if (idx === 0) {
145
- output += prefix + lineStr;
146
- } else {
147
- output += '\n' + lineStr;
148
- }
149
- });
150
- if (this.errorMsg) {
151
- output += `\n${_theme.theme.error}>> ${this.errorMsg}${_ansi.ANSI.RESET}`;
152
- }
153
- // 4. Render Frame
154
- this.renderFrame(output);
155
- this.print(_ansi.ANSI.SHOW_CURSOR);
156
- // 5. Move Cursor
157
- const errorOffset = this.errorMsg ? 1 : 0;
158
- const totalRows = displayValueLines.length + errorOffset;
159
- const linesUp = totalRows - 1 - cursorRelativeRow;
160
- if (linesUp > 0) {
161
- this.print(`\x1b[${linesUp}A`);
162
- }
163
- this.lastLinesUp = linesUp;
164
- let targetCol = 0;
165
- if (cursorRelativeRow === 0) {
166
- targetCol = prefixVisualLen + cursorRelativeCol;
167
- } else {
168
- targetCol = cursorRelativeCol;
169
- }
170
- this.print(_ansi.ANSI.CURSOR_LEFT);
171
- if (targetCol > 0) {
172
- this.print(`\x1b[${targetCol}C`);
173
- }
174
- }
175
- // Helper to get width of a segment
176
- getSegmentWidth(seg) {
177
- return (0, _utils.stringWidth)(seg);
178
- }
179
- cleanup() {
180
- if (this.lastLinesUp > 0) {
181
- this.print(`\x1b[${this.lastLinesUp}B`);
182
- this.lastLinesUp = 0;
183
- }
184
- super.cleanup();
185
- }
186
- handleInput(char) {
187
- // Tab (Accept Suggestion)
188
- if (char === '\t') {
189
- if (this.ghost) {
190
- const ghostSegments = (0, _utils.safeSplit)(this.ghost);
191
- this.segments.splice(this.cursor, 0, ...ghostSegments);
192
- this.cursor += ghostSegments.length;
193
- this.ghost = '';
194
- this.errorMsg = '';
195
- this.triggerSuggest(); // Maybe fetch next suggestion?
196
- this.render(false);
197
- }
198
- return;
199
- }
200
- // Enter
201
- if (char === '\r' || char === '\n') {
202
- if (this.options.multiline) {
203
- // Insert newline segment
204
- this.segments.splice(this.cursor, 0, '\n');
205
- this.cursor++;
206
- this.render(false);
207
- return;
208
- }
209
- this.validateAndSubmit();
210
- return;
211
- }
212
- // Ctrl+D / Ctrl+S
213
- if (this.options.multiline && (char === '\u0004' || char === '\u0013')) {
214
- this.validateAndSubmit();
215
- return;
216
- }
217
- // Backspace
218
- if (char === '\u0008' || char === '\x7f') {
219
- this.hasTyped = true;
220
- if (this.cursor > 0) {
221
- // Remove segment at cursor - 1
222
- this.segments.splice(this.cursor - 1, 1);
223
- this.cursor--;
224
- this.errorMsg = '';
225
- this.triggerSuggest();
226
- this.render(false);
227
- }
228
- return;
229
- }
230
- // Arrow Left
231
- if (this.isLeft(char)) {
232
- if (this.cursor > 0) {
233
- this.cursor--;
234
- this.render(false);
235
- }
236
- return;
237
- }
238
- // Arrow Right
239
- if (this.isRight(char)) {
240
- if (this.cursor < this.segments.length) {
241
- this.cursor++;
242
- this.render(false);
243
- }
244
- return;
245
- }
246
- // Delete key
247
- if (char === '\u001b[3~') {
248
- this.hasTyped = true;
249
- if (this.cursor < this.segments.length) {
250
- this.segments.splice(this.cursor, 1);
251
- this.errorMsg = '';
252
- this.triggerSuggest();
253
- this.render(false);
254
- }
255
- return;
256
- }
257
- // Regular Typing & Paste
258
- // safeSplit the input char(s) - could be pasted text
259
- if (!/^[\x00-\x1F]/.test(char) && !char.startsWith('\x1b')) {
260
- this.hasTyped = true;
261
- const newSegments = (0, _utils.safeSplit)(char);
262
- this.segments.splice(this.cursor, 0, ...newSegments);
263
- this.cursor += newSegments.length;
264
- this.errorMsg = '';
265
- this.triggerSuggest();
266
- this.render(false);
267
- }
268
- }
269
- validateAndSubmit() {
270
- this.value = this.segments.join('');
271
- if (this.options.validate) {
272
- const result = this.options.validate(this.value);
273
- if (result instanceof Promise) {
274
- this.errorMsg = 'Validating...';
275
- this.render(false);
276
- result.then((valid)=>{
277
- if (typeof valid === 'string' && valid.length > 0) {
278
- this.errorMsg = valid;
279
- this.render(false);
280
- } else if (valid === false) {
281
- this.errorMsg = 'Invalid input';
282
- this.render(false);
283
- } else {
284
- this.errorMsg = '';
285
- this.render(false);
286
- this.submit(this.value);
287
- }
288
- }).catch((err)=>{
289
- this.errorMsg = err.message || 'Validation failed';
290
- this.render(false);
291
- });
292
- return;
293
- }
294
- if (typeof result === 'string' && result.length > 0) {
295
- this.errorMsg = result;
296
- this.render(false);
297
- return;
298
- }
299
- if (result === false) {
300
- this.errorMsg = 'Invalid input';
301
- this.render(false);
302
- return;
303
- }
304
- }
305
- this.submit(this.value);
306
- }
307
- constructor(options){
308
- super(options), _define_property(this, "errorMsg", ''), // cursor is now an index into the grapheme segments array
309
- _define_property(this, "cursor", 0), _define_property(this, "hasTyped", false), _define_property(this, "segments", []), _define_property(this, "lastLinesUp", 0), _define_property(this, "ghost", '');
310
- this.value = options.initial || '';
311
- // Initialize segments from value
312
- this.segments = (0, _utils.safeSplit)(this.value);
313
- this.cursor = this.segments.length;
314
- }
315
- };
316
-
317
- //# sourceMappingURL=text.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/prompts/text.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { TextOptions } from '../types';\nimport { safeSplit, stringWidth } from '../utils';\n\n// --- Implementation: Text Prompt ---\nexport class TextPrompt<O extends TextOptions = TextOptions> extends Prompt<string, O> {\n protected errorMsg: string = '';\n // cursor is now an index into the grapheme segments array\n protected cursor: number = 0;\n protected hasTyped: boolean = false;\n protected segments: string[] = [];\n protected lastLinesUp: number = 0;\n private ghost: string = '';\n\n constructor(options: O) {\n super(options);\n this.value = options.initial || '';\n // Initialize segments from value\n this.segments = safeSplit(this.value);\n this.cursor = this.segments.length;\n }\n\n private triggerSuggest() {\n if (!this.options.suggest || this.cursor !== this.segments.length) {\n this.ghost = '';\n return;\n }\n\n const currentValue = this.segments.join('');\n const result = this.options.suggest(currentValue);\n\n if (result instanceof Promise) {\n result.then(suggestion => {\n // Check if value is still the same (avoid race condition)\n if (this.segments.join('') === currentValue) {\n if (suggestion.startsWith(currentValue) && suggestion.length > currentValue.length) {\n this.ghost = suggestion.slice(currentValue.length);\n } else {\n this.ghost = '';\n }\n this.render(false);\n }\n });\n } else {\n if (result.startsWith(currentValue) && result.length > currentValue.length) {\n this.ghost = result.slice(currentValue.length);\n } else {\n this.ghost = '';\n }\n // render will be called by the caller of triggerSuggest usually, but here we might need to ensure it\n }\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 // Calculate available width\n // 1. Prepare Prompt Label\n const icon = this.errorMsg ? `${theme.error}${symbols.cross}` : `${theme.success}?`;\n const hint = this.options.multiline ? ` ${theme.muted}(Press Ctrl+D to submit)${ANSI.RESET}` : '';\n const prefix = `${icon} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}${hint} `;\n\n // We need visual length of prefix to calculate available space for input on the first line\n const prefixVisualLen = this.stripAnsi(prefix).length;\n\n // 2. Prepare Value Display\n let displayValueLines: string[] = [];\n let cursorRelativeRow = 0;\n let cursorRelativeCol = 0; // Visual column index\n\n // Reconstruct value from segments for logic that needs raw string\n this.value = this.segments.join('');\n\n if (this.segments.length === 0 && this.options.placeholder && !this.errorMsg && !this.hasTyped) {\n // Placeholder case\n const placeholder = `${theme.muted}${this.options.placeholder}${ANSI.RESET}`;\n displayValueLines = [placeholder];\n cursorRelativeRow = 0;\n cursorRelativeCol = 0;\n } else {\n const maskChar = this.options.mask ?? (this.options.isPassword ? '*' : undefined);\n // Note: password masking replaces each grapheme with '*'\n\n // Split by lines (for multiline support)\n\n // Determine which line the cursor is on\n // We need to map 'cursor' (segments index) to line/col.\n // This is tricky because segments might contain '\\n'.\n // safeSplit treats '\\n' as a segment.\n\n let cursorLineIndex = 0;\n\n // Let's iterate segments to find cursor position (row, col)\n cursorLineIndex = 0;\n // If we want visual cursor position, we need visual width of segments.\n let visualColIndex = 0;\n\n for (let i = 0; i < this.cursor; i++) {\n const seg = this.segments[i];\n if (seg === '\\n') {\n cursorLineIndex++;\n visualColIndex = 0;\n } else {\n if (maskChar !== undefined) {\n visualColIndex += maskChar.length;\n } else {\n visualColIndex += this.getSegmentWidth(seg);\n }\n }\n }\n\n cursorRelativeRow = cursorLineIndex;\n cursorRelativeCol = visualColIndex;\n\n // Now prepare lines for display (scrolling/truncation)\n // We need to reconstruct lines from segments to apply styling/truncation logic per line.\n\n let currentLineSegments: string[] = [];\n const processedLines: string[][] = []; // Array of segment arrays\n\n for (const seg of this.segments) {\n if (seg === '\\n') {\n processedLines.push(currentLineSegments);\n currentLineSegments = [];\n } else {\n currentLineSegments.push(seg);\n }\n }\n processedLines.push(currentLineSegments); // Last line\n\n processedLines.forEach((lineSegs: string[]) => {\n\n // Reconstruct line string for display calculation\n // If password, join with *?\n let visibleLine = '';\n if (maskChar !== undefined) {\n visibleLine = maskChar.repeat(lineSegs.length);\n } else {\n visibleLine = lineSegs.join('');\n }\n\n displayValueLines.push(theme.main + visibleLine + ANSI.RESET);\n });\n\n // Append ghost text if applicable\n if (this.ghost && this.cursor === this.segments.length && displayValueLines.length > 0) {\n displayValueLines[displayValueLines.length - 1] += theme.muted + this.ghost + ANSI.RESET;\n }\n }\n\n // 3. Assemble Output\n let output = '';\n displayValueLines.forEach((lineStr, idx) => {\n if (idx === 0) {\n output += prefix + lineStr;\n } else {\n output += '\\n' + lineStr;\n }\n });\n\n if (this.errorMsg) {\n output += `\\n${theme.error}>> ${this.errorMsg}${ANSI.RESET}`;\n }\n\n // 4. Render Frame\n this.renderFrame(output);\n\n this.print(ANSI.SHOW_CURSOR);\n\n // 5. Move Cursor\n const errorOffset = this.errorMsg ? 1 : 0;\n const totalRows = displayValueLines.length + errorOffset;\n\n const linesUp = (totalRows - 1) - cursorRelativeRow;\n if (linesUp > 0) {\n this.print(`\\x1b[${linesUp}A`);\n }\n this.lastLinesUp = linesUp;\n\n let targetCol = 0;\n if (cursorRelativeRow === 0) {\n targetCol = prefixVisualLen + cursorRelativeCol;\n } else {\n targetCol = cursorRelativeCol;\n }\n\n this.print(ANSI.CURSOR_LEFT);\n if (targetCol > 0) {\n this.print(`\\x1b[${targetCol}C`);\n }\n }\n\n // Helper to get width of a segment\n private getSegmentWidth(seg: string): number {\n return stringWidth(seg);\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 // Tab (Accept Suggestion)\n if (char === '\\t') {\n if (this.ghost) {\n const ghostSegments = safeSplit(this.ghost);\n this.segments.splice(this.cursor, 0, ...ghostSegments);\n this.cursor += ghostSegments.length;\n this.ghost = '';\n this.errorMsg = '';\n this.triggerSuggest(); // Maybe fetch next suggestion?\n this.render(false);\n }\n return;\n }\n\n // Enter\n if (char === '\\r' || char === '\\n') {\n if (this.options.multiline) {\n // Insert newline segment\n this.segments.splice(this.cursor, 0, '\\n');\n this.cursor++;\n this.render(false);\n return;\n }\n\n this.validateAndSubmit();\n return;\n }\n\n // Ctrl+D / Ctrl+S\n if (this.options.multiline && (char === '\\u0004' || char === '\\u0013')) {\n this.validateAndSubmit();\n return;\n }\n\n // Backspace\n if (char === '\\u0008' || char === '\\x7f') {\n this.hasTyped = true;\n if (this.cursor > 0) {\n // Remove segment at cursor - 1\n this.segments.splice(this.cursor - 1, 1);\n this.cursor--;\n this.errorMsg = '';\n this.triggerSuggest();\n this.render(false);\n }\n return;\n }\n\n // Arrow Left\n if (this.isLeft(char)) {\n if (this.cursor > 0) {\n this.cursor--;\n this.render(false);\n }\n return;\n }\n\n // Arrow Right\n if (this.isRight(char)) {\n if (this.cursor < this.segments.length) {\n this.cursor++;\n this.render(false);\n }\n return;\n }\n\n // Delete key\n if (char === '\\u001b[3~') {\n this.hasTyped = true;\n if (this.cursor < this.segments.length) {\n this.segments.splice(this.cursor, 1);\n this.errorMsg = '';\n this.triggerSuggest();\n this.render(false);\n }\n return;\n }\n\n // Regular Typing & Paste\n // safeSplit the input char(s) - could be pasted text\n if (!/^[\\x00-\\x1F]/.test(char) && !char.startsWith('\\x1b')) {\n this.hasTyped = true;\n const newSegments = safeSplit(char);\n this.segments.splice(this.cursor, 0, ...newSegments);\n this.cursor += newSegments.length;\n this.errorMsg = '';\n this.triggerSuggest();\n this.render(false);\n }\n }\n\n private validateAndSubmit() {\n this.value = this.segments.join('');\n if (this.options.validate) {\n const result = this.options.validate(this.value);\n\n if (result instanceof Promise) {\n this.errorMsg = 'Validating...';\n this.render(false);\n\n result.then(valid => {\n if (typeof valid === 'string' && valid.length > 0) {\n this.errorMsg = valid;\n this.render(false);\n } else if (valid === false) {\n this.errorMsg = 'Invalid input';\n this.render(false);\n } else {\n this.errorMsg = '';\n this.render(false);\n this.submit(this.value);\n }\n }).catch(err => {\n this.errorMsg = err.message || 'Validation failed';\n this.render(false);\n });\n return;\n }\n\n if (typeof result === 'string' && result.length > 0) {\n this.errorMsg = result;\n this.render(false);\n return;\n }\n if (result === false) {\n this.errorMsg = 'Invalid input';\n this.render(false);\n return;\n }\n }\n\n this.submit(this.value);\n }\n}\n"],"names":["TextPrompt","Prompt","triggerSuggest","options","suggest","cursor","segments","length","ghost","currentValue","join","result","Promise","then","suggestion","startsWith","slice","render","firstRender","lastLinesUp","print","icon","errorMsg","theme","error","symbols","cross","success","hint","multiline","muted","ANSI","RESET","prefix","BOLD","title","message","prefixVisualLen","stripAnsi","displayValueLines","cursorRelativeRow","cursorRelativeCol","value","placeholder","hasTyped","maskChar","mask","isPassword","undefined","cursorLineIndex","visualColIndex","i","seg","getSegmentWidth","currentLineSegments","processedLines","push","forEach","lineSegs","visibleLine","repeat","main","output","lineStr","idx","renderFrame","SHOW_CURSOR","errorOffset","totalRows","linesUp","targetCol","CURSOR_LEFT","stringWidth","cleanup","handleInput","char","ghostSegments","safeSplit","splice","validateAndSubmit","isLeft","isRight","test","newSegments","validate","valid","submit","catch","err","initial"],"mappings":"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"}
@@ -1,211 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "TimePrompt", {
6
- enumerable: true,
7
- get: function() {
8
- return TimePrompt;
9
- }
10
- });
11
- const _base = require("../base");
12
- const _ansi = require("../ansi");
13
- function _define_property(obj, key, value) {
14
- if (key in obj) {
15
- Object.defineProperty(obj, key, {
16
- value: value,
17
- enumerable: true,
18
- configurable: true,
19
- writable: true
20
- });
21
- } else {
22
- obj[key] = value;
23
- }
24
- return obj;
25
- }
26
- let TimePrompt = class TimePrompt extends _base.Prompt {
27
- render(_firstRender) {
28
- const is12h = this.options.format === '12h';
29
- const step = this.options.step || 1;
30
- // Helpers
31
- const getHourDisplay = (h)=>{
32
- if (is12h) {
33
- const val = h % 12 || 12; // 0 -> 12
34
- return val.toString().padStart(2, '0');
35
- }
36
- return h.toString().padStart(2, '0');
37
- };
38
- const getMinDisplay = (m)=>m.toString().padStart(2, '0');
39
- const getMeridiem = (h)=>h >= 12 ? 'PM' : 'AM';
40
- // Calculate Prev/Next values for visualization
41
- const adjustH = (val, delta)=>{
42
- let n = val + delta;
43
- if (n < 0) n = 24 + n;
44
- return n % 24;
45
- };
46
- const adjustM = (val, delta)=>{
47
- let n = val + delta;
48
- if (n < 0) n = 60 + n;
49
- return n % 60;
50
- };
51
- const curH = this.hour;
52
- const curM = this.minute;
53
- const prevH = adjustH(curH, -1);
54
- const nextH = adjustH(curH, 1);
55
- const prevM = adjustM(curM, -step);
56
- const nextM = adjustM(curM, step);
57
- // Build columns
58
- const colHour = [
59
- getHourDisplay(prevH),
60
- getHourDisplay(curH),
61
- getHourDisplay(nextH)
62
- ];
63
- const colMin = [
64
- getMinDisplay(prevM),
65
- getMinDisplay(curM),
66
- getMinDisplay(nextM)
67
- ];
68
- let colMer = [];
69
- if (is12h) {
70
- const curMer = getMeridiem(curH);
71
- const otherMer = curMer === 'AM' ? 'PM' : 'AM';
72
- // Visually, scrolling up/down from AM goes to PM
73
- colMer = [
74
- otherMer,
75
- curMer,
76
- otherMer
77
- ];
78
- }
79
- const dim = _ansi.ANSI.FG_GRAY;
80
- let output = `${_ansi.ANSI.FG_CYAN}? ${this.options.message}${_ansi.ANSI.RESET}\n`;
81
- // Render 3 lines
82
- for(let i = 0; i < 3; i++){
83
- const isCenter = i === 1;
84
- // Render Hour
85
- let hStr = colHour[i];
86
- if (this.activeCol === 0 && isCenter) {
87
- hStr = `${_ansi.ANSI.FG_CYAN}${_ansi.ANSI.REVERSE} ${hStr} ${_ansi.ANSI.RESET}`;
88
- } else if (isCenter) {
89
- hStr = `${_ansi.ANSI.BOLD} ${hStr} ${_ansi.ANSI.RESET}`;
90
- } else {
91
- hStr = `${dim} ${hStr} ${_ansi.ANSI.RESET}`;
92
- }
93
- const sep = isCenter ? ':' : ' ';
94
- // Render Minute
95
- let mStr = colMin[i];
96
- if (this.activeCol === 1 && isCenter) {
97
- mStr = `${_ansi.ANSI.FG_CYAN}${_ansi.ANSI.REVERSE} ${mStr} ${_ansi.ANSI.RESET}`;
98
- } else if (isCenter) {
99
- mStr = `${_ansi.ANSI.BOLD} ${mStr} ${_ansi.ANSI.RESET}`;
100
- } else {
101
- mStr = `${dim} ${mStr} ${_ansi.ANSI.RESET}`;
102
- }
103
- let line = ` ${hStr} ${sep} ${mStr}`;
104
- // Render Meridiem
105
- if (is12h) {
106
- let merStr = colMer[i];
107
- if (this.activeCol === 2 && isCenter) {
108
- merStr = `${_ansi.ANSI.FG_CYAN}${_ansi.ANSI.REVERSE} ${merStr} ${_ansi.ANSI.RESET}`;
109
- } else if (isCenter) {
110
- merStr = `${_ansi.ANSI.BOLD} ${merStr} ${_ansi.ANSI.RESET}`;
111
- } else {
112
- merStr = `${dim} ${merStr} ${_ansi.ANSI.RESET}`;
113
- }
114
- line += ` ${merStr}`;
115
- }
116
- output += line + '\n';
117
- }
118
- output += _ansi.ANSI.FG_GRAY + "(Use Arrows/Tab to navigate)" + _ansi.ANSI.RESET;
119
- this.renderFrame(output);
120
- }
121
- handleMouse(event) {
122
- if (event.action === 'scroll') {
123
- if (event.scroll === 'up') {
124
- this.adjustValue(-1);
125
- } else if (event.scroll === 'down') {
126
- this.adjustValue(1);
127
- }
128
- this.render(false);
129
- }
130
- }
131
- handleInput(char, _key) {
132
- const is12h = this.options.format === '12h';
133
- const maxCols = is12h ? 2 : 1; // 0, 1, 2 or 0, 1
134
- if (char === '\r' || char === '\n') {
135
- const h = this.hour.toString().padStart(2, '0');
136
- const m = this.minute.toString().padStart(2, '0');
137
- const result = is12h ? `${(this.hour % 12 || 12).toString().padStart(2, '0')}:${m} ${this.hour >= 12 ? 'PM' : 'AM'}` : `${h}:${m}`;
138
- this.submit(result);
139
- return;
140
- }
141
- if (char === '\t' || this.isRight(char)) {
142
- this.activeCol++;
143
- if (this.activeCol > maxCols) this.activeCol = 0;
144
- this.render(false);
145
- return;
146
- }
147
- if (char === '\u001b[Z' || this.isLeft(char)) {
148
- this.activeCol--;
149
- if (this.activeCol < 0) this.activeCol = maxCols;
150
- this.render(false);
151
- return;
152
- }
153
- if (this.isUp(char)) {
154
- this.adjustValue(-1);
155
- this.render(false);
156
- } else if (this.isDown(char)) {
157
- this.adjustValue(1);
158
- this.render(false);
159
- }
160
- }
161
- adjustValue(direction) {
162
- // direction: -1 (Up/Prev value, which visually is TOP, but wait...)
163
- // In the UI:
164
- // Prev (Top)
165
- // Curr (Center)
166
- // Next (Bottom)
167
- // If I press DOWN arrow, I expect the list to scroll DOWN, which means "Next" becomes "Curr".
168
- // So DOWN arrow means INCREMENT index/value.
169
- // UP arrow means DECREMENT index/value.
170
- if (this.activeCol === 0) {
171
- let newH = this.hour + direction;
172
- if (newH < 0) newH = 23;
173
- if (newH > 23) newH = 0;
174
- this.hour = newH;
175
- } else if (this.activeCol === 1) {
176
- const step = this.options.step || 1;
177
- let newM = this.minute + direction * step;
178
- if (newM < 0) newM = 60 - step; // Approx wrap
179
- // Better wrap logic for arbitrary steps:
180
- if (newM < 0) newM = 60 + newM; // e.g. -5 -> 55
181
- if (newM >= 60) newM = newM % 60;
182
- this.minute = newM;
183
- } else if (this.activeCol === 2) {
184
- // Toggle AM/PM
185
- this.hour = (this.hour + 12) % 24;
186
- }
187
- }
188
- constructor(options){
189
- super(options), _define_property(this, "hour", 0), _define_property(this, "minute", 0), _define_property(this, "activeCol", 0) // 0: Hour, 1: Minute, 2: Meridiem (if 12h)
190
- ;
191
- const now = options.initial ? typeof options.initial === 'string' ? new Date(options.initial) : options.initial : new Date();
192
- // Fallback if invalid date
193
- if (isNaN(now.getTime())) {
194
- this.hour = 0;
195
- this.minute = 0;
196
- } else {
197
- this.hour = now.getHours();
198
- this.minute = now.getMinutes();
199
- }
200
- // Round minute to nearest step
201
- if (options.step) {
202
- this.minute = Math.round(this.minute / options.step) * options.step;
203
- if (this.minute >= 60) {
204
- this.minute = 0;
205
- this.hour = (this.hour + 1) % 24;
206
- }
207
- }
208
- }
209
- };
210
-
211
- //# sourceMappingURL=time.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/prompts/time.ts"],"sourcesContent":["import { Prompt } from '../base';\nimport { TimeOptions, MouseEvent } from '../types';\nimport { ANSI } from '../ansi';\n\nexport class TimePrompt extends Prompt<string, TimeOptions> {\n private hour: number = 0;\n private minute: number = 0;\n private activeCol: number = 0; // 0: Hour, 1: Minute, 2: Meridiem (if 12h)\n\n constructor(options: TimeOptions) {\n super(options);\n const now = options.initial ? (typeof options.initial === 'string' ? new Date(options.initial) : options.initial) : new Date();\n // Fallback if invalid date\n if (isNaN(now.getTime())) {\n this.hour = 0;\n this.minute = 0;\n } else {\n this.hour = now.getHours();\n this.minute = now.getMinutes();\n }\n\n // Round minute to nearest step\n if (options.step) {\n this.minute = Math.round(this.minute / options.step) * options.step;\n if (this.minute >= 60) {\n this.minute = 0;\n this.hour = (this.hour + 1) % 24;\n }\n }\n }\n\n protected render(_firstRender: boolean): void {\n const is12h = this.options.format === '12h';\n const step = this.options.step || 1;\n\n // Helpers\n const getHourDisplay = (h: number) => {\n if (is12h) {\n const val = h % 12 || 12; // 0 -> 12\n return val.toString().padStart(2, '0');\n }\n return h.toString().padStart(2, '0');\n };\n\n const getMinDisplay = (m: number) => m.toString().padStart(2, '0');\n const getMeridiem = (h: number) => h >= 12 ? 'PM' : 'AM';\n\n // Calculate Prev/Next values for visualization\n const adjustH = (val: number, delta: number) => {\n let n = val + delta;\n if (n < 0) n = 24 + n;\n return n % 24;\n };\n const adjustM = (val: number, delta: number) => {\n let n = val + delta;\n if (n < 0) n = 60 + n;\n return n % 60;\n };\n\n const curH = this.hour;\n const curM = this.minute;\n\n const prevH = adjustH(curH, -1);\n const nextH = adjustH(curH, 1);\n\n const prevM = adjustM(curM, -step);\n const nextM = adjustM(curM, step);\n\n // Build columns\n const colHour = [getHourDisplay(prevH), getHourDisplay(curH), getHourDisplay(nextH)];\n const colMin = [getMinDisplay(prevM), getMinDisplay(curM), getMinDisplay(nextM)];\n\n let colMer: string[] = [];\n if (is12h) {\n const curMer = getMeridiem(curH);\n const otherMer = curMer === 'AM' ? 'PM' : 'AM';\n // Visually, scrolling up/down from AM goes to PM\n colMer = [otherMer, curMer, otherMer];\n }\n\n const dim = ANSI.FG_GRAY;\n\n let output = `${ANSI.FG_CYAN}? ${this.options.message}${ANSI.RESET}\\n`;\n\n // Render 3 lines\n for (let i = 0; i < 3; i++) {\n const isCenter = i === 1;\n\n // Render Hour\n let hStr = colHour[i];\n if (this.activeCol === 0 && isCenter) {\n hStr = `${ANSI.FG_CYAN}${ANSI.REVERSE} ${hStr} ${ANSI.RESET}`;\n } else if (isCenter) {\n hStr = `${ANSI.BOLD} ${hStr} ${ANSI.RESET}`;\n } else {\n hStr = `${dim} ${hStr} ${ANSI.RESET}`;\n }\n\n const sep = isCenter ? ':' : ' ';\n\n // Render Minute\n let mStr = colMin[i];\n if (this.activeCol === 1 && isCenter) {\n mStr = `${ANSI.FG_CYAN}${ANSI.REVERSE} ${mStr} ${ANSI.RESET}`;\n } else if (isCenter) {\n mStr = `${ANSI.BOLD} ${mStr} ${ANSI.RESET}`;\n } else {\n mStr = `${dim} ${mStr} ${ANSI.RESET}`;\n }\n\n let line = ` ${hStr} ${sep} ${mStr}`;\n\n // Render Meridiem\n if (is12h) {\n let merStr = colMer[i];\n if (this.activeCol === 2 && isCenter) {\n merStr = `${ANSI.FG_CYAN}${ANSI.REVERSE} ${merStr} ${ANSI.RESET}`;\n } else if (isCenter) {\n merStr = `${ANSI.BOLD} ${merStr} ${ANSI.RESET}`;\n } else {\n merStr = `${dim} ${merStr} ${ANSI.RESET}`;\n }\n line += ` ${merStr}`;\n }\n\n output += line + '\\n';\n }\n\n output += ANSI.FG_GRAY + \"(Use Arrows/Tab to navigate)\" + ANSI.RESET;\n\n this.renderFrame(output);\n }\n\n protected handleMouse(event: MouseEvent): void {\n if (event.action === 'scroll') {\n if (event.scroll === 'up') {\n this.adjustValue(-1);\n } else if (event.scroll === 'down') {\n this.adjustValue(1);\n }\n this.render(false);\n }\n }\n\n protected handleInput(char: string, _key: Buffer): void {\n const is12h = this.options.format === '12h';\n const maxCols = is12h ? 2 : 1; // 0, 1, 2 or 0, 1\n\n if (char === '\\r' || char === '\\n') { // Enter\n const h = this.hour.toString().padStart(2, '0');\n const m = this.minute.toString().padStart(2, '0');\n const result = is12h\n ? `${((this.hour % 12) || 12).toString().padStart(2, '0')}:${m} ${this.hour >= 12 ? 'PM' : 'AM'}`\n : `${h}:${m}`;\n this.submit(result);\n return;\n }\n\n if (char === '\\t' || this.isRight(char)) {\n this.activeCol++;\n if (this.activeCol > maxCols) this.activeCol = 0;\n this.render(false);\n return;\n }\n\n if (char === '\\u001b[Z' || this.isLeft(char)) { // Shift+Tab or Left\n this.activeCol--;\n if (this.activeCol < 0) this.activeCol = maxCols;\n this.render(false);\n return;\n }\n\n if (this.isUp(char)) {\n this.adjustValue(-1);\n this.render(false);\n } else if (this.isDown(char)) {\n this.adjustValue(1);\n this.render(false);\n }\n }\n\n private adjustValue(direction: number) {\n // direction: -1 (Up/Prev value, which visually is TOP, but wait...)\n // In the UI:\n // Prev (Top)\n // Curr (Center)\n // Next (Bottom)\n // If I press DOWN arrow, I expect the list to scroll DOWN, which means \"Next\" becomes \"Curr\".\n // So DOWN arrow means INCREMENT index/value.\n // UP arrow means DECREMENT index/value.\n\n if (this.activeCol === 0) { // Hour\n let newH = this.hour + direction;\n if (newH < 0) newH = 23;\n if (newH > 23) newH = 0;\n this.hour = newH;\n } else if (this.activeCol === 1) { // Minute\n const step = this.options.step || 1;\n let newM = this.minute + (direction * step);\n if (newM < 0) newM = 60 - step; // Approx wrap\n // Better wrap logic for arbitrary steps:\n if (newM < 0) newM = 60 + newM; // e.g. -5 -> 55\n if (newM >= 60) newM = newM % 60;\n this.minute = newM;\n } else if (this.activeCol === 2) { // Meridiem\n // Toggle AM/PM\n this.hour = (this.hour + 12) % 24;\n }\n }\n}\n"],"names":["TimePrompt","Prompt","render","_firstRender","is12h","options","format","step","getHourDisplay","h","val","toString","padStart","getMinDisplay","m","getMeridiem","adjustH","delta","n","adjustM","curH","hour","curM","minute","prevH","nextH","prevM","nextM","colHour","colMin","colMer","curMer","otherMer","dim","ANSI","FG_GRAY","output","FG_CYAN","message","RESET","i","isCenter","hStr","activeCol","REVERSE","BOLD","sep","mStr","line","merStr","renderFrame","handleMouse","event","action","scroll","adjustValue","handleInput","char","_key","maxCols","result","submit","isRight","isLeft","isUp","isDown","direction","newH","newM","now","initial","Date","isNaN","getTime","getHours","getMinutes","Math","round"],"mappings":";;;;+BAIaA;;;eAAAA;;;sBAJU;sBAEF;;;;;;;;;;;;;;AAEd,IAAA,AAAMA,aAAN,MAAMA,mBAAmBC,YAAM;IA2BxBC,OAAOC,YAAqB,EAAQ;QAC1C,MAAMC,QAAQ,IAAI,CAACC,OAAO,CAACC,MAAM,KAAK;QACtC,MAAMC,OAAO,IAAI,CAACF,OAAO,CAACE,IAAI,IAAI;QAElC,UAAU;QACV,MAAMC,iBAAiB,CAACC;YACpB,IAAIL,OAAO;gBACP,MAAMM,MAAMD,IAAI,MAAM,IAAI,UAAU;gBACpC,OAAOC,IAAIC,QAAQ,GAAGC,QAAQ,CAAC,GAAG;YACtC;YACA,OAAOH,EAAEE,QAAQ,GAAGC,QAAQ,CAAC,GAAG;QACpC;QAEA,MAAMC,gBAAgB,CAACC,IAAcA,EAAEH,QAAQ,GAAGC,QAAQ,CAAC,GAAG;QAC9D,MAAMG,cAAc,CAACN,IAAcA,KAAK,KAAK,OAAO;QAEpD,+CAA+C;QAC/C,MAAMO,UAAU,CAACN,KAAaO;YAC1B,IAAIC,IAAIR,MAAMO;YACd,IAAIC,IAAI,GAAGA,IAAI,KAAKA;YACpB,OAAOA,IAAI;QACf;QACA,MAAMC,UAAU,CAACT,KAAaO;YAC1B,IAAIC,IAAIR,MAAMO;YACd,IAAIC,IAAI,GAAGA,IAAI,KAAKA;YACpB,OAAOA,IAAI;QACf;QAEA,MAAME,OAAO,IAAI,CAACC,IAAI;QACtB,MAAMC,OAAO,IAAI,CAACC,MAAM;QAExB,MAAMC,QAAQR,QAAQI,MAAM,CAAC;QAC7B,MAAMK,QAAQT,QAAQI,MAAM;QAE5B,MAAMM,QAAQP,QAAQG,MAAM,CAACf;QAC7B,MAAMoB,QAAQR,QAAQG,MAAMf;QAE5B,gBAAgB;QAChB,MAAMqB,UAAU;YAACpB,eAAegB;YAAQhB,eAAeY;YAAOZ,eAAeiB;SAAO;QACpF,MAAMI,SAAS;YAAChB,cAAca;YAAQb,cAAcS;YAAOT,cAAcc;SAAO;QAEhF,IAAIG,SAAmB,EAAE;QACzB,IAAI1B,OAAO;YACP,MAAM2B,SAAShB,YAAYK;YAC3B,MAAMY,WAAWD,WAAW,OAAO,OAAO;YAC1C,iDAAiD;YACjDD,SAAS;gBAACE;gBAAUD;gBAAQC;aAAS;QACzC;QAEA,MAAMC,MAAMC,UAAI,CAACC,OAAO;QAExB,IAAIC,SAAS,GAAGF,UAAI,CAACG,OAAO,CAAC,EAAE,EAAE,IAAI,CAAChC,OAAO,CAACiC,OAAO,GAAGJ,UAAI,CAACK,KAAK,CAAC,EAAE,CAAC;QAEtE,iBAAiB;QACjB,IAAK,IAAIC,IAAI,GAAGA,IAAI,GAAGA,IAAK;YACxB,MAAMC,WAAWD,MAAM;YAEvB,cAAc;YACd,IAAIE,OAAOd,OAAO,CAACY,EAAE;YACrB,IAAI,IAAI,CAACG,SAAS,KAAK,KAAKF,UAAU;gBAClCC,OAAO,GAAGR,UAAI,CAACG,OAAO,GAAGH,UAAI,CAACU,OAAO,CAAC,CAAC,EAAEF,KAAK,CAAC,EAAER,UAAI,CAACK,KAAK,EAAE;YACjE,OAAO,IAAIE,UAAU;gBACjBC,OAAO,GAAGR,UAAI,CAACW,IAAI,CAAC,CAAC,EAAEH,KAAK,CAAC,EAAER,UAAI,CAACK,KAAK,EAAE;YAC/C,OAAO;gBACHG,OAAO,GAAGT,IAAI,CAAC,EAAES,KAAK,CAAC,EAAER,UAAI,CAACK,KAAK,EAAE;YACzC;YAEA,MAAMO,MAAML,WAAW,MAAM;YAE7B,gBAAgB;YAChB,IAAIM,OAAOlB,MAAM,CAACW,EAAE;YACpB,IAAI,IAAI,CAACG,SAAS,KAAK,KAAKF,UAAU;gBAClCM,OAAO,GAAGb,UAAI,CAACG,OAAO,GAAGH,UAAI,CAACU,OAAO,CAAC,CAAC,EAAEG,KAAK,CAAC,EAAEb,UAAI,CAACK,KAAK,EAAE;YACjE,OAAO,IAAIE,UAAU;gBACjBM,OAAO,GAAGb,UAAI,CAACW,IAAI,CAAC,CAAC,EAAEE,KAAK,CAAC,EAAEb,UAAI,CAACK,KAAK,EAAE;YAC/C,OAAO;gBACHQ,OAAO,GAAGd,IAAI,CAAC,EAAEc,KAAK,CAAC,EAAEb,UAAI,CAACK,KAAK,EAAE;YACzC;YAEA,IAAIS,OAAO,CAAC,EAAE,EAAEN,KAAK,CAAC,EAAEI,IAAI,CAAC,EAAEC,MAAM;YAErC,kBAAkB;YAClB,IAAI3C,OAAO;gBACP,IAAI6C,SAASnB,MAAM,CAACU,EAAE;gBACtB,IAAI,IAAI,CAACG,SAAS,KAAK,KAAKF,UAAU;oBAClCQ,SAAS,GAAGf,UAAI,CAACG,OAAO,GAAGH,UAAI,CAACU,OAAO,CAAC,CAAC,EAAEK,OAAO,CAAC,EAAEf,UAAI,CAACK,KAAK,EAAE;gBACrE,OAAO,IAAIE,UAAU;oBACjBQ,SAAS,GAAGf,UAAI,CAACW,IAAI,CAAC,CAAC,EAAEI,OAAO,CAAC,EAAEf,UAAI,CAACK,KAAK,EAAE;gBACnD,OAAO;oBACHU,SAAS,GAAGhB,IAAI,CAAC,EAAEgB,OAAO,CAAC,EAAEf,UAAI,CAACK,KAAK,EAAE;gBAC7C;gBACAS,QAAQ,CAAC,CAAC,EAAEC,QAAQ;YACxB;YAEAb,UAAUY,OAAO;QACrB;QAEAZ,UAAUF,UAAI,CAACC,OAAO,GAAG,iCAAiCD,UAAI,CAACK,KAAK;QAEpE,IAAI,CAACW,WAAW,CAACd;IACrB;IAEUe,YAAYC,KAAiB,EAAQ;QAC3C,IAAIA,MAAMC,MAAM,KAAK,UAAU;YAC3B,IAAID,MAAME,MAAM,KAAK,MAAM;gBACvB,IAAI,CAACC,WAAW,CAAC,CAAC;YACtB,OAAO,IAAIH,MAAME,MAAM,KAAK,QAAQ;gBAChC,IAAI,CAACC,WAAW,CAAC;YACrB;YACA,IAAI,CAACrD,MAAM,CAAC;QAChB;IACJ;IAEUsD,YAAYC,IAAY,EAAEC,IAAY,EAAQ;QACpD,MAAMtD,QAAQ,IAAI,CAACC,OAAO,CAACC,MAAM,KAAK;QACtC,MAAMqD,UAAUvD,QAAQ,IAAI,GAAG,kBAAkB;QAEjD,IAAIqD,SAAS,QAAQA,SAAS,MAAM;YAChC,MAAMhD,IAAI,IAAI,CAACY,IAAI,CAACV,QAAQ,GAAGC,QAAQ,CAAC,GAAG;YAC3C,MAAME,IAAI,IAAI,CAACS,MAAM,CAACZ,QAAQ,GAAGC,QAAQ,CAAC,GAAG;YAC7C,MAAMgD,SAASxD,QACT,GAAG,AAAC,CAAA,AAAC,IAAI,CAACiB,IAAI,GAAG,MAAO,EAAC,EAAGV,QAAQ,GAAGC,QAAQ,CAAC,GAAG,KAAK,CAAC,EAAEE,EAAE,CAAC,EAAE,IAAI,CAACO,IAAI,IAAI,KAAK,OAAO,MAAM,GAC/F,GAAGZ,EAAE,CAAC,EAAEK,GAAG;YACjB,IAAI,CAAC+C,MAAM,CAACD;YACZ;QACJ;QAEA,IAAIH,SAAS,QAAQ,IAAI,CAACK,OAAO,CAACL,OAAO;YACrC,IAAI,CAACd,SAAS;YACd,IAAI,IAAI,CAACA,SAAS,GAAGgB,SAAS,IAAI,CAAChB,SAAS,GAAG;YAC/C,IAAI,CAACzC,MAAM,CAAC;YACZ;QACJ;QAEA,IAAIuD,SAAS,cAAc,IAAI,CAACM,MAAM,CAACN,OAAO;YAC1C,IAAI,CAACd,SAAS;YACd,IAAI,IAAI,CAACA,SAAS,GAAG,GAAG,IAAI,CAACA,SAAS,GAAGgB;YACzC,IAAI,CAACzD,MAAM,CAAC;YACZ;QACJ;QAEA,IAAI,IAAI,CAAC8D,IAAI,CAACP,OAAO;YACjB,IAAI,CAACF,WAAW,CAAC,CAAC;YAClB,IAAI,CAACrD,MAAM,CAAC;QAChB,OAAO,IAAI,IAAI,CAAC+D,MAAM,CAACR,OAAO;YAC1B,IAAI,CAACF,WAAW,CAAC;YACjB,IAAI,CAACrD,MAAM,CAAC;QAChB;IACJ;IAEQqD,YAAYW,SAAiB,EAAE;QACnC,oEAAoE;QACpE,aAAa;QACb,aAAa;QACb,gBAAgB;QAChB,gBAAgB;QAChB,8FAA8F;QAC9F,6CAA6C;QAC7C,wCAAwC;QAExC,IAAI,IAAI,CAACvB,SAAS,KAAK,GAAG;YACtB,IAAIwB,OAAO,IAAI,CAAC9C,IAAI,GAAG6C;YACvB,IAAIC,OAAO,GAAGA,OAAO;YACrB,IAAIA,OAAO,IAAIA,OAAO;YACtB,IAAI,CAAC9C,IAAI,GAAG8C;QAChB,OAAO,IAAI,IAAI,CAACxB,SAAS,KAAK,GAAG;YAC7B,MAAMpC,OAAO,IAAI,CAACF,OAAO,CAACE,IAAI,IAAI;YAClC,IAAI6D,OAAO,IAAI,CAAC7C,MAAM,GAAI2C,YAAY3D;YACtC,IAAI6D,OAAO,GAAGA,OAAO,KAAK7D,MAAM,cAAc;YAC9C,yCAAyC;YACzC,IAAI6D,OAAO,GAAGA,OAAO,KAAKA,MAAM,gBAAgB;YAChD,IAAIA,QAAQ,IAAIA,OAAOA,OAAO;YAC9B,IAAI,CAAC7C,MAAM,GAAG6C;QAClB,OAAO,IAAI,IAAI,CAACzB,SAAS,KAAK,GAAG;YAC7B,eAAe;YACf,IAAI,CAACtB,IAAI,GAAG,AAAC,CAAA,IAAI,CAACA,IAAI,GAAG,EAAC,IAAK;QACnC;IACJ;IAvMA,YAAYhB,OAAoB,CAAE;QAC9B,KAAK,CAACA,UALV,uBAAQgB,QAAe,IACvB,uBAAQE,UAAiB,IACzB,uBAAQoB,aAAoB,GAAG,2CAA2C;;QAItE,MAAM0B,MAAMhE,QAAQiE,OAAO,GAAI,OAAOjE,QAAQiE,OAAO,KAAK,WAAW,IAAIC,KAAKlE,QAAQiE,OAAO,IAAIjE,QAAQiE,OAAO,GAAI,IAAIC;QACxH,2BAA2B;QAC3B,IAAIC,MAAMH,IAAII,OAAO,KAAK;YACtB,IAAI,CAACpD,IAAI,GAAG;YACZ,IAAI,CAACE,MAAM,GAAG;QAClB,OAAO;YACH,IAAI,CAACF,IAAI,GAAGgD,IAAIK,QAAQ;YACxB,IAAI,CAACnD,MAAM,GAAG8C,IAAIM,UAAU;QAChC;QAEA,+BAA+B;QAC/B,IAAItE,QAAQE,IAAI,EAAE;YACd,IAAI,CAACgB,MAAM,GAAGqD,KAAKC,KAAK,CAAC,IAAI,CAACtD,MAAM,GAAGlB,QAAQE,IAAI,IAAIF,QAAQE,IAAI;YACnE,IAAI,IAAI,CAACgB,MAAM,IAAI,IAAI;gBACnB,IAAI,CAACA,MAAM,GAAG;gBACd,IAAI,CAACF,IAAI,GAAG,AAAC,CAAA,IAAI,CAACA,IAAI,GAAG,CAAA,IAAK;YAClC;QACJ;IACJ;AAoLJ"}
@@ -1,53 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "TogglePrompt", {
6
- enumerable: true,
7
- get: function() {
8
- return TogglePrompt;
9
- }
10
- });
11
- const _ansi = require("../ansi");
12
- const _base = require("../base");
13
- const _theme = require("../theme");
14
- let TogglePrompt = class TogglePrompt extends _base.Prompt {
15
- render(_firstRender) {
16
- const activeText = this.options.activeText || 'ON';
17
- const inactiveText = this.options.inactiveText || 'OFF';
18
- let toggleDisplay = '';
19
- if (this.value) {
20
- toggleDisplay = `${_theme.theme.main}[${_ansi.ANSI.BOLD}${activeText}${_ansi.ANSI.RESET}${_theme.theme.main}]${_ansi.ANSI.RESET} ${_theme.theme.muted}${inactiveText}${_ansi.ANSI.RESET}`;
21
- } else {
22
- toggleDisplay = `${_theme.theme.muted}${activeText}${_ansi.ANSI.RESET} ${_theme.theme.main}[${_ansi.ANSI.BOLD}${inactiveText}${_ansi.ANSI.RESET}${_theme.theme.main}]${_ansi.ANSI.RESET}`;
23
- }
24
- const output = `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} ${toggleDisplay}`;
25
- this.renderFrame(output);
26
- }
27
- handleInput(char) {
28
- if (char === '\r' || char === '\n') {
29
- this.submit(this.value);
30
- return;
31
- }
32
- if (this.isLeft(char) || this.isRight(char) || char === 'h' || char === 'l') {
33
- this.value = !this.value;
34
- this.render(false);
35
- }
36
- if (char === ' ') {
37
- this.value = !this.value;
38
- this.render(false);
39
- }
40
- }
41
- handleMouse(event) {
42
- if (event.action === 'scroll') {
43
- this.value = !this.value;
44
- this.render(false);
45
- }
46
- }
47
- constructor(options){
48
- super(options);
49
- this.value = options.initial ?? false;
50
- }
51
- };
52
-
53
- //# sourceMappingURL=toggle.js.map