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
@@ -1,62 +1,66 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ScrollPrompt = void 0;
4
- const base_1 = require("../base");
5
- const ansi_1 = require("../ansi");
6
- const theme_1 = require("../theme");
7
- const symbols_1 = require("../symbols");
8
- const utils_1 = require("../utils");
9
- class ScrollPrompt extends base_1.Prompt {
10
- constructor(options) {
11
- super(options);
12
- this.scrollTop = 0;
13
- this.hasReachedBottom = false;
14
- this.showError = false;
15
- // Normalize newlines and split content
16
- this.lines = (options.content || '').replace(/\r\n/g, '\n').split('\n');
17
- this.height = options.height || 15;
18
- // Initial check if content fits without scrolling
19
- if (this.lines.length <= this.height) {
20
- this.hasReachedBottom = true;
21
- }
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "ScrollPrompt", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return ScrollPrompt;
22
9
  }
10
+ });
11
+ const _base = require("../base");
12
+ const _ansi = require("../ansi");
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 ScrollPrompt = class ScrollPrompt extends _base.Prompt {
23
30
  render(_firstRender) {
24
31
  const width = this.stdout.columns || 80;
25
32
  const contentWidth = width - 4; // Border (2) + Padding (2)
26
33
  // 1. Header & Progress
27
- const percent = Math.min(100, Math.round(((this.scrollTop + this.height) / Math.max(this.height, this.lines.length)) * 100));
28
- const header = `${theme_1.theme.title}${symbols_1.symbols.pointer} ${ansi_1.ANSI.BOLD}${this.options.message}${ansi_1.ANSI.RESET} ${theme_1.theme.muted}[${percent}%]${ansi_1.ANSI.RESET}`;
34
+ const percent = Math.min(100, Math.round((this.scrollTop + this.height) / Math.max(this.height, this.lines.length) * 100));
35
+ const header = `${_theme.theme.title}${_symbols.symbols.pointer} ${_ansi.ANSI.BOLD}${this.options.message}${_ansi.ANSI.RESET} ${_theme.theme.muted}[${percent}%]${_ansi.ANSI.RESET}`;
29
36
  // 2. Viewport
30
37
  const visibleLines = this.lines.slice(this.scrollTop, this.scrollTop + this.height);
31
38
  // Fill empty lines if content is shorter than height
32
- while (visibleLines.length < this.height) {
39
+ while(visibleLines.length < this.height){
33
40
  visibleLines.push('');
34
41
  }
35
- const borderTop = `${theme_1.theme.muted}${symbols_1.symbols.topLeft}${symbols_1.symbols.horizontal.repeat(width - 2)}${symbols_1.symbols.topRight}${ansi_1.ANSI.RESET}`;
36
- const borderBottom = `${theme_1.theme.muted}${symbols_1.symbols.bottomLeft}${symbols_1.symbols.horizontal.repeat(width - 2)}${symbols_1.symbols.bottomRight}${ansi_1.ANSI.RESET}`;
37
- const contentRows = visibleLines.map(line => {
42
+ const borderTop = `${_theme.theme.muted}${_symbols.symbols.topLeft}${_symbols.symbols.horizontal.repeat(width - 2)}${_symbols.symbols.topRight}${_ansi.ANSI.RESET}`;
43
+ const borderBottom = `${_theme.theme.muted}${_symbols.symbols.bottomLeft}${_symbols.symbols.horizontal.repeat(width - 2)}${_symbols.symbols.bottomRight}${_ansi.ANSI.RESET}`;
44
+ const contentRows = visibleLines.map((line)=>{
38
45
  let displayLine = line;
39
- const len = (0, utils_1.stringWidth)(displayLine);
46
+ const len = (0, _utils.stringWidth)(displayLine);
40
47
  if (len > contentWidth) {
41
48
  // Truncate
42
49
  displayLine = this.truncate(displayLine, contentWidth);
43
- }
44
- else {
50
+ } else {
45
51
  // Pad
46
52
  displayLine += ' '.repeat(contentWidth - len);
47
53
  }
48
- return `${theme_1.theme.muted}${symbols_1.symbols.vertical}${ansi_1.ANSI.RESET} ${displayLine} ${theme_1.theme.muted}${symbols_1.symbols.vertical}${ansi_1.ANSI.RESET}`;
54
+ return `${_theme.theme.muted}${_symbols.symbols.vertical}${_ansi.ANSI.RESET} ${displayLine} ${_theme.theme.muted}${_symbols.symbols.vertical}${_ansi.ANSI.RESET}`;
49
55
  });
50
56
  // 3. Footer / Status
51
57
  let footer = '';
52
58
  if (this.showError) {
53
- footer = `${theme_1.theme.error}>> Please scroll to the bottom before proceeding.${ansi_1.ANSI.RESET}`;
54
- }
55
- else if (this.options.requireScrollToBottom && !this.hasReachedBottom) {
56
- footer = `${theme_1.theme.muted}(Scroll down to read more)${ansi_1.ANSI.RESET}`;
57
- }
58
- else {
59
- footer = `${theme_1.theme.success}>> Press Enter to accept${ansi_1.ANSI.RESET}`;
59
+ footer = `${_theme.theme.error}>> Please scroll to the bottom before proceeding.${_ansi.ANSI.RESET}`;
60
+ } else if (this.options.requireScrollToBottom && !this.hasReachedBottom) {
61
+ footer = `${_theme.theme.muted}(Scroll down to read more)${_ansi.ANSI.RESET}`;
62
+ } else {
63
+ footer = `${_theme.theme.success}>> Press Enter to accept${_ansi.ANSI.RESET}`;
60
64
  }
61
65
  const output = [
62
66
  header,
@@ -85,33 +89,22 @@ class ScrollPrompt extends base_1.Prompt {
85
89
  this.scrollTop--;
86
90
  didScroll = true;
87
91
  }
88
- }
89
- // Down / j
90
- else if (this.isDown(char) || char === 'j') {
92
+ } else if (this.isDown(char) || char === 'j') {
91
93
  if (this.scrollTop + this.height < this.lines.length) {
92
94
  this.scrollTop++;
93
95
  didScroll = true;
94
96
  }
95
- }
96
- // PageUp
97
- else if (key.toString('hex') === '1b5b357e') { // Standard PageUp sequence
97
+ } else if (key.toString('hex') === '1b5b357e') {
98
98
  this.scrollTop = Math.max(0, this.scrollTop - this.height);
99
99
  didScroll = true;
100
- }
101
- // PageDown / Space
102
- else if (char === ' ' || key.toString('hex') === '1b5b367e') { // Standard PageDown sequence
100
+ } else if (char === ' ' || key.toString('hex') === '1b5b367e') {
103
101
  this.scrollTop = Math.min(this.lines.length - this.height, this.scrollTop + this.height);
104
- if (this.scrollTop < 0)
105
- this.scrollTop = 0; // Fix if content < height
102
+ if (this.scrollTop < 0) this.scrollTop = 0; // Fix if content < height
106
103
  didScroll = true;
107
- }
108
- // Home
109
- else if (key.toString('hex') === '1b5b48') {
104
+ } else if (key.toString('hex') === '1b5b48') {
110
105
  this.scrollTop = 0;
111
106
  didScroll = true;
112
- }
113
- // End
114
- else if (key.toString('hex') === '1b5b46') {
107
+ } else if (key.toString('hex') === '1b5b46') {
115
108
  this.scrollTop = Math.max(0, this.lines.length - this.height);
116
109
  didScroll = true;
117
110
  }
@@ -132,8 +125,7 @@ class ScrollPrompt extends base_1.Prompt {
132
125
  this.scrollTop--;
133
126
  didScroll = true;
134
127
  }
135
- }
136
- else if (event.scroll === 'down') {
128
+ } else if (event.scroll === 'down') {
137
129
  if (this.scrollTop + this.height < this.lines.length) {
138
130
  this.scrollTop++;
139
131
  didScroll = true;
@@ -148,5 +140,16 @@ class ScrollPrompt extends base_1.Prompt {
148
140
  }
149
141
  }
150
142
  }
151
- }
152
- exports.ScrollPrompt = ScrollPrompt;
143
+ constructor(options){
144
+ super(options), _define_property(this, "lines", void 0), _define_property(this, "scrollTop", 0), _define_property(this, "height", void 0), _define_property(this, "hasReachedBottom", false), _define_property(this, "showError", false);
145
+ // Normalize newlines and split content
146
+ this.lines = (options.content || '').replace(/\r\n/g, '\n').split('\n');
147
+ this.height = options.height || 15;
148
+ // Initial check if content fits without scrolling
149
+ if (this.lines.length <= this.height) {
150
+ this.hasReachedBottom = true;
151
+ }
152
+ }
153
+ };
154
+
155
+ //# sourceMappingURL=scroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/prompts/scroll.ts"],"sourcesContent":["import { Prompt } from '../base';\nimport { ANSI } from '../ansi';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { ScrollOptions } from '../types';\nimport { stringWidth } from '../utils';\n\nexport class ScrollPrompt extends Prompt<boolean, ScrollOptions> {\n private lines: string[];\n private scrollTop: number = 0;\n private height: number;\n private hasReachedBottom: boolean = false;\n private showError: boolean = false;\n\n constructor(options: ScrollOptions) {\n super(options);\n // Normalize newlines and split content\n this.lines = (options.content || '').replace(/\\r\\n/g, '\\n').split('\\n');\n this.height = options.height || 15;\n\n // Initial check if content fits without scrolling\n if (this.lines.length <= this.height) {\n this.hasReachedBottom = true;\n }\n }\n\n protected render(_firstRender: boolean): void {\n const width = this.stdout.columns || 80;\n const contentWidth = width - 4; // Border (2) + Padding (2)\n\n // 1. Header & Progress\n const percent = Math.min(100, Math.round(((this.scrollTop + this.height) / Math.max(this.height, this.lines.length)) * 100));\n const header = `${theme.title}${symbols.pointer} ${ANSI.BOLD}${this.options.message}${ANSI.RESET} ${theme.muted}[${percent}%]${ANSI.RESET}`;\n\n // 2. Viewport\n const visibleLines = this.lines.slice(this.scrollTop, this.scrollTop + this.height);\n\n // Fill empty lines if content is shorter than height\n while (visibleLines.length < this.height) {\n visibleLines.push('');\n }\n\n const borderTop = `${theme.muted}${symbols.topLeft}${symbols.horizontal.repeat(width - 2)}${symbols.topRight}${ANSI.RESET}`;\n const borderBottom = `${theme.muted}${symbols.bottomLeft}${symbols.horizontal.repeat(width - 2)}${symbols.bottomRight}${ANSI.RESET}`;\n\n const contentRows = visibleLines.map(line => {\n let displayLine = line;\n const len = stringWidth(displayLine);\n if (len > contentWidth) {\n // Truncate\n displayLine = this.truncate(displayLine, contentWidth);\n } else {\n // Pad\n displayLine += ' '.repeat(contentWidth - len);\n }\n return `${theme.muted}${symbols.vertical}${ANSI.RESET} ${displayLine} ${theme.muted}${symbols.vertical}${ANSI.RESET}`;\n });\n\n // 3. Footer / Status\n let footer = '';\n if (this.showError) {\n footer = `${theme.error}>> Please scroll to the bottom before proceeding.${ANSI.RESET}`;\n } else if (this.options.requireScrollToBottom && !this.hasReachedBottom) {\n footer = `${theme.muted}(Scroll down to read more)${ANSI.RESET}`;\n } else {\n footer = `${theme.success}>> Press Enter to accept${ANSI.RESET}`;\n }\n\n const output = [\n header,\n borderTop,\n ...contentRows,\n borderBottom,\n footer\n ].join('\\n');\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string, key: Buffer): void {\n // Enter\n if (char === '\\r' || char === '\\n') {\n if (this.options.requireScrollToBottom && !this.hasReachedBottom) {\n this.showError = true;\n this.render(false);\n return;\n }\n this.submit(true);\n return;\n }\n\n let didScroll = false;\n\n // Up / k\n if (this.isUp(char) || char === 'k') {\n if (this.scrollTop > 0) {\n this.scrollTop--;\n didScroll = true;\n }\n }\n // Down / j\n else if (this.isDown(char) || char === 'j') {\n if (this.scrollTop + this.height < this.lines.length) {\n this.scrollTop++;\n didScroll = true;\n }\n }\n // PageUp\n else if (key.toString('hex') === '1b5b357e') { // Standard PageUp sequence\n this.scrollTop = Math.max(0, this.scrollTop - this.height);\n didScroll = true;\n }\n // PageDown / Space\n else if (char === ' ' || key.toString('hex') === '1b5b367e') { // Standard PageDown sequence\n this.scrollTop = Math.min(this.lines.length - this.height, this.scrollTop + this.height);\n if (this.scrollTop < 0) this.scrollTop = 0; // Fix if content < height\n didScroll = true;\n }\n // Home\n else if (key.toString('hex') === '1b5b48') {\n this.scrollTop = 0;\n didScroll = true;\n }\n // End\n else if (key.toString('hex') === '1b5b46') {\n this.scrollTop = Math.max(0, this.lines.length - this.height);\n didScroll = true;\n }\n\n if (didScroll) {\n this.showError = false;\n // Check if reached bottom\n if (this.scrollTop + this.height >= this.lines.length) {\n this.hasReachedBottom = true;\n }\n this.render(false);\n }\n }\n\n protected handleMouse(event: import('../types').MouseEvent): void {\n if (event.action === 'scroll') {\n let didScroll = false;\n if (event.scroll === 'up') {\n if (this.scrollTop > 0) {\n this.scrollTop--;\n didScroll = true;\n }\n } else if (event.scroll === 'down') {\n if (this.scrollTop + this.height < this.lines.length) {\n this.scrollTop++;\n didScroll = true;\n }\n }\n\n if (didScroll) {\n this.showError = false;\n if (this.scrollTop + this.height >= this.lines.length) {\n this.hasReachedBottom = true;\n }\n this.render(false);\n }\n }\n }\n}\n"],"names":["ScrollPrompt","Prompt","render","_firstRender","width","stdout","columns","contentWidth","percent","Math","min","round","scrollTop","height","max","lines","length","header","theme","title","symbols","pointer","ANSI","BOLD","options","message","RESET","muted","visibleLines","slice","push","borderTop","topLeft","horizontal","repeat","topRight","borderBottom","bottomLeft","bottomRight","contentRows","map","line","displayLine","len","stringWidth","truncate","vertical","footer","showError","error","requireScrollToBottom","hasReachedBottom","success","output","join","renderFrame","handleInput","char","key","submit","didScroll","isUp","isDown","toString","handleMouse","event","action","scroll","content","replace","split"],"mappings":"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"}
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "SeatPrompt", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return SeatPrompt;
9
+ }
10
+ });
11
+ const _base = require("../base");
12
+ const _ansi = require("../ansi");
13
+ const _theme = require("../theme");
14
+ function _define_property(obj, key, value) {
15
+ if (key in obj) {
16
+ Object.defineProperty(obj, key, {
17
+ value: value,
18
+ enumerable: true,
19
+ configurable: true,
20
+ writable: true
21
+ });
22
+ } else {
23
+ obj[key] = value;
24
+ }
25
+ return obj;
26
+ }
27
+ let SeatPrompt = class SeatPrompt extends _base.Prompt {
28
+ parseLayout() {
29
+ this.height = this.options.layout.length;
30
+ this.width = 0;
31
+ this.grid = this.options.layout.map((line, y)=>{
32
+ if (line.length > this.width) this.width = line.length;
33
+ return line.split('').map((char, x)=>{
34
+ const isGap = char === '_' || char === ' ';
35
+ // Convention: 'X' is occupied.
36
+ const isOccupied = char.toUpperCase() === 'X';
37
+ // Label generation: Rows (A, B...), Cols (1, 2...)
38
+ const rowLabel = this.options.rows ? this.options.rows[y] || String(y + 1) : String.fromCharCode(65 + y);
39
+ const colLabel = this.options.cols ? this.options.cols[x] || String(x + 1) : String(x + 1);
40
+ const label = `${rowLabel}${colLabel}`;
41
+ const selectable = !isGap;
42
+ let status = 'available';
43
+ if (isOccupied) status = 'occupied';
44
+ if (this.selected.has(label)) status = 'selected'; // Though this is dynamic state
45
+ // Initialize cursor to first available seat
46
+ if (selectable && status !== 'occupied' && !this.initializedCursor) {
47
+ this.cursorX = x;
48
+ this.cursorY = y;
49
+ this.initializedCursor = true;
50
+ }
51
+ return {
52
+ x,
53
+ y,
54
+ char,
55
+ label,
56
+ selectable,
57
+ status
58
+ };
59
+ });
60
+ });
61
+ }
62
+ render(_firstRender) {
63
+ let output = `${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}\n`;
64
+ output += `${_theme.theme.muted}(Use arrows to move, Space to select, Enter to confirm)${_ansi.ANSI.RESET}\n\n`;
65
+ this.grid.forEach((row, y)=>{
66
+ let lineStr = '';
67
+ row.forEach((node, x)=>{
68
+ const isCursor = x === this.cursorX && y === this.cursorY;
69
+ const isSelected = this.selected.has(node.label);
70
+ const charDisplay = node.char;
71
+ // If occupied, maybe show a different char or color
72
+ let style = _ansi.ANSI.RESET;
73
+ if (node.status === 'occupied') {
74
+ style = _ansi.ANSI.FG_RED;
75
+ } else if (!node.selectable) {
76
+ style = _theme.theme.muted;
77
+ } else {
78
+ style = _theme.theme.main; // Available seats
79
+ }
80
+ if (isSelected) {
81
+ style = _ansi.ANSI.BG_GREEN + _ansi.ANSI.FG_BLACK;
82
+ }
83
+ if (isCursor) {
84
+ // Combine styles? Cursor overrides everything usually
85
+ style = _ansi.ANSI.BG_CYAN + _ansi.ANSI.FG_BLACK;
86
+ }
87
+ lineStr += style + charDisplay + _ansi.ANSI.RESET + ' ';
88
+ });
89
+ output += lineStr + '\n';
90
+ });
91
+ // Show Legend or Current Selection
92
+ if (this.selected.size > 0) {
93
+ output += `\n${_theme.theme.success}Selected: ${Array.from(this.selected).join(', ')}${_ansi.ANSI.RESET}`;
94
+ }
95
+ this.renderFrame(output);
96
+ }
97
+ handleInput(char) {
98
+ if (char === '\r' || char === '\n') {
99
+ this.submit(Array.from(this.selected));
100
+ return;
101
+ }
102
+ if (char === ' ') {
103
+ const row = this.grid[this.cursorY];
104
+ if (!row) return;
105
+ const node = row[this.cursorX];
106
+ if (node && node.selectable && node.status !== 'occupied') {
107
+ if (this.selected.has(node.label)) {
108
+ this.selected.delete(node.label);
109
+ } else {
110
+ if (!this.options.multiple) this.selected.clear();
111
+ this.selected.add(node.label);
112
+ }
113
+ this.render(false);
114
+ }
115
+ return;
116
+ }
117
+ if (this.isUp(char)) this.move(0, -1);
118
+ else if (this.isDown(char)) this.move(0, 1);
119
+ else if (this.isLeft(char)) this.move(-1, 0);
120
+ else if (this.isRight(char)) this.move(1, 0);
121
+ else if (char === '\t') this.move(1, 0);
122
+ else if (char === '\u001b[Z') this.move(-1, 0);
123
+ }
124
+ handleMouse(event) {
125
+ if (event.action === 'scroll') {
126
+ if (event.scroll === 'up') this.move(0, -1);
127
+ else if (event.scroll === 'down') this.move(0, 1);
128
+ }
129
+ }
130
+ move(dx, dy) {
131
+ let nx = this.cursorX;
132
+ let ny = this.cursorY;
133
+ let limit = Math.max(this.width, this.height) + 10;
134
+ do {
135
+ nx += dx;
136
+ ny += dy;
137
+ limit--;
138
+ // Boundary Check
139
+ if (ny < 0 || ny >= this.height) return;
140
+ const row = this.grid[ny];
141
+ if (!row) return;
142
+ if (nx < 0 || nx >= row.length) return;
143
+ const node = row[nx];
144
+ // Stop if node is selectable (seat or occupied seat)
145
+ // Skip gaps ('_' or ' ')
146
+ if (node.selectable) {
147
+ this.cursorX = nx;
148
+ this.cursorY = ny;
149
+ this.render(false);
150
+ return;
151
+ }
152
+ }while (limit > 0)
153
+ }
154
+ constructor(options){
155
+ super(options), _define_property(this, "grid", []), _define_property(this, "cursorX", 0), _define_property(this, "cursorY", 0), _define_property(this, "selected", new Set()), _define_property(this, "height", 0), _define_property(this, "width", 0), _define_property(this, "initializedCursor", false);
156
+ this.parseLayout();
157
+ if (options.initial) {
158
+ options.initial.forEach((id)=>this.selected.add(id));
159
+ }
160
+ this.checkWindowsAttention();
161
+ }
162
+ };
163
+
164
+ //# sourceMappingURL=seat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/prompts/seat.ts"],"sourcesContent":["import { Prompt } from '../base';\nimport { SeatOptions, MouseEvent } from '../types';\nimport { ANSI } from '../ansi';\nimport { theme } from '../theme';\n\ninterface SeatNode {\n x: number;\n y: number;\n char: string;\n label: string;\n selectable: boolean; // Is it a seat (not a gap)?\n status: 'available' | 'occupied' | 'selected';\n}\n\nexport class SeatPrompt extends Prompt<string[], SeatOptions> {\n private grid: SeatNode[][] = [];\n private cursorX: number = 0;\n private cursorY: number = 0;\n private selected: Set<string> = new Set();\n\n private height: number = 0;\n private width: number = 0;\n private initializedCursor = false;\n\n constructor(options: SeatOptions) {\n super(options);\n this.parseLayout();\n if (options.initial) {\n options.initial.forEach(id => this.selected.add(id));\n }\n this.checkWindowsAttention();\n }\n\n private parseLayout() {\n this.height = this.options.layout.length;\n this.width = 0;\n\n this.grid = this.options.layout.map((line, y) => {\n if (line.length > this.width) this.width = line.length;\n\n return line.split('').map((char, x) => {\n const isGap = char === '_' || char === ' ';\n // Convention: 'X' is occupied.\n const isOccupied = char.toUpperCase() === 'X';\n\n // Label generation: Rows (A, B...), Cols (1, 2...)\n const rowLabel = this.options.rows ? (this.options.rows[y] || String(y + 1)) : String.fromCharCode(65 + y);\n const colLabel = this.options.cols ? (this.options.cols[x] || String(x + 1)) : String(x + 1);\n\n const label = `${rowLabel}${colLabel}`;\n\n const selectable = !isGap;\n let status: SeatNode['status'] = 'available';\n\n if (isOccupied) status = 'occupied';\n if (this.selected.has(label)) status = 'selected'; // Though this is dynamic state\n\n // Initialize cursor to first available seat\n if (selectable && status !== 'occupied' && !this.initializedCursor) {\n this.cursorX = x;\n this.cursorY = y;\n this.initializedCursor = true;\n }\n\n return {\n x, y, char, label, selectable, status\n };\n });\n });\n }\n\n protected render(_firstRender: boolean) {\n let output = `${theme.title}${this.options.message}${ANSI.RESET}\\n`;\n output += `${theme.muted}(Use arrows to move, Space to select, Enter to confirm)${ANSI.RESET}\\n\\n`;\n\n this.grid.forEach((row, y) => {\n let lineStr = '';\n row.forEach((node, x) => {\n const isCursor = x === this.cursorX && y === this.cursorY;\n const isSelected = this.selected.has(node.label);\n\n const charDisplay = node.char;\n // If occupied, maybe show a different char or color\n\n let style = ANSI.RESET;\n\n if (node.status === 'occupied') {\n style = ANSI.FG_RED;\n } else if (!node.selectable) {\n style = theme.muted;\n } else {\n style = theme.main; // Available seats\n }\n\n if (isSelected) {\n style = ANSI.BG_GREEN + ANSI.FG_BLACK;\n }\n\n if (isCursor) {\n // Combine styles? Cursor overrides everything usually\n style = ANSI.BG_CYAN + ANSI.FG_BLACK;\n }\n\n lineStr += style + charDisplay + ANSI.RESET + ' ';\n });\n output += lineStr + '\\n';\n });\n\n // Show Legend or Current Selection\n if (this.selected.size > 0) {\n output += `\\n${theme.success}Selected: ${Array.from(this.selected).join(', ')}${ANSI.RESET}`;\n }\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string) {\n if (char === '\\r' || char === '\\n') {\n this.submit(Array.from(this.selected));\n return;\n }\n\n if (char === ' ') {\n const row = this.grid[this.cursorY];\n if (!row) return;\n const node = row[this.cursorX];\n\n if (node && node.selectable && node.status !== 'occupied') {\n if (this.selected.has(node.label)) {\n this.selected.delete(node.label);\n } else {\n if (!this.options.multiple) this.selected.clear();\n this.selected.add(node.label);\n }\n this.render(false);\n }\n return;\n }\n\n if (this.isUp(char)) this.move(0, -1);\n else if (this.isDown(char)) this.move(0, 1);\n else if (this.isLeft(char)) this.move(-1, 0);\n else if (this.isRight(char)) this.move(1, 0);\n\n // Tab / Shift+Tab\n else if (char === '\\t') this.move(1, 0);\n else if (char === '\\u001b[Z') this.move(-1, 0);\n }\n\n protected handleMouse(event: MouseEvent) {\n if (event.action === 'scroll') {\n if (event.scroll === 'up') this.move(0, -1);\n else if (event.scroll === 'down') this.move(0, 1);\n }\n }\n\n private move(dx: number, dy: number) {\n let nx = this.cursorX;\n let ny = this.cursorY;\n let limit = Math.max(this.width, this.height) + 10;\n\n do {\n nx += dx;\n ny += dy;\n limit--;\n\n // Boundary Check\n if (ny < 0 || ny >= this.height) return;\n const row = this.grid[ny];\n if (!row) return;\n if (nx < 0 || nx >= row.length) return;\n\n const node = row[nx];\n // Stop if node is selectable (seat or occupied seat)\n // Skip gaps ('_' or ' ')\n if (node.selectable) {\n this.cursorX = nx;\n this.cursorY = ny;\n this.render(false);\n return;\n }\n\n } while (limit > 0);\n }\n}\n"],"names":["SeatPrompt","Prompt","parseLayout","height","options","layout","length","width","grid","map","line","y","split","char","x","isGap","isOccupied","toUpperCase","rowLabel","rows","String","fromCharCode","colLabel","cols","label","selectable","status","selected","has","initializedCursor","cursorX","cursorY","render","_firstRender","output","theme","title","message","ANSI","RESET","muted","forEach","row","lineStr","node","isCursor","isSelected","charDisplay","style","FG_RED","main","BG_GREEN","FG_BLACK","BG_CYAN","size","success","Array","from","join","renderFrame","handleInput","submit","delete","multiple","clear","add","isUp","move","isDown","isLeft","isRight","handleMouse","event","action","scroll","dx","dy","nx","ny","limit","Math","max","Set","initial","id","checkWindowsAttention"],"mappings":";;;;+BAcaA;;;eAAAA;;;sBAdU;sBAEF;uBACC;;;;;;;;;;;;;;AAWf,IAAA,AAAMA,aAAN,MAAMA,mBAAmBC,YAAM;IAmB1BC,cAAc;QAClB,IAAI,CAACC,MAAM,GAAG,IAAI,CAACC,OAAO,CAACC,MAAM,CAACC,MAAM;QACxC,IAAI,CAACC,KAAK,GAAG;QAEb,IAAI,CAACC,IAAI,GAAG,IAAI,CAACJ,OAAO,CAACC,MAAM,CAACI,GAAG,CAAC,CAACC,MAAMC;YACvC,IAAID,KAAKJ,MAAM,GAAG,IAAI,CAACC,KAAK,EAAE,IAAI,CAACA,KAAK,GAAGG,KAAKJ,MAAM;YAEtD,OAAOI,KAAKE,KAAK,CAAC,IAAIH,GAAG,CAAC,CAACI,MAAMC;gBAC7B,MAAMC,QAAQF,SAAS,OAAOA,SAAS;gBACvC,+BAA+B;gBAC/B,MAAMG,aAAaH,KAAKI,WAAW,OAAO;gBAE1C,mDAAmD;gBACnD,MAAMC,WAAW,IAAI,CAACd,OAAO,CAACe,IAAI,GAAI,IAAI,CAACf,OAAO,CAACe,IAAI,CAACR,EAAE,IAAIS,OAAOT,IAAI,KAAMS,OAAOC,YAAY,CAAC,KAAKV;gBACxG,MAAMW,WAAW,IAAI,CAAClB,OAAO,CAACmB,IAAI,GAAI,IAAI,CAACnB,OAAO,CAACmB,IAAI,CAACT,EAAE,IAAIM,OAAON,IAAI,KAAMM,OAAON,IAAI;gBAE1F,MAAMU,QAAQ,GAAGN,WAAWI,UAAU;gBAEtC,MAAMG,aAAa,CAACV;gBACpB,IAAIW,SAA6B;gBAEjC,IAAIV,YAAYU,SAAS;gBACzB,IAAI,IAAI,CAACC,QAAQ,CAACC,GAAG,CAACJ,QAAQE,SAAS,YAAY,+BAA+B;gBAElF,4CAA4C;gBAC5C,IAAID,cAAcC,WAAW,cAAc,CAAC,IAAI,CAACG,iBAAiB,EAAE;oBAChE,IAAI,CAACC,OAAO,GAAGhB;oBACf,IAAI,CAACiB,OAAO,GAAGpB;oBACf,IAAI,CAACkB,iBAAiB,GAAG;gBAC7B;gBAEA,OAAO;oBACHf;oBAAGH;oBAAGE;oBAAMW;oBAAOC;oBAAYC;gBACnC;YACJ;QACJ;IACJ;IAEUM,OAAOC,YAAqB,EAAE;QACpC,IAAIC,SAAS,GAAGC,YAAK,CAACC,KAAK,GAAG,IAAI,CAAChC,OAAO,CAACiC,OAAO,GAAGC,UAAI,CAACC,KAAK,CAAC,EAAE,CAAC;QACnEL,UAAU,GAAGC,YAAK,CAACK,KAAK,CAAC,uDAAuD,EAAEF,UAAI,CAACC,KAAK,CAAC,IAAI,CAAC;QAElG,IAAI,CAAC/B,IAAI,CAACiC,OAAO,CAAC,CAACC,KAAK/B;YACpB,IAAIgC,UAAU;YACdD,IAAID,OAAO,CAAC,CAACG,MAAM9B;gBACf,MAAM+B,WAAW/B,MAAM,IAAI,CAACgB,OAAO,IAAInB,MAAM,IAAI,CAACoB,OAAO;gBACzD,MAAMe,aAAa,IAAI,CAACnB,QAAQ,CAACC,GAAG,CAACgB,KAAKpB,KAAK;gBAE/C,MAAMuB,cAAcH,KAAK/B,IAAI;gBAC7B,oDAAoD;gBAEpD,IAAImC,QAAQV,UAAI,CAACC,KAAK;gBAEtB,IAAIK,KAAKlB,MAAM,KAAK,YAAY;oBAC5BsB,QAAQV,UAAI,CAACW,MAAM;gBACvB,OAAO,IAAI,CAACL,KAAKnB,UAAU,EAAE;oBACzBuB,QAAQb,YAAK,CAACK,KAAK;gBACvB,OAAO;oBACHQ,QAAQb,YAAK,CAACe,IAAI,EAAE,kBAAkB;gBAC1C;gBAEA,IAAIJ,YAAY;oBACZE,QAAQV,UAAI,CAACa,QAAQ,GAAGb,UAAI,CAACc,QAAQ;gBACzC;gBAEA,IAAIP,UAAU;oBACV,sDAAsD;oBACtDG,QAAQV,UAAI,CAACe,OAAO,GAAGf,UAAI,CAACc,QAAQ;gBACxC;gBAEAT,WAAWK,QAAQD,cAAcT,UAAI,CAACC,KAAK,GAAG;YAClD;YACAL,UAAUS,UAAU;QACxB;QAEA,mCAAmC;QACnC,IAAI,IAAI,CAAChB,QAAQ,CAAC2B,IAAI,GAAG,GAAG;YACxBpB,UAAU,CAAC,EAAE,EAAEC,YAAK,CAACoB,OAAO,CAAC,UAAU,EAAEC,MAAMC,IAAI,CAAC,IAAI,CAAC9B,QAAQ,EAAE+B,IAAI,CAAC,QAAQpB,UAAI,CAACC,KAAK,EAAE;QAChG;QAEA,IAAI,CAACoB,WAAW,CAACzB;IACrB;IAEU0B,YAAY/C,IAAY,EAAE;QAChC,IAAIA,SAAS,QAAQA,SAAS,MAAM;YAChC,IAAI,CAACgD,MAAM,CAACL,MAAMC,IAAI,CAAC,IAAI,CAAC9B,QAAQ;YACpC;QACJ;QAEA,IAAId,SAAS,KAAK;YACd,MAAM6B,MAAM,IAAI,CAAClC,IAAI,CAAC,IAAI,CAACuB,OAAO,CAAC;YACnC,IAAI,CAACW,KAAK;YACV,MAAME,OAAOF,GAAG,CAAC,IAAI,CAACZ,OAAO,CAAC;YAE9B,IAAIc,QAAQA,KAAKnB,UAAU,IAAImB,KAAKlB,MAAM,KAAK,YAAY;gBACvD,IAAI,IAAI,CAACC,QAAQ,CAACC,GAAG,CAACgB,KAAKpB,KAAK,GAAG;oBAC/B,IAAI,CAACG,QAAQ,CAACmC,MAAM,CAAClB,KAAKpB,KAAK;gBACnC,OAAO;oBACH,IAAI,CAAC,IAAI,CAACpB,OAAO,CAAC2D,QAAQ,EAAE,IAAI,CAACpC,QAAQ,CAACqC,KAAK;oBAC/C,IAAI,CAACrC,QAAQ,CAACsC,GAAG,CAACrB,KAAKpB,KAAK;gBAChC;gBACA,IAAI,CAACQ,MAAM,CAAC;YAChB;YACA;QACJ;QAEA,IAAI,IAAI,CAACkC,IAAI,CAACrD,OAAO,IAAI,CAACsD,IAAI,CAAC,GAAG,CAAC;aAC9B,IAAI,IAAI,CAACC,MAAM,CAACvD,OAAO,IAAI,CAACsD,IAAI,CAAC,GAAG;aACpC,IAAI,IAAI,CAACE,MAAM,CAACxD,OAAO,IAAI,CAACsD,IAAI,CAAC,CAAC,GAAG;aACrC,IAAI,IAAI,CAACG,OAAO,CAACzD,OAAO,IAAI,CAACsD,IAAI,CAAC,GAAG;aAGrC,IAAItD,SAAS,MAAM,IAAI,CAACsD,IAAI,CAAC,GAAG;aAChC,IAAItD,SAAS,YAAY,IAAI,CAACsD,IAAI,CAAC,CAAC,GAAG;IAChD;IAEUI,YAAYC,KAAiB,EAAE;QACrC,IAAIA,MAAMC,MAAM,KAAK,UAAU;YAC3B,IAAID,MAAME,MAAM,KAAK,MAAM,IAAI,CAACP,IAAI,CAAC,GAAG,CAAC;iBACpC,IAAIK,MAAME,MAAM,KAAK,QAAQ,IAAI,CAACP,IAAI,CAAC,GAAG;QACnD;IACJ;IAEQA,KAAKQ,EAAU,EAAEC,EAAU,EAAE;QACjC,IAAIC,KAAK,IAAI,CAAC/C,OAAO;QACrB,IAAIgD,KAAK,IAAI,CAAC/C,OAAO;QACrB,IAAIgD,QAAQC,KAAKC,GAAG,CAAC,IAAI,CAAC1E,KAAK,EAAE,IAAI,CAACJ,MAAM,IAAI;QAEhD,GAAG;YACC0E,MAAMF;YACNG,MAAMF;YACNG;YAEA,iBAAiB;YACjB,IAAID,KAAK,KAAKA,MAAM,IAAI,CAAC3E,MAAM,EAAE;YACjC,MAAMuC,MAAM,IAAI,CAAClC,IAAI,CAACsE,GAAG;YACzB,IAAI,CAACpC,KAAK;YACV,IAAImC,KAAK,KAAKA,MAAMnC,IAAIpC,MAAM,EAAE;YAEhC,MAAMsC,OAAOF,GAAG,CAACmC,GAAG;YACpB,qDAAqD;YACrD,yBAAyB;YACzB,IAAIjC,KAAKnB,UAAU,EAAE;gBACjB,IAAI,CAACK,OAAO,GAAG+C;gBACf,IAAI,CAAC9C,OAAO,GAAG+C;gBACf,IAAI,CAAC9C,MAAM,CAAC;gBACZ;YACJ;QAEJ,QAAS+C,QAAQ,EAAG;IACxB;IA/JA,YAAY3E,OAAoB,CAAE;QAC9B,KAAK,CAACA,UAVV,uBAAQI,QAAqB,EAAE,GAC/B,uBAAQsB,WAAkB,IAC1B,uBAAQC,WAAkB,IAC1B,uBAAQJ,YAAwB,IAAIuD,QAEpC,uBAAQ/E,UAAiB,IACzB,uBAAQI,SAAgB,IACxB,uBAAQsB,qBAAoB;QAIxB,IAAI,CAAC3B,WAAW;QAChB,IAAIE,QAAQ+E,OAAO,EAAE;YACjB/E,QAAQ+E,OAAO,CAAC1C,OAAO,CAAC2C,CAAAA,KAAM,IAAI,CAACzD,QAAQ,CAACsC,GAAG,CAACmB;QACpD;QACA,IAAI,CAACC,qBAAqB;IAC9B;AAyJJ"}
@@ -1,28 +1,37 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SelectRangePrompt = void 0;
4
- const ansi_1 = require("../ansi");
5
- const theme_1 = require("../theme");
6
- const symbols_1 = require("../symbols");
7
- const select_1 = require("./select");
8
- class SelectRangePrompt extends select_1.SelectPrompt {
9
- constructor(options) {
10
- super(options);
11
- this.anchorIndex = null;
12
- if (options.initial) {
13
- const maxIdx = Math.max(0, options.choices.length - 1);
14
- this.anchorIndex = Math.min(Math.max(0, options.initial[0]), maxIdx);
15
- this.selectedIndex = Math.min(Math.max(0, options.initial[1]), maxIdx);
16
- }
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "SelectRangePrompt", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return SelectRangePrompt;
17
9
  }
10
+ });
11
+ const _ansi = require("../ansi");
12
+ const _theme = require("../theme");
13
+ const _symbols = require("../symbols");
14
+ const _select = require("./select");
15
+ function _define_property(obj, key, value) {
16
+ if (key in obj) {
17
+ Object.defineProperty(obj, key, {
18
+ value: value,
19
+ enumerable: true,
20
+ configurable: true,
21
+ writable: true
22
+ });
23
+ } else {
24
+ obj[key] = value;
25
+ }
26
+ return obj;
27
+ }
28
+ let SelectRangePrompt = class SelectRangePrompt extends _select.SelectPrompt {
18
29
  handleInput(char, _key) {
19
30
  // Handle Enter (Submit)
20
31
  if (char === '\r' || char === '\n') {
21
32
  const choices = this.getFilteredChoices();
22
- if (choices.length === 0)
23
- return;
24
- if (this.isSeparator(choices[this.selectedIndex]))
25
- return;
33
+ if (choices.length === 0) return;
34
+ if (this.isSeparator(choices[this.selectedIndex])) return;
26
35
  let start = this.selectedIndex;
27
36
  let end = this.selectedIndex;
28
37
  if (this.anchorIndex !== null) {
@@ -30,7 +39,7 @@ class SelectRangePrompt extends select_1.SelectPrompt {
30
39
  end = Math.max(this.anchorIndex, this.selectedIndex);
31
40
  }
32
41
  const selectedItems = [];
33
- for (let i = start; i <= end; i++) {
42
+ for(let i = start; i <= end; i++){
34
43
  const choice = choices[i];
35
44
  if (!this.isSeparator(choice)) {
36
45
  selectedItems.push(choice.value);
@@ -43,8 +52,7 @@ class SelectRangePrompt extends select_1.SelectPrompt {
43
52
  if (char === ' ') {
44
53
  if (this.anchorIndex === null) {
45
54
  this.anchorIndex = this.selectedIndex;
46
- }
47
- else {
55
+ } else {
48
56
  this.anchorIndex = null;
49
57
  }
50
58
  this.render(false);
@@ -64,25 +72,22 @@ class SelectRangePrompt extends select_1.SelectPrompt {
64
72
  // Scroll Logic
65
73
  if (this.selectedIndex < this.scrollTop) {
66
74
  this.scrollTop = this.selectedIndex;
67
- }
68
- else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
75
+ } else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
69
76
  this.scrollTop = this.selectedIndex - this.pageSize + 1;
70
77
  }
71
78
  if (this.scrollTop > choices.length - 1) {
72
79
  this.scrollTop = Math.max(0, choices.length - this.pageSize);
73
80
  }
74
81
  // Header
75
- const searchStr = this.searchBuffer ? ` ${theme_1.theme.muted}(Filter: ${this.searchBuffer})${ansi_1.ANSI.RESET}` : '';
76
- output += `${theme_1.theme.success}?${ansi_1.ANSI.RESET} ${ansi_1.ANSI.BOLD}${theme_1.theme.title}${this.options.message}${ansi_1.ANSI.RESET}${searchStr}\n`;
82
+ const searchStr = this.searchBuffer ? ` ${_theme.theme.muted}(Filter: ${this.searchBuffer})${_ansi.ANSI.RESET}` : '';
83
+ output += `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}${searchStr}\n`;
77
84
  if (choices.length === 0) {
78
- output += ` ${theme_1.theme.muted}No results found${ansi_1.ANSI.RESET}`;
79
- }
80
- else {
85
+ output += ` ${_theme.theme.muted}No results found${_ansi.ANSI.RESET}`;
86
+ } else {
81
87
  const visibleChoices = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);
82
- visibleChoices.forEach((choice, index) => {
88
+ visibleChoices.forEach((choice, index)=>{
83
89
  const actualIndex = this.scrollTop + index;
84
- if (index > 0)
85
- output += '\n';
90
+ if (index > 0) output += '\n';
86
91
  let isSelected = false;
87
92
  if (this.anchorIndex !== null) {
88
93
  const min = Math.min(this.anchorIndex, this.selectedIndex);
@@ -90,47 +95,54 @@ class SelectRangePrompt extends select_1.SelectPrompt {
90
95
  if (actualIndex >= min && actualIndex <= max) {
91
96
  isSelected = true;
92
97
  }
93
- }
94
- else if (actualIndex === this.selectedIndex) {
98
+ } else if (actualIndex === this.selectedIndex) {
95
99
  isSelected = true;
96
100
  }
97
101
  if (this.isSeparator(choice)) {
98
- output += ` ${ansi_1.ANSI.DIM}${choice.text || symbols_1.symbols.line.repeat(8)}${ansi_1.ANSI.RESET}`;
99
- }
100
- else {
102
+ output += ` ${_ansi.ANSI.DIM}${choice.text || _symbols.symbols.line.repeat(8)}${_ansi.ANSI.RESET}`;
103
+ } else {
101
104
  let prefix = ' ';
102
105
  const title = choice.title;
103
106
  let content = title;
104
107
  // Anchor Marker
105
108
  if (actualIndex === this.anchorIndex) {
106
- prefix = `${theme_1.theme.muted}> ${ansi_1.ANSI.RESET}`;
109
+ prefix = `${_theme.theme.muted}> ${_ansi.ANSI.RESET}`;
107
110
  }
108
111
  // Cursor Marker
109
112
  if (actualIndex === this.selectedIndex) {
110
- prefix = `${theme_1.theme.main}${symbols_1.symbols.pointer} `;
113
+ prefix = `${_theme.theme.main}${_symbols.symbols.pointer} `;
111
114
  }
112
115
  // Combined Marker
113
116
  if (actualIndex === this.selectedIndex && actualIndex === this.anchorIndex) {
114
- prefix = `${theme_1.theme.main}${symbols_1.symbols.pointer}>`;
117
+ prefix = `${_theme.theme.main}${_symbols.symbols.pointer}>`;
115
118
  }
116
119
  // Highlighting
117
120
  if (isSelected) {
118
121
  // Inside the range (and not cursor/anchor which have their own prefixes)
119
122
  if (actualIndex !== this.selectedIndex && actualIndex !== this.anchorIndex) {
120
- prefix = `${theme_1.theme.success}* ${ansi_1.ANSI.RESET}`;
123
+ prefix = `${_theme.theme.success}* ${_ansi.ANSI.RESET}`;
121
124
  }
122
- content = `${theme_1.theme.success}${title}${ansi_1.ANSI.RESET}`;
125
+ content = `${_theme.theme.success}${title}${_ansi.ANSI.RESET}`;
123
126
  }
124
127
  // Underline Cursor
125
128
  if (actualIndex === this.selectedIndex) {
126
- content = `${ansi_1.ANSI.UNDERLINE}${content}${ansi_1.ANSI.RESET}`;
129
+ content = `${_ansi.ANSI.UNDERLINE}${content}${_ansi.ANSI.RESET}`;
127
130
  }
128
131
  output += `${prefix}${content}`;
129
132
  }
130
133
  });
131
134
  }
132
- output += `\n${theme_1.theme.muted}(Space to anchor, Enter to submit)${ansi_1.ANSI.RESET}`;
135
+ output += `\n${_theme.theme.muted}(Space to anchor, Enter to submit)${_ansi.ANSI.RESET}`;
133
136
  this.renderFrame(output);
134
137
  }
135
- }
136
- exports.SelectRangePrompt = SelectRangePrompt;
138
+ constructor(options){
139
+ super(options), _define_property(this, "anchorIndex", null);
140
+ if (options.initial) {
141
+ const maxIdx = Math.max(0, options.choices.length - 1);
142
+ this.anchorIndex = Math.min(Math.max(0, options.initial[0]), maxIdx);
143
+ this.selectedIndex = Math.min(Math.max(0, options.initial[1]), maxIdx);
144
+ }
145
+ }
146
+ };
147
+
148
+ //# sourceMappingURL=select-range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/prompts/select-range.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { SelectRangeOptions } from '../types';\nimport { SelectPrompt } from './select';\n\nexport class SelectRangePrompt<V> extends SelectPrompt<V, SelectRangeOptions<V>> {\n protected anchorIndex: number | null = null;\n\n constructor(options: SelectRangeOptions<V>) {\n super(options);\n if (options.initial) {\n const maxIdx = Math.max(0, options.choices.length - 1);\n this.anchorIndex = Math.min(Math.max(0, options.initial[0]), maxIdx);\n this.selectedIndex = Math.min(Math.max(0, options.initial[1]), maxIdx);\n }\n }\n\n protected handleInput(char: string, _key?: Buffer) {\n // Handle Enter (Submit)\n if (char === '\\r' || char === '\\n') {\n const choices = this.getFilteredChoices();\n if (choices.length === 0) return;\n if (this.isSeparator(choices[this.selectedIndex])) return;\n\n let start = this.selectedIndex;\n let end = this.selectedIndex;\n\n if (this.anchorIndex !== null) {\n start = Math.min(this.anchorIndex, this.selectedIndex);\n end = Math.max(this.anchorIndex, this.selectedIndex);\n }\n\n const selectedItems: V[] = [];\n for (let i = start; i <= end; i++) {\n const choice = choices[i];\n if (!this.isSeparator(choice)) {\n selectedItems.push(choice.value);\n }\n }\n\n this.submit(selectedItems);\n return;\n }\n\n // Handle Space (Anchor)\n if (char === ' ') {\n if (this.anchorIndex === null) {\n this.anchorIndex = this.selectedIndex;\n } else {\n this.anchorIndex = null;\n }\n this.render(false);\n return;\n }\n\n // Delegate navigation and search to SelectPrompt\n super.handleInput(char);\n\n // Check bounds after navigation/filtering\n const choices = this.getFilteredChoices();\n if (this.anchorIndex !== null && this.anchorIndex >= choices.length) {\n this.anchorIndex = null;\n }\n }\n\n protected render(_firstRender: boolean) {\n let output = '';\n const choices = this.getFilteredChoices();\n\n // Scroll Logic\n if (this.selectedIndex < this.scrollTop) {\n this.scrollTop = this.selectedIndex;\n } else if (this.selectedIndex >= this.scrollTop + this.pageSize) {\n this.scrollTop = this.selectedIndex - this.pageSize + 1;\n }\n if (this.scrollTop > choices.length - 1) {\n this.scrollTop = Math.max(0, choices.length - this.pageSize);\n }\n\n // Header\n const searchStr = this.searchBuffer ? ` ${theme.muted}(Filter: ${this.searchBuffer})${ANSI.RESET}` : '';\n output += `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}${searchStr}\\n`;\n\n if (choices.length === 0) {\n output += ` ${theme.muted}No results found${ANSI.RESET}`;\n } else {\n const visibleChoices = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);\n\n visibleChoices.forEach((choice, index) => {\n const actualIndex = this.scrollTop + index;\n if (index > 0) output += '\\n';\n\n let isSelected = false;\n if (this.anchorIndex !== null) {\n const min = Math.min(this.anchorIndex, this.selectedIndex);\n const max = Math.max(this.anchorIndex, this.selectedIndex);\n if (actualIndex >= min && actualIndex <= max) {\n isSelected = true;\n }\n } else if (actualIndex === this.selectedIndex) {\n isSelected = true;\n }\n\n if (this.isSeparator(choice)) {\n output += ` ${ANSI.DIM}${choice.text || symbols.line.repeat(8)}${ANSI.RESET}`;\n } else {\n let prefix = ' ';\n const title = choice.title;\n let content = title;\n\n // Anchor Marker\n if (actualIndex === this.anchorIndex) {\n prefix = `${theme.muted}> ${ANSI.RESET}`;\n }\n\n // Cursor Marker\n if (actualIndex === this.selectedIndex) {\n prefix = `${theme.main}${symbols.pointer} `;\n }\n\n // Combined Marker\n if (actualIndex === this.selectedIndex && actualIndex === this.anchorIndex) {\n prefix = `${theme.main}${symbols.pointer}>`;\n }\n\n // Highlighting\n if (isSelected) {\n // Inside the range (and not cursor/anchor which have their own prefixes)\n if (actualIndex !== this.selectedIndex && actualIndex !== this.anchorIndex) {\n prefix = `${theme.success}* ${ANSI.RESET}`;\n }\n\n content = `${theme.success}${title}${ANSI.RESET}`;\n }\n\n // Underline Cursor\n if (actualIndex === this.selectedIndex) {\n content = `${ANSI.UNDERLINE}${content}${ANSI.RESET}`;\n }\n\n output += `${prefix}${content}`;\n }\n });\n }\n\n output += `\\n${theme.muted}(Space to anchor, Enter to submit)${ANSI.RESET}`;\n\n this.renderFrame(output);\n }\n}\n"],"names":["SelectRangePrompt","SelectPrompt","handleInput","char","_key","choices","getFilteredChoices","length","isSeparator","selectedIndex","start","end","anchorIndex","Math","min","max","selectedItems","i","choice","push","value","submit","render","_firstRender","output","scrollTop","pageSize","searchStr","searchBuffer","theme","muted","ANSI","RESET","success","BOLD","title","options","message","visibleChoices","slice","forEach","index","actualIndex","isSelected","DIM","text","symbols","line","repeat","prefix","content","main","pointer","UNDERLINE","renderFrame","initial","maxIdx"],"mappings":"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"}