mepcli 1.3.2 → 2.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. package/README.md +11 -2
  2. package/dist/{ansi.js → src/ansi.js} +17 -9
  3. package/dist/src/ansi.js.map +1 -0
  4. package/dist/{base.js → src/base.js} +82 -70
  5. package/dist/src/base.js.map +1 -0
  6. package/dist/{core.js → src/core.js} +266 -320
  7. package/dist/src/core.js.map +1 -0
  8. package/dist/src/data/countries.js +569 -0
  9. package/dist/src/data/countries.js.map +1 -0
  10. package/dist/src/data/licenses.js +480 -0
  11. package/dist/src/data/licenses.js.map +1 -0
  12. package/dist/{highlight.js → src/highlight.js} +77 -69
  13. package/dist/src/highlight.js.map +1 -0
  14. package/dist/src/index.js +66 -0
  15. package/dist/src/index.js.map +1 -0
  16. package/dist/{input.js → src/input.js} +47 -41
  17. package/dist/src/input.js.map +1 -0
  18. package/dist/src/pipeline.js +273 -0
  19. package/dist/src/pipeline.js.map +1 -0
  20. package/dist/{prompts → src/prompts}/autocomplete.js +58 -57
  21. package/dist/src/prompts/autocomplete.js.map +1 -0
  22. package/dist/{prompts → src/prompts}/box.js +86 -53
  23. package/dist/src/prompts/box.js.map +1 -0
  24. package/dist/{prompts → src/prompts}/breadcrumb-search.js +110 -98
  25. package/dist/src/prompts/breadcrumb-search.js.map +1 -0
  26. package/dist/{prompts → src/prompts}/breadcrumb.js +126 -121
  27. package/dist/src/prompts/breadcrumb.js.map +1 -0
  28. package/dist/{prompts → src/prompts}/byte.js +69 -52
  29. package/dist/src/prompts/byte.js.map +1 -0
  30. package/dist/{prompts → src/prompts}/calculator.js +79 -56
  31. package/dist/src/prompts/calculator.js.map +1 -0
  32. package/dist/{prompts → src/prompts}/calendar.js +167 -127
  33. package/dist/src/prompts/calendar.js.map +1 -0
  34. package/dist/{prompts → src/prompts}/checkbox.js +53 -49
  35. package/dist/src/prompts/checkbox.js.map +1 -0
  36. package/dist/{prompts → src/prompts}/code.js +88 -76
  37. package/dist/src/prompts/code.js.map +1 -0
  38. package/dist/{prompts → src/prompts}/color.js +68 -50
  39. package/dist/src/prompts/color.js.map +1 -0
  40. package/dist/{prompts → src/prompts}/confirm.js +22 -15
  41. package/dist/src/prompts/confirm.js.map +1 -0
  42. package/dist/{prompts → src/prompts}/connection-string.js +59 -36
  43. package/dist/src/prompts/connection-string.js.map +1 -0
  44. package/dist/{prompts → src/prompts}/cron.js +90 -59
  45. package/dist/src/prompts/cron.js.map +1 -0
  46. package/dist/src/prompts/curl-utils.js +71 -0
  47. package/dist/src/prompts/curl-utils.js.map +1 -0
  48. package/dist/{prompts → src/prompts}/curl.js +153 -132
  49. package/dist/src/prompts/curl.js.map +1 -0
  50. package/dist/{prompts → src/prompts}/data-inspector.js +96 -91
  51. package/dist/src/prompts/data-inspector.js.map +1 -0
  52. package/dist/{prompts → src/prompts}/date.js +64 -57
  53. package/dist/src/prompts/date.js.map +1 -0
  54. package/dist/{prompts → src/prompts}/dependency.js +84 -80
  55. package/dist/src/prompts/dependency.js.map +1 -0
  56. package/dist/{prompts → src/prompts}/dial.js +49 -35
  57. package/dist/src/prompts/dial.js.map +1 -0
  58. package/dist/src/prompts/diff.js +118 -0
  59. package/dist/src/prompts/diff.js.map +1 -0
  60. package/dist/{prompts → src/prompts}/draw.js +83 -80
  61. package/dist/src/prompts/draw.js.map +1 -0
  62. package/dist/src/prompts/editor.js +234 -0
  63. package/dist/src/prompts/editor.js.map +1 -0
  64. package/dist/{prompts → src/prompts}/emoji.js +80 -82
  65. package/dist/src/prompts/emoji.js.map +1 -0
  66. package/dist/{prompts → src/prompts}/exec.js +60 -46
  67. package/dist/src/prompts/exec.js.map +1 -0
  68. package/dist/src/prompts/file.js +217 -0
  69. package/dist/src/prompts/file.js.map +1 -0
  70. package/dist/{prompts → src/prompts}/form.js +63 -54
  71. package/dist/src/prompts/form.js.map +1 -0
  72. package/dist/{prompts → src/prompts}/fuzzy-multi-column.js +65 -53
  73. package/dist/src/prompts/fuzzy-multi-column.js.map +1 -0
  74. package/dist/{prompts → src/prompts}/fuzzy.js +66 -55
  75. package/dist/src/prompts/fuzzy.js.map +1 -0
  76. package/dist/src/prompts/gauge.js +137 -0
  77. package/dist/src/prompts/gauge.js.map +1 -0
  78. package/dist/{prompts → src/prompts}/grid.js +70 -57
  79. package/dist/src/prompts/grid.js.map +1 -0
  80. package/dist/{prompts → src/prompts}/heatmap.js +70 -64
  81. package/dist/src/prompts/heatmap.js.map +1 -0
  82. package/dist/{prompts → src/prompts}/ip.js +56 -36
  83. package/dist/src/prompts/ip.js.map +1 -0
  84. package/dist/{prompts → src/prompts}/kanban.js +63 -58
  85. package/dist/src/prompts/kanban.js.map +1 -0
  86. package/dist/src/prompts/keypress.js +54 -0
  87. package/dist/src/prompts/keypress.js.map +1 -0
  88. package/dist/src/prompts/license.js +144 -0
  89. package/dist/src/prompts/license.js.map +1 -0
  90. package/dist/{prompts → src/prompts}/list.js +46 -31
  91. package/dist/src/prompts/list.js.map +1 -0
  92. package/dist/{prompts → src/prompts}/map.js +93 -77
  93. package/dist/src/prompts/map.js.map +1 -0
  94. package/dist/{prompts → src/prompts}/match.js +91 -95
  95. package/dist/src/prompts/match.js.map +1 -0
  96. package/dist/{prompts → src/prompts}/miller.js +74 -67
  97. package/dist/src/prompts/miller.js.map +1 -0
  98. package/dist/{prompts → src/prompts}/multi-column-select.js +54 -44
  99. package/dist/src/prompts/multi-column-select.js.map +1 -0
  100. package/dist/{prompts → src/prompts}/multi-range.js +70 -52
  101. package/dist/src/prompts/multi-range.js.map +1 -0
  102. package/dist/{prompts → src/prompts}/multi-select.js +67 -58
  103. package/dist/src/prompts/multi-select.js.map +1 -0
  104. package/dist/{prompts → src/prompts}/number.js +51 -39
  105. package/dist/src/prompts/number.js.map +1 -0
  106. package/dist/{prompts → src/prompts}/otp.js +43 -27
  107. package/dist/src/prompts/otp.js.map +1 -0
  108. package/dist/{prompts → src/prompts}/pattern.js +74 -71
  109. package/dist/src/prompts/pattern.js.map +1 -0
  110. package/dist/{prompts → src/prompts}/phone.js +107 -118
  111. package/dist/src/prompts/phone.js.map +1 -0
  112. package/dist/src/prompts/quiz-select.js +114 -0
  113. package/dist/src/prompts/quiz-select.js.map +1 -0
  114. package/dist/src/prompts/quiz-text.js +98 -0
  115. package/dist/src/prompts/quiz-text.js.map +1 -0
  116. package/dist/{prompts → src/prompts}/range.js +85 -61
  117. package/dist/src/prompts/range.js.map +1 -0
  118. package/dist/{prompts → src/prompts}/rating.js +29 -24
  119. package/dist/src/prompts/rating.js.map +1 -0
  120. package/dist/{prompts → src/prompts}/regex.js +50 -36
  121. package/dist/src/prompts/regex.js.map +1 -0
  122. package/dist/{prompts → src/prompts}/region.js +62 -56
  123. package/dist/src/prompts/region.js.map +1 -0
  124. package/dist/{prompts → src/prompts}/schedule.js +82 -75
  125. package/dist/src/prompts/schedule.js.map +1 -0
  126. package/dist/{prompts → src/prompts}/scroll.js +61 -58
  127. package/dist/src/prompts/scroll.js.map +1 -0
  128. package/dist/src/prompts/seat.js +164 -0
  129. package/dist/src/prompts/seat.js.map +1 -0
  130. package/dist/{prompts → src/prompts}/select-range.js +58 -46
  131. package/dist/src/prompts/select-range.js.map +1 -0
  132. package/dist/{prompts → src/prompts}/select.js +65 -66
  133. package/dist/src/prompts/select.js.map +1 -0
  134. package/dist/{prompts → src/prompts}/semver.js +24 -13
  135. package/dist/src/prompts/semver.js.map +1 -0
  136. package/dist/src/prompts/shortcut.js +133 -0
  137. package/dist/src/prompts/shortcut.js.map +1 -0
  138. package/dist/{prompts → src/prompts}/slider.js +28 -23
  139. package/dist/src/prompts/slider.js.map +1 -0
  140. package/dist/src/prompts/slot.js +117 -0
  141. package/dist/src/prompts/slot.js.map +1 -0
  142. package/dist/{prompts → src/prompts}/snippet.js +82 -61
  143. package/dist/src/prompts/snippet.js.map +1 -0
  144. package/dist/{prompts → src/prompts}/sort-grid.js +64 -59
  145. package/dist/src/prompts/sort-grid.js.map +1 -0
  146. package/dist/{prompts → src/prompts}/sort.js +59 -49
  147. package/dist/src/prompts/sort.js.map +1 -0
  148. package/dist/src/prompts/spam.js +80 -0
  149. package/dist/src/prompts/spam.js.map +1 -0
  150. package/dist/{prompts → src/prompts}/spreadsheet.js +71 -70
  151. package/dist/src/prompts/spreadsheet.js.map +1 -0
  152. package/dist/{prompts → src/prompts}/table.js +52 -38
  153. package/dist/src/prompts/table.js.map +1 -0
  154. package/dist/{prompts → src/prompts}/text.js +74 -70
  155. package/dist/src/prompts/text.js.map +1 -0
  156. package/dist/{prompts → src/prompts}/time.js +105 -96
  157. package/dist/src/prompts/time.js.map +1 -0
  158. package/dist/src/prompts/toggle.js +53 -0
  159. package/dist/src/prompts/toggle.js.map +1 -0
  160. package/dist/{prompts → src/prompts}/transfer.js +71 -67
  161. package/dist/src/prompts/transfer.js.map +1 -0
  162. package/dist/{prompts → src/prompts}/tree-select.js +83 -86
  163. package/dist/src/prompts/tree-select.js.map +1 -0
  164. package/dist/{prompts → src/prompts}/tree.js +69 -67
  165. package/dist/src/prompts/tree.js.map +1 -0
  166. package/dist/src/prompts/wait.js +79 -0
  167. package/dist/src/prompts/wait.js.map +1 -0
  168. package/dist/src/spinner.js +105 -0
  169. package/dist/src/spinner.js.map +1 -0
  170. package/dist/{symbols.js → src/symbols.js} +32 -7
  171. package/dist/src/symbols.js.map +1 -0
  172. package/dist/{tasks.js → src/tasks.js} +104 -79
  173. package/dist/src/tasks.js.map +1 -0
  174. package/dist/src/theme.js +29 -0
  175. package/dist/src/theme.js.map +1 -0
  176. package/dist/src/types.js +8 -0
  177. package/dist/src/types.js.map +1 -0
  178. package/dist/{utils.js → src/utils.js} +196 -152
  179. package/dist/src/utils.js.map +1 -0
  180. package/package.json +16 -13
  181. package/dist/ansi.d.ts +0 -36
  182. package/dist/base.d.ts +0 -60
  183. package/dist/core.d.ts +0 -1072
  184. package/dist/data/countries.d.ts +0 -2
  185. package/dist/data/countries.js +0 -105
  186. package/dist/data/licenses.d.ts +0 -2
  187. package/dist/data/licenses.js +0 -109
  188. package/dist/highlight.d.ts +0 -7
  189. package/dist/index.d.ts +0 -48
  190. package/dist/index.js +0 -64
  191. package/dist/input.d.ts +0 -14
  192. package/dist/pipeline.d.ts +0 -39
  193. package/dist/pipeline.js +0 -54
  194. package/dist/prompts/autocomplete.d.ts +0 -22
  195. package/dist/prompts/box.d.ts +0 -21
  196. package/dist/prompts/breadcrumb-search.d.ts +0 -14
  197. package/dist/prompts/breadcrumb.d.ts +0 -32
  198. package/dist/prompts/byte.d.ts +0 -13
  199. package/dist/prompts/calculator.d.ts +0 -17
  200. package/dist/prompts/calendar.d.ts +0 -33
  201. package/dist/prompts/checkbox.d.ts +0 -13
  202. package/dist/prompts/code.d.ts +0 -19
  203. package/dist/prompts/color.d.ts +0 -14
  204. package/dist/prompts/confirm.d.ts +0 -8
  205. package/dist/prompts/connection-string.d.ts +0 -18
  206. package/dist/prompts/cron.d.ts +0 -13
  207. package/dist/prompts/curl-utils.d.ts +0 -25
  208. package/dist/prompts/curl-utils.js +0 -41
  209. package/dist/prompts/curl.d.ts +0 -41
  210. package/dist/prompts/data-inspector.d.ts +0 -22
  211. package/dist/prompts/date.d.ts +0 -12
  212. package/dist/prompts/dependency.d.ts +0 -16
  213. package/dist/prompts/dial.d.ts +0 -10
  214. package/dist/prompts/diff.d.ts +0 -10
  215. package/dist/prompts/diff.js +0 -101
  216. package/dist/prompts/draw.d.ts +0 -20
  217. package/dist/prompts/editor.d.ts +0 -14
  218. package/dist/prompts/editor.js +0 -203
  219. package/dist/prompts/emoji.d.ts +0 -18
  220. package/dist/prompts/exec.d.ts +0 -17
  221. package/dist/prompts/file.d.ts +0 -21
  222. package/dist/prompts/file.js +0 -210
  223. package/dist/prompts/form.d.ts +0 -18
  224. package/dist/prompts/fuzzy-multi-column.d.ts +0 -12
  225. package/dist/prompts/fuzzy.d.ts +0 -12
  226. package/dist/prompts/gauge.d.ts +0 -21
  227. package/dist/prompts/gauge.js +0 -130
  228. package/dist/prompts/grid.d.ts +0 -14
  229. package/dist/prompts/heatmap.d.ts +0 -13
  230. package/dist/prompts/ip.d.ts +0 -11
  231. package/dist/prompts/kanban.d.ts +0 -17
  232. package/dist/prompts/keypress.d.ts +0 -7
  233. package/dist/prompts/keypress.js +0 -55
  234. package/dist/prompts/license.d.ts +0 -9
  235. package/dist/prompts/license.js +0 -105
  236. package/dist/prompts/list.d.ts +0 -9
  237. package/dist/prompts/map.d.ts +0 -17
  238. package/dist/prompts/match.d.ts +0 -19
  239. package/dist/prompts/miller.d.ts +0 -15
  240. package/dist/prompts/multi-column-select.d.ts +0 -10
  241. package/dist/prompts/multi-range.d.ts +0 -9
  242. package/dist/prompts/multi-select.d.ts +0 -15
  243. package/dist/prompts/number.d.ts +0 -11
  244. package/dist/prompts/otp.d.ts +0 -10
  245. package/dist/prompts/pattern.d.ts +0 -22
  246. package/dist/prompts/phone.d.ts +0 -41
  247. package/dist/prompts/quiz-select.d.ts +0 -10
  248. package/dist/prompts/quiz-select.js +0 -104
  249. package/dist/prompts/quiz-text.d.ts +0 -11
  250. package/dist/prompts/quiz-text.js +0 -82
  251. package/dist/prompts/range.d.ts +0 -9
  252. package/dist/prompts/rating.d.ts +0 -8
  253. package/dist/prompts/regex.d.ts +0 -13
  254. package/dist/prompts/region.d.ts +0 -11
  255. package/dist/prompts/schedule.d.ts +0 -20
  256. package/dist/prompts/scroll.d.ts +0 -13
  257. package/dist/prompts/seat.d.ts +0 -17
  258. package/dist/prompts/seat.js +0 -165
  259. package/dist/prompts/select-range.d.ts +0 -8
  260. package/dist/prompts/select.d.ts +0 -15
  261. package/dist/prompts/semver.d.ts +0 -6
  262. package/dist/prompts/shortcut.d.ts +0 -9
  263. package/dist/prompts/shortcut.js +0 -135
  264. package/dist/prompts/slider.d.ts +0 -8
  265. package/dist/prompts/slot.d.ts +0 -16
  266. package/dist/prompts/slot.js +0 -107
  267. package/dist/prompts/snippet.d.ts +0 -19
  268. package/dist/prompts/sort-grid.d.ts +0 -16
  269. package/dist/prompts/sort.d.ts +0 -14
  270. package/dist/prompts/spam.d.ts +0 -17
  271. package/dist/prompts/spam.js +0 -62
  272. package/dist/prompts/spreadsheet.d.ts +0 -21
  273. package/dist/prompts/table.d.ts +0 -14
  274. package/dist/prompts/text.d.ts +0 -17
  275. package/dist/prompts/time.d.ts +0 -12
  276. package/dist/prompts/toggle.d.ts +0 -8
  277. package/dist/prompts/toggle.js +0 -47
  278. package/dist/prompts/transfer.d.ts +0 -18
  279. package/dist/prompts/tree-select.d.ts +0 -31
  280. package/dist/prompts/tree.d.ts +0 -20
  281. package/dist/prompts/wait.d.ts +0 -18
  282. package/dist/prompts/wait.js +0 -62
  283. package/dist/spinner.d.ts +0 -33
  284. package/dist/spinner.js +0 -89
  285. package/dist/symbols.d.ts +0 -33
  286. package/dist/tasks.d.ts +0 -57
  287. package/dist/theme.d.ts +0 -2
  288. package/dist/theme.js +0 -20
  289. package/dist/types.d.ts +0 -503
  290. package/dist/types.js +0 -5
  291. package/dist/utils.d.ts +0 -81
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/prompts/tree.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { TreeOptions, TreeNode, MouseEvent } from '../types';\n\ninterface FlatNode<V> {\n node: TreeNode<V>;\n depth: number;\n parent: TreeNode<V> | null;\n}\n\nexport class TreePrompt<V> extends Prompt<V, TreeOptions<V>> {\n private cursor: number = 0;\n private expandedNodes: Set<TreeNode<V>> = new Set();\n private flatList: FlatNode<V>[] = [];\n private scrollTop: number = 0;\n private readonly pageSize: number = 15;\n\n // Icons\n private readonly ICON_CLOSED = symbols.pointer === '>' ? '+' : '▸';\n private readonly ICON_OPEN = symbols.pointer === '>' ? '-' : '▾';\n\n constructor(options: TreeOptions<V>) {\n super(options);\n this.initializeExpanded(this.options.data);\n if (this.options.initial !== undefined) {\n this.expandPathTo(this.options.initial);\n }\n this.recalculateFlatList();\n\n if (this.options.initial !== undefined) {\n const index = this.flatList.findIndex(item => item.node.value === this.options.initial);\n if (index !== -1) {\n this.cursor = index;\n }\n }\n }\n\n private expandPathTo(value: V) {\n const find = (nodes: TreeNode<V>[]): boolean => {\n for (const node of nodes) {\n if (node.value === value) return true;\n if (node.children) {\n if (find(node.children)) {\n this.expandedNodes.add(node);\n return true;\n }\n }\n }\n return false;\n };\n find(this.options.data);\n }\n\n private initializeExpanded(nodes: TreeNode<V>[]) {\n for (const node of nodes) {\n if (node.expanded) {\n this.expandedNodes.add(node);\n }\n if (node.children) {\n this.initializeExpanded(node.children);\n }\n }\n }\n\n private recalculateFlatList() {\n this.flatList = [];\n this.traverse(this.options.data, 0, null);\n if (this.cursor >= this.flatList.length) {\n this.cursor = Math.max(0, this.flatList.length - 1);\n }\n }\n\n private traverse(nodes: TreeNode<V>[], depth: number, parent: TreeNode<V> | null) {\n for (const node of nodes) {\n this.flatList.push({\n node,\n depth,\n parent\n });\n\n if (node.children && node.children.length > 0 && this.expandedNodes.has(node)) {\n this.traverse(node.children, depth + 1, node);\n }\n }\n }\n\n private toggleRecursive(node: TreeNode<V>, expand: boolean) {\n if (expand) this.expandedNodes.add(node);\n else this.expandedNodes.delete(node);\n\n if (node.children) {\n node.children.forEach(child => this.toggleRecursive(child, expand));\n }\n }\n\n protected render(_firstRender: boolean) {\n let output = `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}\\n`;\n\n if (this.flatList.length === 0) {\n output += ` ${theme.muted}No data${ANSI.RESET}`;\n this.renderFrame(output);\n return;\n }\n\n if (this.cursor < this.scrollTop) {\n this.scrollTop = this.cursor;\n } else if (this.cursor >= this.scrollTop + this.pageSize) {\n this.scrollTop = this.cursor - this.pageSize + 1;\n }\n\n const visible = this.flatList.slice(this.scrollTop, this.scrollTop + this.pageSize);\n\n visible.forEach((item, index) => {\n const actualIndex = this.scrollTop + index;\n const isSelected = actualIndex === this.cursor;\n\n const indentSize = this.options.indent || 2;\n const indentation = ' '.repeat(item.depth * indentSize);\n\n let linePrefix = '';\n if (isSelected) {\n linePrefix = `${theme.main}${symbols.pointer} `;\n } else {\n linePrefix = ' ';\n }\n\n let icon = ' ';\n const hasChildren = item.node.children && item.node.children.length > 0;\n\n if (hasChildren) {\n if (this.expandedNodes.has(item.node)) {\n icon = `${this.ICON_OPEN} `;\n } else {\n icon = `${this.ICON_CLOSED} `;\n }\n }\n\n let title = item.node.title;\n if (item.node.disabled) {\n title = `${theme.muted}${title} (disabled)${ANSI.RESET}`;\n }\n\n let line = `${indentation}${icon}${title}`;\n if (isSelected) {\n line = `${theme.main}${line}${ANSI.RESET}`;\n }\n\n output += linePrefix + line;\n if (index < visible.length - 1) output += '\\n';\n });\n\n output += `\\n${theme.muted}(Arrows: Nav, e: Expand All, c: Collapse All)${ANSI.RESET}`;\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string, _key: Buffer) {\n if (this.flatList.length === 0) return;\n\n if (this.isUp(char)) {\n this.cursor = (this.cursor - 1 + this.flatList.length) % this.flatList.length;\n this.render(false);\n return;\n }\n if (this.isDown(char)) {\n this.cursor = (this.cursor + 1) % this.flatList.length;\n this.render(false);\n return;\n }\n\n const currentItem = this.flatList[this.cursor];\n const node = currentItem.node;\n const hasChildren = node.children && node.children.length > 0;\n\n // Recursive Expand (e)\n if (char === 'e' && hasChildren) {\n this.toggleRecursive(node, true);\n this.recalculateFlatList();\n this.render(false);\n return;\n }\n\n // Recursive Collapse (c)\n if (char === 'c' && hasChildren) {\n this.toggleRecursive(node, false);\n this.recalculateFlatList();\n this.render(false);\n return;\n }\n\n if (this.isRight(char)) {\n if (hasChildren) {\n if (!this.expandedNodes.has(node)) {\n this.expandedNodes.add(node);\n this.recalculateFlatList();\n } else {\n if (this.cursor + 1 < this.flatList.length) {\n this.cursor++;\n }\n }\n this.render(false);\n return;\n }\n }\n\n if (this.isLeft(char)) {\n if (hasChildren && this.expandedNodes.has(node)) {\n this.expandedNodes.delete(node);\n this.recalculateFlatList();\n this.render(false);\n return;\n } else {\n if (currentItem.parent) {\n const parentIndex = this.flatList.findIndex(x => x.node === currentItem.parent);\n if (parentIndex !== -1) {\n this.cursor = parentIndex;\n this.render(false);\n return;\n }\n }\n }\n }\n\n if (char === ' ') {\n if (hasChildren) {\n if (this.expandedNodes.has(node)) {\n this.expandedNodes.delete(node);\n } else {\n this.expandedNodes.add(node);\n }\n this.recalculateFlatList();\n this.render(false);\n }\n return;\n }\n\n if (char === '\\r' || char === '\\n') {\n if (!node.disabled) {\n this.submit(node.value);\n }\n }\n }\n\n protected handleMouse(event: MouseEvent) {\n if (event.action === 'scroll') {\n if (event.scroll === 'up') {\n this.cursor = (this.cursor - 1 + this.flatList.length) % this.flatList.length;\n this.render(false);\n } else if (event.scroll === 'down') {\n this.cursor = (this.cursor + 1) % this.flatList.length;\n this.render(false);\n }\n }\n }\n}\n"],"names":["TreePrompt","Prompt","expandPathTo","value","find","nodes","node","children","expandedNodes","add","options","data","initializeExpanded","expanded","recalculateFlatList","flatList","traverse","cursor","length","Math","max","depth","parent","push","has","toggleRecursive","expand","delete","forEach","child","render","_firstRender","output","theme","success","ANSI","RESET","BOLD","title","message","muted","renderFrame","scrollTop","pageSize","visible","slice","item","index","actualIndex","isSelected","indentSize","indent","indentation","repeat","linePrefix","main","symbols","pointer","icon","hasChildren","ICON_OPEN","ICON_CLOSED","disabled","line","handleInput","char","_key","isUp","isDown","currentItem","isRight","isLeft","parentIndex","findIndex","x","submit","handleMouse","event","action","scroll","Set","initial","undefined"],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ // src/prompts/wait.ts
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "WaitPrompt", {
7
+ enumerable: true,
8
+ get: function() {
9
+ return WaitPrompt;
10
+ }
11
+ });
12
+ const _ansi = require("../ansi");
13
+ const _base = require("../base");
14
+ const _theme = require("../theme");
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 WaitPrompt = class WaitPrompt extends _base.Prompt {
29
+ run() {
30
+ // Start the countdown immediately upon running
31
+ this.timer = setInterval(()=>{
32
+ this.remaining--;
33
+ if (this.remaining <= 0) {
34
+ this.isDone = true;
35
+ this.stopTimer();
36
+ if (this.options.autoSubmit) {
37
+ this.submit();
38
+ } else {
39
+ this.render(false);
40
+ }
41
+ } else {
42
+ this.render(false);
43
+ }
44
+ }, 1000);
45
+ return super.run();
46
+ }
47
+ stopTimer() {
48
+ if (this.timer) {
49
+ clearInterval(this.timer);
50
+ this.timer = undefined;
51
+ }
52
+ }
53
+ cleanup() {
54
+ this.stopTimer();
55
+ super.cleanup();
56
+ }
57
+ render(_firstRender) {
58
+ let output = `${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} `;
59
+ if (this.isDone) {
60
+ output += `${_theme.theme.success}Done! Press Enter to continue.${_ansi.ANSI.RESET}`;
61
+ } else {
62
+ // Fun countdown visualization
63
+ output += `${_theme.theme.muted}Please wait... ${this.remaining}s${_ansi.ANSI.RESET}`;
64
+ }
65
+ this.renderFrame(output);
66
+ }
67
+ handleInput(char) {
68
+ if (this.isDone && (char === '\r' || char === '\n')) {
69
+ this.submit();
70
+ }
71
+ // Else: Ignore all input while waiting
72
+ }
73
+ constructor(options){
74
+ super(options), _define_property(this, "remaining", void 0), _define_property(this, "timer", void 0), _define_property(this, "isDone", false);
75
+ this.remaining = options.seconds;
76
+ }
77
+ };
78
+
79
+ //# sourceMappingURL=wait.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/prompts/wait.ts"],"sourcesContent":["// src/prompts/wait.ts\nimport { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { BaseOptions } from '../types';\n\ninterface WaitOptions extends BaseOptions {\n seconds: number;\n autoSubmit?: boolean; // If true, resolves automatically when time is up\n}\n\nexport class WaitPrompt extends Prompt<void, WaitOptions> {\n private remaining: number;\n private timer?: NodeJS.Timeout;\n private isDone: boolean = false;\n\n constructor(options: WaitOptions) {\n super(options);\n this.remaining = options.seconds;\n }\n\n public run(): Promise<void> {\n // Start the countdown immediately upon running\n this.timer = setInterval(() => {\n this.remaining--;\n if (this.remaining <= 0) {\n this.isDone = true;\n this.stopTimer();\n\n if (this.options.autoSubmit) {\n this.submit();\n } else {\n this.render(false);\n }\n } else {\n this.render(false);\n }\n }, 1000);\n\n return super.run();\n }\n\n private stopTimer() {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n }\n\n protected cleanup() {\n this.stopTimer();\n super.cleanup();\n }\n\n protected render(_firstRender: boolean) {\n let output = `${theme.title}${this.options.message}${ANSI.RESET} `;\n\n if (this.isDone) {\n output += `${theme.success}Done! Press Enter to continue.${ANSI.RESET}`;\n } else {\n // Fun countdown visualization\n output += `${theme.muted}Please wait... ${this.remaining}s${ANSI.RESET}`;\n }\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string) {\n if (this.isDone && (char === '\\r' || char === '\\n')) {\n this.submit();\n }\n // Else: Ignore all input while waiting\n }\n}"],"names":["WaitPrompt","Prompt","run","timer","setInterval","remaining","isDone","stopTimer","options","autoSubmit","submit","render","clearInterval","undefined","cleanup","_firstRender","output","theme","title","message","ANSI","RESET","success","muted","renderFrame","handleInput","char","seconds"],"mappings":"AAAA,sBAAsB;;;;;+BAWTA;;;eAAAA;;;sBAVQ;sBACE;uBACD;;;;;;;;;;;;;;AAQf,IAAA,AAAMA,aAAN,MAAMA,mBAAmBC,YAAM;IAU3BC,MAAqB;QACxB,+CAA+C;QAC/C,IAAI,CAACC,KAAK,GAAGC,YAAY;YACrB,IAAI,CAACC,SAAS;YACd,IAAI,IAAI,CAACA,SAAS,IAAI,GAAG;gBACrB,IAAI,CAACC,MAAM,GAAG;gBACd,IAAI,CAACC,SAAS;gBAEd,IAAI,IAAI,CAACC,OAAO,CAACC,UAAU,EAAE;oBACzB,IAAI,CAACC,MAAM;gBACf,OAAO;oBACH,IAAI,CAACC,MAAM,CAAC;gBAChB;YACJ,OAAO;gBACH,IAAI,CAACA,MAAM,CAAC;YAChB;QACJ,GAAG;QAEH,OAAO,KAAK,CAACT;IACjB;IAEQK,YAAY;QAChB,IAAI,IAAI,CAACJ,KAAK,EAAE;YACZS,cAAc,IAAI,CAACT,KAAK;YACxB,IAAI,CAACA,KAAK,GAAGU;QACjB;IACJ;IAEUC,UAAU;QAChB,IAAI,CAACP,SAAS;QACd,KAAK,CAACO;IACV;IAEUH,OAAOI,YAAqB,EAAE;QACpC,IAAIC,SAAS,GAAGC,YAAK,CAACC,KAAK,GAAG,IAAI,CAACV,OAAO,CAACW,OAAO,GAAGC,UAAI,CAACC,KAAK,CAAC,CAAC,CAAC;QAElE,IAAI,IAAI,CAACf,MAAM,EAAE;YACbU,UAAU,GAAGC,YAAK,CAACK,OAAO,CAAC,8BAA8B,EAAEF,UAAI,CAACC,KAAK,EAAE;QAC3E,OAAO;YACH,8BAA8B;YAC9BL,UAAU,GAAGC,YAAK,CAACM,KAAK,CAAC,eAAe,EAAE,IAAI,CAAClB,SAAS,CAAC,CAAC,EAAEe,UAAI,CAACC,KAAK,EAAE;QAC5E;QAEA,IAAI,CAACG,WAAW,CAACR;IACrB;IAEUS,YAAYC,IAAY,EAAE;QAChC,IAAI,IAAI,CAACpB,MAAM,IAAKoB,CAAAA,SAAS,QAAQA,SAAS,IAAG,GAAI;YACjD,IAAI,CAAChB,MAAM;QACf;IACA,uCAAuC;IAC3C;IAxDA,YAAYF,OAAoB,CAAE;QAC9B,KAAK,CAACA,UALV,uBAAQH,aAAR,KAAA,IACA,uBAAQF,SAAR,KAAA,IACA,uBAAQG,UAAkB;QAItB,IAAI,CAACD,SAAS,GAAGG,QAAQmB,OAAO;IACpC;AAsDJ"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "Spinner", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return Spinner;
9
+ }
10
+ });
11
+ const _ansi = require("./ansi");
12
+ const _symbols = require("./symbols");
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 Spinner = class Spinner {
28
+ /**
29
+ * Starts the spinner animation.
30
+ */ start() {
31
+ if (this.isSpinning) return this;
32
+ this.isSpinning = true;
33
+ process.stdout.write(_ansi.ANSI.HIDE_CURSOR);
34
+ // Render immediately
35
+ this.render();
36
+ // Start loop
37
+ this.timer = setInterval(()=>{
38
+ this.render();
39
+ }, 80);
40
+ // Register signal handler to restore cursor on Ctrl+C
41
+ process.on('SIGINT', this.handleSignal);
42
+ return this;
43
+ }
44
+ /**
45
+ * Stops the spinner animation.
46
+ */ stop() {
47
+ if (this.timer) {
48
+ clearInterval(this.timer);
49
+ this.timer = undefined;
50
+ }
51
+ if (this.isSpinning) {
52
+ this.isSpinning = false;
53
+ process.stdout.write(_ansi.ANSI.SHOW_CURSOR);
54
+ process.removeListener('SIGINT', this.handleSignal);
55
+ }
56
+ return this;
57
+ }
58
+ /**
59
+ * Updates the spinner text.
60
+ */ update(text) {
61
+ this.text = text;
62
+ return this;
63
+ }
64
+ /**
65
+ * Stops the spinner and shows a success message.
66
+ */ success(message) {
67
+ this.stop();
68
+ const text = message ?? this.text;
69
+ process.stdout.write(`${_ansi.ANSI.ERASE_LINE}${_ansi.ANSI.CURSOR_LEFT}${_theme.theme.success}${_symbols.symbols.tick}${_ansi.ANSI.RESET} ${text}\n`);
70
+ return this;
71
+ }
72
+ /**
73
+ * Stops the spinner and shows an error message.
74
+ */ error(message) {
75
+ this.stop();
76
+ const text = message ?? this.text;
77
+ process.stdout.write(`${_ansi.ANSI.ERASE_LINE}${_ansi.ANSI.CURSOR_LEFT}${_theme.theme.error}${_symbols.symbols.cross}${_ansi.ANSI.RESET} ${text}\n`);
78
+ return this;
79
+ }
80
+ /**
81
+ * Stops the spinner and clears the line.
82
+ */ clear() {
83
+ this.stop();
84
+ process.stdout.write(`${_ansi.ANSI.ERASE_LINE}${_ansi.ANSI.CURSOR_LEFT}`);
85
+ return this;
86
+ }
87
+ render() {
88
+ const frame = _symbols.symbols.spinner[this.frameIndex];
89
+ process.stdout.write(`${_ansi.ANSI.ERASE_LINE}${_ansi.ANSI.CURSOR_LEFT}${_theme.theme.main}${frame}${_ansi.ANSI.RESET} ${this.text}`);
90
+ this.frameIndex = (this.frameIndex + 1) % _symbols.symbols.spinner.length;
91
+ }
92
+ constructor(text){
93
+ _define_property(this, "text", void 0);
94
+ _define_property(this, "timer", void 0);
95
+ _define_property(this, "frameIndex", 0);
96
+ _define_property(this, "isSpinning", false);
97
+ _define_property(this, "handleSignal", ()=>{
98
+ this.stop();
99
+ process.exit(0);
100
+ });
101
+ this.text = text;
102
+ }
103
+ };
104
+
105
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/spinner.ts"],"sourcesContent":["import { ANSI } from './ansi';\nimport { symbols } from './symbols';\nimport { theme } from './theme';\n\nexport class Spinner {\n private text: string;\n private timer?: NodeJS.Timeout;\n private frameIndex: number = 0;\n private isSpinning: boolean = false;\n\n constructor(text: string) {\n this.text = text;\n }\n\n /**\n * Starts the spinner animation.\n */\n public start(): this {\n if (this.isSpinning) return this;\n\n this.isSpinning = true;\n process.stdout.write(ANSI.HIDE_CURSOR);\n\n // Render immediately\n this.render();\n\n // Start loop\n this.timer = setInterval(() => {\n this.render();\n }, 80);\n\n // Register signal handler to restore cursor on Ctrl+C\n process.on('SIGINT', this.handleSignal);\n\n return this;\n }\n\n /**\n * Stops the spinner animation.\n */\n public stop(): this {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n\n if (this.isSpinning) {\n this.isSpinning = false;\n process.stdout.write(ANSI.SHOW_CURSOR);\n process.removeListener('SIGINT', this.handleSignal);\n }\n\n return this;\n }\n\n /**\n * Updates the spinner text.\n */\n public update(text: string): this {\n this.text = text;\n return this;\n }\n\n /**\n * Stops the spinner and shows a success message.\n */\n public success(message?: string): this {\n this.stop();\n const text = message ?? this.text;\n process.stdout.write(`${ANSI.ERASE_LINE}${ANSI.CURSOR_LEFT}${theme.success}${symbols.tick}${ANSI.RESET} ${text}\\n`);\n return this;\n }\n\n /**\n * Stops the spinner and shows an error message.\n */\n public error(message?: string): this {\n this.stop();\n const text = message ?? this.text;\n process.stdout.write(`${ANSI.ERASE_LINE}${ANSI.CURSOR_LEFT}${theme.error}${symbols.cross}${ANSI.RESET} ${text}\\n`);\n return this;\n }\n\n /**\n * Stops the spinner and clears the line.\n */\n public clear(): this {\n this.stop();\n process.stdout.write(`${ANSI.ERASE_LINE}${ANSI.CURSOR_LEFT}`);\n return this;\n }\n\n private render(): void {\n const frame = symbols.spinner[this.frameIndex];\n process.stdout.write(`${ANSI.ERASE_LINE}${ANSI.CURSOR_LEFT}${theme.main}${frame}${ANSI.RESET} ${this.text}`);\n this.frameIndex = (this.frameIndex + 1) % symbols.spinner.length;\n }\n\n private handleSignal = () => {\n this.stop();\n process.exit(0);\n };\n}\n"],"names":["Spinner","start","isSpinning","process","stdout","write","ANSI","HIDE_CURSOR","render","timer","setInterval","on","handleSignal","stop","clearInterval","undefined","SHOW_CURSOR","removeListener","update","text","success","message","ERASE_LINE","CURSOR_LEFT","theme","symbols","tick","RESET","error","cross","clear","frame","spinner","frameIndex","main","length","exit"],"mappings":";;;;+BAIaA;;;eAAAA;;;sBAJQ;yBACG;uBACF;;;;;;;;;;;;;;AAEf,IAAA,AAAMA,UAAN,MAAMA;IAUT;;KAEC,GACD,AAAOC,QAAc;QACjB,IAAI,IAAI,CAACC,UAAU,EAAE,OAAO,IAAI;QAEhC,IAAI,CAACA,UAAU,GAAG;QAClBC,QAAQC,MAAM,CAACC,KAAK,CAACC,UAAI,CAACC,WAAW;QAErC,qBAAqB;QACrB,IAAI,CAACC,MAAM;QAEX,aAAa;QACb,IAAI,CAACC,KAAK,GAAGC,YAAY;YACrB,IAAI,CAACF,MAAM;QACf,GAAG;QAEH,sDAAsD;QACtDL,QAAQQ,EAAE,CAAC,UAAU,IAAI,CAACC,YAAY;QAEtC,OAAO,IAAI;IACf;IAEA;;KAEC,GACD,AAAOC,OAAa;QAChB,IAAI,IAAI,CAACJ,KAAK,EAAE;YACZK,cAAc,IAAI,CAACL,KAAK;YACxB,IAAI,CAACA,KAAK,GAAGM;QACjB;QAEA,IAAI,IAAI,CAACb,UAAU,EAAE;YACjB,IAAI,CAACA,UAAU,GAAG;YAClBC,QAAQC,MAAM,CAACC,KAAK,CAACC,UAAI,CAACU,WAAW;YACrCb,QAAQc,cAAc,CAAC,UAAU,IAAI,CAACL,YAAY;QACtD;QAEA,OAAO,IAAI;IACf;IAEA;;KAEC,GACD,AAAOM,OAAOC,IAAY,EAAQ;QAC9B,IAAI,CAACA,IAAI,GAAGA;QACZ,OAAO,IAAI;IACf;IAEA;;KAEC,GACD,AAAOC,QAAQC,OAAgB,EAAQ;QACnC,IAAI,CAACR,IAAI;QACT,MAAMM,OAAOE,WAAW,IAAI,CAACF,IAAI;QACjChB,QAAQC,MAAM,CAACC,KAAK,CAAC,GAAGC,UAAI,CAACgB,UAAU,GAAGhB,UAAI,CAACiB,WAAW,GAAGC,YAAK,CAACJ,OAAO,GAAGK,gBAAO,CAACC,IAAI,GAAGpB,UAAI,CAACqB,KAAK,CAAC,CAAC,EAAER,KAAK,EAAE,CAAC;QAClH,OAAO,IAAI;IACf;IAEA;;KAEC,GACD,AAAOS,MAAMP,OAAgB,EAAQ;QACjC,IAAI,CAACR,IAAI;QACT,MAAMM,OAAOE,WAAW,IAAI,CAACF,IAAI;QACjChB,QAAQC,MAAM,CAACC,KAAK,CAAC,GAAGC,UAAI,CAACgB,UAAU,GAAGhB,UAAI,CAACiB,WAAW,GAAGC,YAAK,CAACI,KAAK,GAAGH,gBAAO,CAACI,KAAK,GAAGvB,UAAI,CAACqB,KAAK,CAAC,CAAC,EAAER,KAAK,EAAE,CAAC;QACjH,OAAO,IAAI;IACf;IAEA;;KAEC,GACD,AAAOW,QAAc;QACjB,IAAI,CAACjB,IAAI;QACTV,QAAQC,MAAM,CAACC,KAAK,CAAC,GAAGC,UAAI,CAACgB,UAAU,GAAGhB,UAAI,CAACiB,WAAW,EAAE;QAC5D,OAAO,IAAI;IACf;IAEQf,SAAe;QACnB,MAAMuB,QAAQN,gBAAO,CAACO,OAAO,CAAC,IAAI,CAACC,UAAU,CAAC;QAC9C9B,QAAQC,MAAM,CAACC,KAAK,CAAC,GAAGC,UAAI,CAACgB,UAAU,GAAGhB,UAAI,CAACiB,WAAW,GAAGC,YAAK,CAACU,IAAI,GAAGH,QAAQzB,UAAI,CAACqB,KAAK,CAAC,CAAC,EAAE,IAAI,CAACR,IAAI,EAAE;QAC3G,IAAI,CAACc,UAAU,GAAG,AAAC,CAAA,IAAI,CAACA,UAAU,GAAG,CAAA,IAAKR,gBAAO,CAACO,OAAO,CAACG,MAAM;IACpE;IAtFA,YAAYhB,IAAY,CAAE;QAL1B,uBAAQA,QAAR,KAAA;QACA,uBAAQV,SAAR,KAAA;QACA,uBAAQwB,cAAqB;QAC7B,uBAAQ/B,cAAsB;QA0F9B,uBAAQU,gBAAe;YACnB,IAAI,CAACC,IAAI;YACTV,QAAQiC,IAAI,CAAC;QACjB;QA1FI,IAAI,CAACjB,IAAI,GAAGA;IAChB;AA0FJ"}
@@ -1,7 +1,14 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.symbols = void 0;
4
- const utils_1 = require("./utils");
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "symbols", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return symbols;
9
+ }
10
+ });
11
+ const _utils = require("./utils");
5
12
  const UnicodeSymbols = {
6
13
  tick: '✔',
7
14
  cross: '✖',
@@ -9,7 +16,18 @@ const UnicodeSymbols = {
9
16
  line: '─',
10
17
  checked: '◉',
11
18
  unchecked: '◯',
12
- spinner: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],
19
+ spinner: [
20
+ '⠋',
21
+ '⠙',
22
+ '⠹',
23
+ '⠸',
24
+ '⠼',
25
+ '⠴',
26
+ '⠦',
27
+ '⠧',
28
+ '⠇',
29
+ '⠏'
30
+ ],
13
31
  star: '★',
14
32
  starEmpty: '☆',
15
33
  topLeft: '┌',
@@ -26,7 +44,12 @@ const AsciiSymbols = {
26
44
  line: '-',
27
45
  checked: '[x]',
28
46
  unchecked: '[ ]',
29
- spinner: ['|', '/', '-', '\\'],
47
+ spinner: [
48
+ '|',
49
+ '/',
50
+ '-',
51
+ '\\'
52
+ ],
30
53
  star: '*',
31
54
  starEmpty: ' ',
32
55
  topLeft: '+',
@@ -36,6 +59,8 @@ const AsciiSymbols = {
36
59
  horizontal: '-',
37
60
  vertical: '|'
38
61
  };
39
- const capabilities = (0, utils_1.detectCapabilities)();
62
+ const capabilities = (0, _utils.detectCapabilities)();
40
63
  const useUnicode = capabilities.hasUnicode && process.env.MEP_NO_UNICODE !== '1';
41
- exports.symbols = useUnicode ? UnicodeSymbols : AsciiSymbols;
64
+ const symbols = useUnicode ? UnicodeSymbols : AsciiSymbols;
65
+
66
+ //# sourceMappingURL=symbols.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/symbols.ts"],"sourcesContent":["import { detectCapabilities } from './utils';\n\nexport interface SymbolDefinition {\n /** Used for success messages or valid states */\n tick: string;\n /** Used for error messages or invalid states */\n cross: string;\n /** Used to point to the current selection */\n pointer: string;\n /** Used for separators or sliders */\n line: string;\n /** Used for checked state in checkboxes/radio */\n checked: string;\n /** Used for unchecked state in checkboxes/radio */\n unchecked: string;\n /** Animation frames for the spinner */\n spinner: string[];\n /** Star symbol for rating */\n star: string;\n /** Empty star symbol for rating */\n starEmpty: string;\n /** Box drawing top-left corner */\n topLeft: string;\n /** Box drawing top-right corner */\n topRight: string;\n /** Box drawing bottom-left corner */\n bottomLeft: string;\n /** Box drawing bottom-right corner */\n bottomRight: string;\n /** Box drawing horizontal line */\n horizontal: string;\n /** Box drawing vertical line */\n vertical: string;\n}\n\nconst UnicodeSymbols: SymbolDefinition = {\n tick: '✔',\n cross: '✖',\n pointer: '❯',\n line: '─',\n checked: '◉',\n unchecked: '◯',\n spinner: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],\n star: '★',\n starEmpty: '☆',\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│'\n};\n\nconst AsciiSymbols: SymbolDefinition = {\n tick: '+',\n cross: 'x',\n pointer: '>',\n line: '-',\n checked: '[x]',\n unchecked: '[ ]',\n spinner: ['|', '/', '-', '\\\\'],\n star: '*',\n starEmpty: ' ',\n topLeft: '+',\n topRight: '+',\n bottomLeft: '+',\n bottomRight: '+',\n horizontal: '-',\n vertical: '|'\n};\n\nconst capabilities = detectCapabilities();\nconst useUnicode = capabilities.hasUnicode && process.env.MEP_NO_UNICODE !== '1';\n\nexport const symbols: SymbolDefinition = useUnicode ? UnicodeSymbols : AsciiSymbols;\n"],"names":["symbols","UnicodeSymbols","tick","cross","pointer","line","checked","unchecked","spinner","star","starEmpty","topLeft","topRight","bottomLeft","bottomRight","horizontal","vertical","AsciiSymbols","capabilities","detectCapabilities","useUnicode","hasUnicode","process","env","MEP_NO_UNICODE"],"mappings":";;;;+BA0EaA;;;eAAAA;;;uBA1EsB;AAmCnC,MAAMC,iBAAmC;IACrCC,MAAM;IACNC,OAAO;IACPC,SAAS;IACTC,MAAM;IACNC,SAAS;IACTC,WAAW;IACXC,SAAS;QAAC;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;KAAI;IAC3DC,MAAM;IACNC,WAAW;IACXC,SAAS;IACTC,UAAU;IACVC,YAAY;IACZC,aAAa;IACbC,YAAY;IACZC,UAAU;AACd;AAEA,MAAMC,eAAiC;IACnCf,MAAM;IACNC,OAAO;IACPC,SAAS;IACTC,MAAM;IACNC,SAAS;IACTC,WAAW;IACXC,SAAS;QAAC;QAAK;QAAK;QAAK;KAAK;IAC9BC,MAAM;IACNC,WAAW;IACXC,SAAS;IACTC,UAAU;IACVC,YAAY;IACZC,aAAa;IACbC,YAAY;IACZC,UAAU;AACd;AAEA,MAAME,eAAeC,IAAAA,yBAAkB;AACvC,MAAMC,aAAaF,aAAaG,UAAU,IAAIC,QAAQC,GAAG,CAACC,cAAc,KAAK;AAEtE,MAAMxB,UAA4BoB,aAAanB,iBAAiBgB"}
@@ -1,45 +1,44 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TaskRunner = void 0;
4
- const ansi_1 = require("./ansi");
5
- const symbols_1 = require("./symbols");
6
- const utils_1 = require("./utils");
7
- class TaskRunner {
8
- constructor(options = {}) {
9
- this.tasks = new Map();
10
- this.frameIndex = 0;
11
- this.isRunning = false;
12
- this.lastOutputLines = [];
13
- this.lastOutputHeight = 0;
14
- // Explicitly using stdout
15
- this.stdout = process.stdout;
16
- // Console Hijacking
17
- this.originalConsole = null;
18
- this.logBuffer = [];
19
- this.handleSigInt = () => {
20
- this.restoreConsole();
21
- this.stdout.write(ansi_1.ANSI.SHOW_CURSOR + '\n');
22
- process.exit(0);
23
- };
24
- this.options = options;
25
- this.handleSigInt = this.handleSigInt.bind(this);
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "TaskRunner", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return TaskRunner;
9
+ }
10
+ });
11
+ const _ansi = require("./ansi");
12
+ const _symbols = require("./symbols");
13
+ const _utils = require("./utils");
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;
26
24
  }
25
+ return obj;
26
+ }
27
+ let TaskRunner = class TaskRunner {
27
28
  /**
28
29
  * Registers a new task.
29
- */
30
- add(id, config) {
30
+ */ add(id, config) {
31
31
  this.tasks.set(id, {
32
32
  id,
33
33
  ...config,
34
34
  status: 'pending',
35
- current: 0,
35
+ current: 0
36
36
  });
37
37
  return this;
38
38
  }
39
39
  /**
40
40
  * Updates an existing task.
41
- */
42
- update(id, updates) {
41
+ */ update(id, updates) {
43
42
  const task = this.tasks.get(id);
44
43
  if (task) {
45
44
  Object.assign(task, updates);
@@ -47,52 +46,56 @@ class TaskRunner {
47
46
  }
48
47
  /**
49
48
  * Starts a task (sets status to loading).
50
- */
51
- start(id, message) {
52
- this.update(id, { status: 'loading', message });
49
+ */ start(id, message) {
50
+ this.update(id, {
51
+ status: 'loading',
52
+ message
53
+ });
53
54
  }
54
55
  /**
55
56
  * Mark task as success.
56
- */
57
- success(id, message) {
58
- this.update(id, { status: 'success', message });
57
+ */ success(id, message) {
58
+ this.update(id, {
59
+ status: 'success',
60
+ message
61
+ });
59
62
  }
60
63
  /**
61
64
  * Mark task as error.
62
- */
63
- error(id, message) {
64
- this.update(id, { status: 'error', message });
65
+ */ error(id, message) {
66
+ this.update(id, {
67
+ status: 'error',
68
+ message
69
+ });
65
70
  }
66
71
  /**
67
72
  * Mark task as warning.
68
- */
69
- warning(id, message) {
70
- this.update(id, { status: 'warning', message });
73
+ */ warning(id, message) {
74
+ this.update(id, {
75
+ status: 'warning',
76
+ message
77
+ });
71
78
  }
72
79
  /**
73
80
  * Starts the rendering loop.
74
- */
75
- run() {
76
- if (this.isRunning)
77
- return;
81
+ */ run() {
82
+ if (this.isRunning) return;
78
83
  this.isRunning = true;
79
- this.stdout.write(ansi_1.ANSI.HIDE_CURSOR);
84
+ this.stdout.write(_ansi.ANSI.HIDE_CURSOR);
80
85
  this.hijackConsole();
81
86
  // Handle Ctrl+C gracefully to restore cursor
82
87
  process.on('SIGINT', this.handleSigInt);
83
88
  // Initial render
84
89
  this.render();
85
- this.timer = setInterval(() => {
90
+ this.timer = setInterval(()=>{
86
91
  this.frameIndex++;
87
92
  this.render();
88
93
  }, 80);
89
94
  }
90
95
  /**
91
96
  * Stops the rendering loop and finalizes output.
92
- */
93
- stop() {
94
- if (!this.isRunning)
95
- return;
97
+ */ stop() {
98
+ if (!this.isRunning) return;
96
99
  if (this.timer) {
97
100
  clearInterval(this.timer);
98
101
  this.timer = undefined;
@@ -101,7 +104,7 @@ class TaskRunner {
101
104
  this.render();
102
105
  this.isRunning = false;
103
106
  this.restoreConsole();
104
- this.stdout.write(ansi_1.ANSI.SHOW_CURSOR + '\n');
107
+ this.stdout.write(_ansi.ANSI.SHOW_CURSOR + '\n');
105
108
  if (this.logBuffer.length > 0) {
106
109
  this.stdout.write(this.logBuffer.join('\n') + '\n');
107
110
  this.logBuffer = [];
@@ -114,13 +117,13 @@ class TaskRunner {
114
117
  warn: console.warn,
115
118
  error: console.error
116
119
  };
117
- const logger = (_type) => (...args) => {
118
- // Use util.format for proper string interpolation
119
- // eslint-disable-next-line @typescript-eslint/no-require-imports
120
- const util = require('util');
121
- const msg = util.format(...args);
122
- this.logBuffer.push(msg);
123
- };
120
+ const logger = (_type)=>(...args)=>{
121
+ // Use util.format for proper string interpolation
122
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
123
+ const util = require('util');
124
+ const msg = util.format(...args);
125
+ this.logBuffer.push(msg);
126
+ };
124
127
  console.log = logger('log');
125
128
  console.warn = logger('warn');
126
129
  console.error = logger('error');
@@ -135,8 +138,7 @@ class TaskRunner {
135
138
  }
136
139
  /**
137
140
  * The core rendering logic using Linear Scan Diffing.
138
- */
139
- render() {
141
+ */ render() {
140
142
  const lines = this.buildLines();
141
143
  // 1. First Render
142
144
  if (this.lastOutputLines.length === 0) {
@@ -151,17 +153,17 @@ class TaskRunner {
151
153
  output += `\x1b[${this.lastOutputHeight - 1}A`; // Move up N-1 lines
152
154
  }
153
155
  output += '\r'; // Move to start of line
154
- for (let i = 0; i < lines.length; i++) {
156
+ for(let i = 0; i < lines.length; i++){
155
157
  const newLine = lines[i];
156
158
  // Write line
157
- output += ansi_1.ANSI.ERASE_LINE + newLine;
159
+ output += _ansi.ANSI.ERASE_LINE + newLine;
158
160
  if (i < lines.length - 1) {
159
161
  output += '\n';
160
162
  }
161
163
  }
162
164
  // Clear garbage if shrunk
163
165
  if (lines.length < this.lastOutputLines.length) {
164
- output += ansi_1.ANSI.ERASE_DOWN;
166
+ output += _ansi.ANSI.ERASE_DOWN;
165
167
  }
166
168
  this.stdout.write(output);
167
169
  this.lastOutputLines = lines;
@@ -169,38 +171,61 @@ class TaskRunner {
169
171
  }
170
172
  buildLines() {
171
173
  const lines = [];
172
- for (const task of this.tasks.values()) {
174
+ for (const task of this.tasks.values()){
173
175
  const icon = this.getIcon(task);
174
176
  const title = task.title;
175
177
  let line = `${icon} ${title}`;
176
178
  if (task.type === 'progress' && task.total) {
177
- const bar = (0, utils_1.generateProgressBar)(task.current, task.total);
178
- line += ` ${ansi_1.ANSI.FG_GRAY}${bar}${ansi_1.ANSI.RESET}`;
179
+ const bar = (0, _utils.generateProgressBar)(task.current, task.total);
180
+ line += ` ${_ansi.ANSI.FG_GRAY}${bar}${_ansi.ANSI.RESET}`;
179
181
  }
180
182
  if (task.message) {
181
- line += ` ${ansi_1.ANSI.DIM}- ${task.message}${ansi_1.ANSI.RESET}`;
183
+ line += ` ${_ansi.ANSI.DIM}- ${task.message}${_ansi.ANSI.RESET}`;
182
184
  }
183
185
  lines.push(line);
184
186
  }
185
187
  return lines;
186
188
  }
187
189
  getIcon(task) {
188
- switch (task.status) {
190
+ switch(task.status){
189
191
  case 'pending':
190
- return `${ansi_1.ANSI.FG_GRAY}${symbols_1.symbols.unchecked}${ansi_1.ANSI.RESET}`;
191
- case 'loading': {
192
- const frame = symbols_1.symbols.spinner[this.frameIndex % symbols_1.symbols.spinner.length];
193
- return `${ansi_1.ANSI.FG_CYAN}${frame}${ansi_1.ANSI.RESET}`;
194
- }
192
+ return `${_ansi.ANSI.FG_GRAY}${_symbols.symbols.unchecked}${_ansi.ANSI.RESET}`;
193
+ case 'loading':
194
+ {
195
+ const frame = _symbols.symbols.spinner[this.frameIndex % _symbols.symbols.spinner.length];
196
+ return `${_ansi.ANSI.FG_CYAN}${frame}${_ansi.ANSI.RESET}`;
197
+ }
195
198
  case 'success':
196
- return `${ansi_1.ANSI.FG_GREEN}${symbols_1.symbols.tick}${ansi_1.ANSI.RESET}`;
199
+ return `${_ansi.ANSI.FG_GREEN}${_symbols.symbols.tick}${_ansi.ANSI.RESET}`;
197
200
  case 'error':
198
- return `${ansi_1.ANSI.FG_RED}${symbols_1.symbols.cross}${ansi_1.ANSI.RESET}`;
201
+ return `${_ansi.ANSI.FG_RED}${_symbols.symbols.cross}${_ansi.ANSI.RESET}`;
199
202
  case 'warning':
200
- return `${ansi_1.ANSI.FG_YELLOW}!${ansi_1.ANSI.RESET}`;
203
+ return `${_ansi.ANSI.FG_YELLOW}!${_ansi.ANSI.RESET}`;
201
204
  default:
202
205
  return ' ';
203
206
  }
204
207
  }
205
- }
206
- exports.TaskRunner = TaskRunner;
208
+ constructor(options = {}){
209
+ _define_property(this, "tasks", new Map());
210
+ _define_property(this, "options", void 0);
211
+ _define_property(this, "timer", void 0);
212
+ _define_property(this, "frameIndex", 0);
213
+ _define_property(this, "isRunning", false);
214
+ _define_property(this, "lastOutputLines", []);
215
+ _define_property(this, "lastOutputHeight", 0);
216
+ // Explicitly using stdout
217
+ _define_property(this, "stdout", process.stdout);
218
+ // Console Hijacking
219
+ _define_property(this, "originalConsole", null);
220
+ _define_property(this, "logBuffer", []);
221
+ _define_property(this, "handleSigInt", ()=>{
222
+ this.restoreConsole();
223
+ this.stdout.write(_ansi.ANSI.SHOW_CURSOR + '\n');
224
+ process.exit(0);
225
+ });
226
+ this.options = options;
227
+ this.handleSigInt = this.handleSigInt.bind(this);
228
+ }
229
+ };
230
+
231
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/tasks.ts"],"sourcesContent":["import { ANSI } from './ansi';\nimport { symbols } from './symbols';\nimport { TaskConfig, TaskGroupOptions, TaskState } from './types';\nimport { generateProgressBar } from './utils';\n\nexport class TaskRunner {\n private tasks: Map<string, TaskState> = new Map();\n private options: TaskGroupOptions;\n private timer?: NodeJS.Timeout;\n private frameIndex: number = 0;\n private isRunning: boolean = false;\n private lastOutputLines: string[] = [];\n private lastOutputHeight: number = 0;\n\n // Explicitly using stdout\n private stdout: NodeJS.WriteStream = process.stdout;\n\n // Console Hijacking\n private originalConsole: { log: any, warn: any, error: any } | null = null;\n private logBuffer: string[] = [];\n\n constructor(options: TaskGroupOptions = {}) {\n this.options = options;\n this.handleSigInt = this.handleSigInt.bind(this);\n }\n\n /**\n * Registers a new task.\n */\n public add(id: string, config: Omit<TaskConfig, 'id'>): TaskRunner {\n this.tasks.set(id, {\n id,\n ...config,\n status: 'pending',\n current: 0,\n });\n return this;\n }\n\n /**\n * Updates an existing task.\n */\n public update(id: string, updates: Partial<Omit<TaskState, 'id' | 'type' | 'title'>> & { title?: string }): void {\n const task = this.tasks.get(id);\n if (task) {\n Object.assign(task, updates);\n }\n }\n\n /**\n * Starts a task (sets status to loading).\n */\n public start(id: string, message?: string): void {\n this.update(id, { status: 'loading', message });\n }\n\n /**\n * Mark task as success.\n */\n public success(id: string, message?: string): void {\n this.update(id, { status: 'success', message });\n }\n\n /**\n * Mark task as error.\n */\n public error(id: string, message?: string): void {\n this.update(id, { status: 'error', message });\n }\n\n /**\n * Mark task as warning.\n */\n public warning(id: string, message?: string): void {\n this.update(id, { status: 'warning', message });\n }\n\n /**\n * Starts the rendering loop.\n */\n public run(): void {\n if (this.isRunning) return;\n this.isRunning = true;\n\n this.stdout.write(ANSI.HIDE_CURSOR);\n this.hijackConsole();\n\n // Handle Ctrl+C gracefully to restore cursor\n process.on('SIGINT', this.handleSigInt);\n\n // Initial render\n this.render();\n\n this.timer = setInterval(() => {\n this.frameIndex++;\n this.render();\n }, 80);\n }\n\n /**\n * Stops the rendering loop and finalizes output.\n */\n public stop(): void {\n if (!this.isRunning) return;\n\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n\n // Final render to ensure static state (ticks/crosses instead of spinner)\n this.render();\n\n this.isRunning = false;\n this.restoreConsole();\n this.stdout.write(ANSI.SHOW_CURSOR + '\\n');\n\n if (this.logBuffer.length > 0) {\n this.stdout.write(this.logBuffer.join('\\n') + '\\n');\n this.logBuffer = [];\n }\n\n process.removeListener('SIGINT', this.handleSigInt);\n }\n\n private handleSigInt = () => {\n this.restoreConsole();\n this.stdout.write(ANSI.SHOW_CURSOR + '\\n');\n process.exit(0);\n };\n\n private hijackConsole() {\n this.originalConsole = {\n log: console.log,\n warn: console.warn,\n error: console.error\n };\n\n const logger = (_type: string) => (...args: any[]) => {\n // Use util.format for proper string interpolation\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const util = require('util');\n const msg = util.format(...args);\n this.logBuffer.push(msg);\n };\n\n console.log = logger('log');\n console.warn = logger('warn');\n console.error = logger('error');\n }\n\n private restoreConsole() {\n if (this.originalConsole) {\n console.log = this.originalConsole.log;\n console.warn = this.originalConsole.warn;\n console.error = this.originalConsole.error;\n this.originalConsole = null;\n }\n }\n\n /**\n * The core rendering logic using Linear Scan Diffing.\n */\n private render(): void {\n const lines = this.buildLines();\n\n // 1. First Render\n if (this.lastOutputLines.length === 0) {\n this.stdout.write(lines.join('\\n'));\n this.lastOutputLines = lines;\n this.lastOutputHeight = lines.length;\n return;\n }\n\n let output = '';\n\n // 2. Return Cursor to Top\n if (this.lastOutputHeight > 1) {\n output += `\\x1b[${this.lastOutputHeight - 1}A`; // Move up N-1 lines\n }\n output += '\\r'; // Move to start of line\n\n for (let i = 0; i < lines.length; i++) {\n const newLine = lines[i];\n // Write line\n output += ANSI.ERASE_LINE + newLine;\n if (i < lines.length - 1) {\n output += '\\n';\n }\n }\n\n // Clear garbage if shrunk\n if (lines.length < this.lastOutputLines.length) {\n output += ANSI.ERASE_DOWN;\n }\n\n this.stdout.write(output);\n this.lastOutputLines = lines;\n this.lastOutputHeight = lines.length;\n }\n\n private buildLines(): string[] {\n const lines: string[] = [];\n\n for (const task of this.tasks.values()) {\n const icon = this.getIcon(task);\n const title = task.title;\n\n let line = `${icon} ${title}`;\n\n if (task.type === 'progress' && task.total) {\n const bar = generateProgressBar(task.current, task.total);\n line += ` ${ANSI.FG_GRAY}${bar}${ANSI.RESET}`;\n }\n\n if (task.message) {\n line += ` ${ANSI.DIM}- ${task.message}${ANSI.RESET}`;\n }\n\n lines.push(line);\n }\n\n return lines;\n }\n\n private getIcon(task: TaskState): string {\n switch (task.status) {\n case 'pending':\n return `${ANSI.FG_GRAY}${symbols.unchecked}${ANSI.RESET}`;\n case 'loading': {\n const frame = symbols.spinner[this.frameIndex % symbols.spinner.length];\n return `${ANSI.FG_CYAN}${frame}${ANSI.RESET}`;\n }\n case 'success':\n return `${ANSI.FG_GREEN}${symbols.tick}${ANSI.RESET}`;\n case 'error':\n return `${ANSI.FG_RED}${symbols.cross}${ANSI.RESET}`;\n case 'warning':\n return `${ANSI.FG_YELLOW}!${ANSI.RESET}`;\n default:\n return ' ';\n }\n }\n}\n"],"names":["TaskRunner","add","id","config","tasks","set","status","current","update","updates","task","get","Object","assign","start","message","success","error","warning","run","isRunning","stdout","write","ANSI","HIDE_CURSOR","hijackConsole","process","on","handleSigInt","render","timer","setInterval","frameIndex","stop","clearInterval","undefined","restoreConsole","SHOW_CURSOR","logBuffer","length","join","removeListener","originalConsole","log","console","warn","logger","_type","args","util","require","msg","format","push","lines","buildLines","lastOutputLines","lastOutputHeight","output","i","newLine","ERASE_LINE","ERASE_DOWN","values","icon","getIcon","title","line","type","total","bar","generateProgressBar","FG_GRAY","RESET","DIM","symbols","unchecked","frame","spinner","FG_CYAN","FG_GREEN","tick","FG_RED","cross","FG_YELLOW","options","Map","exit","bind"],"mappings":"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"}