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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/dist/ansi.d.ts +36 -0
  2. package/dist/ansi.js +1 -0
  3. package/dist/base.d.ts +60 -0
  4. package/dist/base.js +1 -0
  5. package/dist/{src/core.js → core.d.ts} +175 -345
  6. package/dist/core.js +1 -0
  7. package/dist/data/countries.d.ts +2 -0
  8. package/dist/data/countries.js +1 -0
  9. package/dist/data/licenses.d.ts +2 -0
  10. package/dist/data/licenses.js +1 -0
  11. package/dist/highlight.d.ts +7 -0
  12. package/dist/highlight.js +1 -0
  13. package/dist/index.d.ts +48 -0
  14. package/dist/index.js +1 -0
  15. package/dist/input.d.ts +14 -0
  16. package/dist/input.js +1 -0
  17. package/dist/pipeline.d.ts +90 -0
  18. package/dist/pipeline.js +1 -0
  19. package/dist/prompts/autocomplete.d.ts +22 -0
  20. package/dist/prompts/autocomplete.js +1 -0
  21. package/dist/prompts/box.d.ts +21 -0
  22. package/dist/prompts/box.js +4 -0
  23. package/dist/prompts/breadcrumb-search.d.ts +14 -0
  24. package/dist/prompts/breadcrumb-search.js +2 -0
  25. package/dist/prompts/breadcrumb.d.ts +32 -0
  26. package/dist/prompts/breadcrumb.js +3 -0
  27. package/dist/prompts/byte.d.ts +13 -0
  28. package/dist/prompts/byte.js +5 -0
  29. package/dist/prompts/calculator.d.ts +17 -0
  30. package/dist/prompts/calculator.js +3 -0
  31. package/dist/prompts/calendar.d.ts +33 -0
  32. package/dist/prompts/calendar.js +3 -0
  33. package/dist/prompts/checkbox.d.ts +13 -0
  34. package/dist/prompts/checkbox.js +2 -0
  35. package/dist/prompts/code.d.ts +19 -0
  36. package/dist/prompts/code.js +4 -0
  37. package/dist/prompts/color.d.ts +14 -0
  38. package/dist/prompts/color.js +10 -0
  39. package/dist/prompts/confirm.d.ts +8 -0
  40. package/dist/prompts/confirm.js +1 -0
  41. package/dist/prompts/connection-string.d.ts +18 -0
  42. package/dist/prompts/connection-string.js +1 -0
  43. package/dist/prompts/cron.d.ts +13 -0
  44. package/dist/prompts/cron.js +4 -0
  45. package/dist/prompts/curl-utils.d.ts +25 -0
  46. package/dist/prompts/curl-utils.js +1 -0
  47. package/dist/prompts/curl.d.ts +41 -0
  48. package/dist/prompts/curl.js +12 -0
  49. package/dist/prompts/data-inspector.d.ts +22 -0
  50. package/dist/prompts/data-inspector.js +5 -0
  51. package/dist/prompts/date.d.ts +12 -0
  52. package/dist/prompts/date.js +2 -0
  53. package/dist/prompts/dependency.d.ts +16 -0
  54. package/dist/prompts/dependency.js +3 -0
  55. package/dist/prompts/dial.d.ts +10 -0
  56. package/dist/prompts/dial.js +3 -0
  57. package/dist/prompts/diff.d.ts +10 -0
  58. package/dist/prompts/diff.js +10 -0
  59. package/dist/prompts/draw.d.ts +20 -0
  60. package/dist/prompts/draw.js +6 -0
  61. package/dist/prompts/editor.d.ts +14 -0
  62. package/dist/prompts/editor.js +2 -0
  63. package/dist/prompts/emoji.d.ts +18 -0
  64. package/dist/prompts/emoji.js +5 -0
  65. package/dist/prompts/exec.d.ts +17 -0
  66. package/dist/prompts/exec.js +1 -0
  67. package/dist/prompts/file.d.ts +21 -0
  68. package/dist/prompts/file.js +2 -0
  69. package/dist/prompts/form.d.ts +18 -0
  70. package/dist/prompts/form.js +1 -0
  71. package/dist/prompts/fuzzy-multi-column.d.ts +12 -0
  72. package/dist/prompts/fuzzy-multi-column.js +2 -0
  73. package/dist/prompts/fuzzy.d.ts +12 -0
  74. package/dist/prompts/fuzzy.js +2 -0
  75. package/dist/prompts/gauge.d.ts +21 -0
  76. package/dist/prompts/gauge.js +4 -0
  77. package/dist/prompts/grid.d.ts +14 -0
  78. package/dist/prompts/grid.js +2 -0
  79. package/dist/prompts/heatmap.d.ts +13 -0
  80. package/dist/prompts/heatmap.js +2 -0
  81. package/dist/prompts/ip.d.ts +11 -0
  82. package/dist/prompts/ip.js +3 -0
  83. package/dist/prompts/kanban.d.ts +17 -0
  84. package/dist/prompts/kanban.js +4 -0
  85. package/dist/prompts/keypress.d.ts +7 -0
  86. package/dist/prompts/keypress.js +1 -0
  87. package/dist/prompts/license.d.ts +9 -0
  88. package/dist/prompts/license.js +13 -0
  89. package/dist/prompts/list.d.ts +9 -0
  90. package/dist/prompts/list.js +1 -0
  91. package/dist/prompts/map.d.ts +17 -0
  92. package/dist/prompts/map.js +5 -0
  93. package/dist/prompts/match.d.ts +19 -0
  94. package/dist/prompts/match.js +7 -0
  95. package/dist/prompts/miller.d.ts +15 -0
  96. package/dist/prompts/miller.js +2 -0
  97. package/dist/prompts/multi-column-select.d.ts +10 -0
  98. package/dist/prompts/multi-column-select.js +2 -0
  99. package/dist/prompts/multi-range.d.ts +9 -0
  100. package/dist/prompts/multi-range.js +3 -0
  101. package/dist/prompts/multi-select.d.ts +15 -0
  102. package/dist/prompts/multi-select.js +4 -0
  103. package/dist/prompts/number.d.ts +11 -0
  104. package/dist/prompts/number.js +2 -0
  105. package/dist/prompts/otp.d.ts +10 -0
  106. package/dist/prompts/otp.js +2 -0
  107. package/dist/prompts/pattern.d.ts +22 -0
  108. package/dist/prompts/pattern.js +4 -0
  109. package/dist/prompts/phone.d.ts +41 -0
  110. package/dist/prompts/phone.js +3 -0
  111. package/dist/prompts/quiz-select.d.ts +10 -0
  112. package/dist/prompts/quiz-select.js +7 -0
  113. package/dist/prompts/quiz-text.d.ts +11 -0
  114. package/dist/prompts/quiz-text.js +8 -0
  115. package/dist/prompts/range.d.ts +9 -0
  116. package/dist/prompts/range.js +1 -0
  117. package/dist/prompts/rating.d.ts +8 -0
  118. package/dist/prompts/rating.js +1 -0
  119. package/dist/prompts/regex.d.ts +13 -0
  120. package/dist/prompts/regex.js +5 -0
  121. package/dist/prompts/region.d.ts +11 -0
  122. package/dist/prompts/region.js +5 -0
  123. package/dist/prompts/schedule.d.ts +20 -0
  124. package/dist/prompts/schedule.js +5 -0
  125. package/dist/prompts/scroll.d.ts +13 -0
  126. package/dist/prompts/scroll.js +1 -0
  127. package/dist/prompts/seat.d.ts +17 -0
  128. package/dist/prompts/seat.js +5 -0
  129. package/dist/prompts/select-range.d.ts +8 -0
  130. package/dist/prompts/select-range.js +3 -0
  131. package/dist/prompts/select.d.ts +15 -0
  132. package/dist/prompts/select.js +2 -0
  133. package/dist/prompts/semver.d.ts +6 -0
  134. package/dist/prompts/semver.js +1 -0
  135. package/dist/prompts/shortcut.d.ts +9 -0
  136. package/dist/prompts/shortcut.js +1 -0
  137. package/dist/prompts/slider.d.ts +8 -0
  138. package/dist/prompts/slider.js +1 -0
  139. package/dist/prompts/slot.d.ts +16 -0
  140. package/dist/prompts/slot.js +8 -0
  141. package/dist/prompts/snippet.d.ts +19 -0
  142. package/dist/prompts/snippet.js +4 -0
  143. package/dist/prompts/sort-grid.d.ts +16 -0
  144. package/dist/prompts/sort-grid.js +2 -0
  145. package/dist/prompts/sort.d.ts +14 -0
  146. package/dist/prompts/sort.js +2 -0
  147. package/dist/prompts/spam.d.ts +17 -0
  148. package/dist/prompts/spam.js +2 -0
  149. package/dist/prompts/spreadsheet.d.ts +21 -0
  150. package/dist/prompts/spreadsheet.js +7 -0
  151. package/dist/prompts/table.d.ts +14 -0
  152. package/dist/prompts/table.js +3 -0
  153. package/dist/prompts/text.d.ts +17 -0
  154. package/dist/prompts/text.js +2 -0
  155. package/dist/prompts/time.d.ts +12 -0
  156. package/dist/prompts/time.js +2 -0
  157. package/dist/prompts/toggle.d.ts +8 -0
  158. package/dist/prompts/toggle.js +1 -0
  159. package/dist/prompts/transfer.d.ts +18 -0
  160. package/dist/prompts/transfer.js +5 -0
  161. package/dist/prompts/tree-select.d.ts +31 -0
  162. package/dist/prompts/tree-select.js +3 -0
  163. package/dist/prompts/tree.d.ts +20 -0
  164. package/dist/prompts/tree.js +3 -0
  165. package/dist/prompts/wait.d.ts +18 -0
  166. package/dist/prompts/wait.js +1 -0
  167. package/dist/spinner.d.ts +33 -0
  168. package/dist/spinner.js +3 -0
  169. package/dist/symbols.d.ts +33 -0
  170. package/dist/symbols.js +1 -0
  171. package/dist/tasks.d.ts +57 -0
  172. package/dist/tasks.js +1 -0
  173. package/dist/theme.d.ts +2 -0
  174. package/dist/theme.js +1 -0
  175. package/dist/types.d.ts +503 -0
  176. package/dist/types.js +1 -0
  177. package/dist/utils.d.ts +81 -0
  178. package/dist/utils.js +1 -0
  179. package/package.json +8 -9
  180. package/dist/src/ansi.js +0 -50
  181. package/dist/src/ansi.js.map +0 -1
  182. package/dist/src/base.js +0 -258
  183. package/dist/src/base.js.map +0 -1
  184. package/dist/src/core.js.map +0 -1
  185. package/dist/src/data/countries.js +0 -569
  186. package/dist/src/data/countries.js.map +0 -1
  187. package/dist/src/data/licenses.js +0 -480
  188. package/dist/src/data/licenses.js.map +0 -1
  189. package/dist/src/highlight.js +0 -185
  190. package/dist/src/highlight.js.map +0 -1
  191. package/dist/src/index.js +0 -66
  192. package/dist/src/index.js.map +0 -1
  193. package/dist/src/input.js +0 -158
  194. package/dist/src/input.js.map +0 -1
  195. package/dist/src/pipeline.js +0 -273
  196. package/dist/src/pipeline.js.map +0 -1
  197. package/dist/src/prompts/autocomplete.js +0 -171
  198. package/dist/src/prompts/autocomplete.js.map +0 -1
  199. package/dist/src/prompts/box.js +0 -225
  200. package/dist/src/prompts/box.js.map +0 -1
  201. package/dist/src/prompts/breadcrumb-search.js +0 -260
  202. package/dist/src/prompts/breadcrumb-search.js.map +0 -1
  203. package/dist/src/prompts/breadcrumb.js +0 -307
  204. package/dist/src/prompts/breadcrumb.js.map +0 -1
  205. package/dist/src/prompts/byte.js +0 -176
  206. package/dist/src/prompts/byte.js.map +0 -1
  207. package/dist/src/prompts/calculator.js +0 -243
  208. package/dist/src/prompts/calculator.js.map +0 -1
  209. package/dist/src/prompts/calendar.js +0 -430
  210. package/dist/src/prompts/calendar.js.map +0 -1
  211. package/dist/src/prompts/checkbox.js +0 -159
  212. package/dist/src/prompts/checkbox.js.map +0 -1
  213. package/dist/src/prompts/code.js +0 -271
  214. package/dist/src/prompts/code.js.map +0 -1
  215. package/dist/src/prompts/color.js +0 -165
  216. package/dist/src/prompts/color.js.map +0 -1
  217. package/dist/src/prompts/confirm.js +0 -55
  218. package/dist/src/prompts/confirm.js.map +0 -1
  219. package/dist/src/prompts/connection-string.js +0 -120
  220. package/dist/src/prompts/connection-string.js.map +0 -1
  221. package/dist/src/prompts/cron.js +0 -207
  222. package/dist/src/prompts/cron.js.map +0 -1
  223. package/dist/src/prompts/curl-utils.js +0 -71
  224. package/dist/src/prompts/curl-utils.js.map +0 -1
  225. package/dist/src/prompts/curl.js +0 -431
  226. package/dist/src/prompts/curl.js.map +0 -1
  227. package/dist/src/prompts/data-inspector.js +0 -261
  228. package/dist/src/prompts/data-inspector.js.map +0 -1
  229. package/dist/src/prompts/date.js +0 -185
  230. package/dist/src/prompts/date.js.map +0 -1
  231. package/dist/src/prompts/dependency.js +0 -283
  232. package/dist/src/prompts/dependency.js.map +0 -1
  233. package/dist/src/prompts/dial.js +0 -124
  234. package/dist/src/prompts/dial.js.map +0 -1
  235. package/dist/src/prompts/diff.js +0 -118
  236. package/dist/src/prompts/diff.js.map +0 -1
  237. package/dist/src/prompts/draw.js +0 -191
  238. package/dist/src/prompts/draw.js.map +0 -1
  239. package/dist/src/prompts/editor.js +0 -234
  240. package/dist/src/prompts/editor.js.map +0 -1
  241. package/dist/src/prompts/emoji.js +0 -226
  242. package/dist/src/prompts/emoji.js.map +0 -1
  243. package/dist/src/prompts/exec.js +0 -151
  244. package/dist/src/prompts/exec.js.map +0 -1
  245. package/dist/src/prompts/file.js +0 -217
  246. package/dist/src/prompts/file.js.map +0 -1
  247. package/dist/src/prompts/form.js +0 -241
  248. package/dist/src/prompts/form.js.map +0 -1
  249. package/dist/src/prompts/fuzzy-multi-column.js +0 -161
  250. package/dist/src/prompts/fuzzy-multi-column.js.map +0 -1
  251. package/dist/src/prompts/fuzzy.js +0 -147
  252. package/dist/src/prompts/fuzzy.js.map +0 -1
  253. package/dist/src/prompts/gauge.js +0 -137
  254. package/dist/src/prompts/gauge.js.map +0 -1
  255. package/dist/src/prompts/grid.js +0 -191
  256. package/dist/src/prompts/grid.js.map +0 -1
  257. package/dist/src/prompts/heatmap.js +0 -147
  258. package/dist/src/prompts/heatmap.js.map +0 -1
  259. package/dist/src/prompts/ip.js +0 -138
  260. package/dist/src/prompts/ip.js.map +0 -1
  261. package/dist/src/prompts/kanban.js +0 -233
  262. package/dist/src/prompts/kanban.js.map +0 -1
  263. package/dist/src/prompts/keypress.js +0 -54
  264. package/dist/src/prompts/keypress.js.map +0 -1
  265. package/dist/src/prompts/license.js +0 -144
  266. package/dist/src/prompts/license.js.map +0 -1
  267. package/dist/src/prompts/list.js +0 -124
  268. package/dist/src/prompts/list.js.map +0 -1
  269. package/dist/src/prompts/map.js +0 -262
  270. package/dist/src/prompts/map.js.map +0 -1
  271. package/dist/src/prompts/match.js +0 -271
  272. package/dist/src/prompts/match.js.map +0 -1
  273. package/dist/src/prompts/miller.js +0 -228
  274. package/dist/src/prompts/miller.js.map +0 -1
  275. package/dist/src/prompts/multi-column-select.js +0 -176
  276. package/dist/src/prompts/multi-column-select.js.map +0 -1
  277. package/dist/src/prompts/multi-range.js +0 -189
  278. package/dist/src/prompts/multi-range.js.map +0 -1
  279. package/dist/src/prompts/multi-select.js +0 -183
  280. package/dist/src/prompts/multi-select.js.map +0 -1
  281. package/dist/src/prompts/number.js +0 -166
  282. package/dist/src/prompts/number.js.map +0 -1
  283. package/dist/src/prompts/otp.js +0 -107
  284. package/dist/src/prompts/otp.js.map +0 -1
  285. package/dist/src/prompts/pattern.js +0 -252
  286. package/dist/src/prompts/pattern.js.map +0 -1
  287. package/dist/src/prompts/phone.js +0 -398
  288. package/dist/src/prompts/phone.js.map +0 -1
  289. package/dist/src/prompts/quiz-select.js +0 -114
  290. package/dist/src/prompts/quiz-select.js.map +0 -1
  291. package/dist/src/prompts/quiz-text.js +0 -98
  292. package/dist/src/prompts/quiz-text.js.map +0 -1
  293. package/dist/src/prompts/range.js +0 -164
  294. package/dist/src/prompts/range.js.map +0 -1
  295. package/dist/src/prompts/rating.js +0 -83
  296. package/dist/src/prompts/rating.js.map +0 -1
  297. package/dist/src/prompts/regex.js +0 -145
  298. package/dist/src/prompts/regex.js.map +0 -1
  299. package/dist/src/prompts/region.js +0 -170
  300. package/dist/src/prompts/region.js.map +0 -1
  301. package/dist/src/prompts/schedule.js +0 -270
  302. package/dist/src/prompts/schedule.js.map +0 -1
  303. package/dist/src/prompts/scroll.js +0 -155
  304. package/dist/src/prompts/scroll.js.map +0 -1
  305. package/dist/src/prompts/seat.js +0 -164
  306. package/dist/src/prompts/seat.js.map +0 -1
  307. package/dist/src/prompts/select-range.js +0 -148
  308. package/dist/src/prompts/select-range.js.map +0 -1
  309. package/dist/src/prompts/select.js +0 -163
  310. package/dist/src/prompts/select.js.map +0 -1
  311. package/dist/src/prompts/semver.js +0 -43
  312. package/dist/src/prompts/semver.js.map +0 -1
  313. package/dist/src/prompts/shortcut.js +0 -133
  314. package/dist/src/prompts/shortcut.js.map +0 -1
  315. package/dist/src/prompts/slider.js +0 -69
  316. package/dist/src/prompts/slider.js.map +0 -1
  317. package/dist/src/prompts/slot.js +0 -117
  318. package/dist/src/prompts/slot.js.map +0 -1
  319. package/dist/src/prompts/snippet.js +0 -228
  320. package/dist/src/prompts/snippet.js.map +0 -1
  321. package/dist/src/prompts/sort-grid.js +0 -151
  322. package/dist/src/prompts/sort-grid.js.map +0 -1
  323. package/dist/src/prompts/sort.js +0 -166
  324. package/dist/src/prompts/sort.js.map +0 -1
  325. package/dist/src/prompts/spam.js +0 -80
  326. package/dist/src/prompts/spam.js.map +0 -1
  327. package/dist/src/prompts/spreadsheet.js +0 -240
  328. package/dist/src/prompts/spreadsheet.js.map +0 -1
  329. package/dist/src/prompts/table.js +0 -120
  330. package/dist/src/prompts/table.js.map +0 -1
  331. package/dist/src/prompts/text.js +0 -317
  332. package/dist/src/prompts/text.js.map +0 -1
  333. package/dist/src/prompts/time.js +0 -211
  334. package/dist/src/prompts/time.js.map +0 -1
  335. package/dist/src/prompts/toggle.js +0 -53
  336. package/dist/src/prompts/toggle.js.map +0 -1
  337. package/dist/src/prompts/transfer.js +0 -207
  338. package/dist/src/prompts/transfer.js.map +0 -1
  339. package/dist/src/prompts/tree-select.js +0 -270
  340. package/dist/src/prompts/tree-select.js.map +0 -1
  341. package/dist/src/prompts/tree.js +0 -233
  342. package/dist/src/prompts/tree.js.map +0 -1
  343. package/dist/src/prompts/wait.js +0 -79
  344. package/dist/src/prompts/wait.js.map +0 -1
  345. package/dist/src/spinner.js +0 -105
  346. package/dist/src/spinner.js.map +0 -1
  347. package/dist/src/symbols.js +0 -66
  348. package/dist/src/symbols.js.map +0 -1
  349. package/dist/src/tasks.js +0 -231
  350. package/dist/src/tasks.js.map +0 -1
  351. package/dist/src/theme.js +0 -29
  352. package/dist/src/theme.js.map +0 -1
  353. package/dist/src/types.js +0 -8
  354. package/dist/src/types.js.map +0 -1
  355. package/dist/src/utils.js +0 -480
  356. package/dist/src/utils.js.map +0 -1
package/dist/src/utils.js DELETED
@@ -1,480 +0,0 @@
1
- // src/utils.ts
2
- /**
3
- * Detects terminal capabilities.
4
- */ "use strict";
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- function _export(target, all) {
9
- for(var name in all)Object.defineProperty(target, name, {
10
- enumerable: true,
11
- get: Object.getOwnPropertyDescriptor(all, name).get
12
- });
13
- }
14
- _export(exports, {
15
- get Graph () {
16
- return Graph;
17
- },
18
- get Layout () {
19
- return Layout;
20
- },
21
- get detectCapabilities () {
22
- return detectCapabilities;
23
- },
24
- get fuzzyMatch () {
25
- return fuzzyMatch;
26
- },
27
- get generateProgressBar () {
28
- return generateProgressBar;
29
- },
30
- get safeSplit () {
31
- return safeSplit;
32
- },
33
- get stringWidth () {
34
- return stringWidth;
35
- },
36
- get stripAnsi () {
37
- return stripAnsi;
38
- }
39
- });
40
- function detectCapabilities() {
41
- const env = process.env;
42
- // Check for CI
43
- const isCI = !!env.CI;
44
- // Check for True Color support
45
- const hasTrueColor = env.COLORTERM === 'truecolor' || !!env.WT_SESSION;
46
- // Check if it is a TTY
47
- const isTTY = process.stdout.isTTY;
48
- const isWindows = process.platform === 'win32';
49
- // Better Unicode detection logic
50
- const isUnicodeSupported = ()=>{
51
- // 1. Windows: Check specific environmental variables
52
- if (isWindows) {
53
- // Windows Terminal
54
- if (env.WT_SESSION) return true;
55
- // VSCode terminal
56
- if (env.TERM_PROGRAM === 'vscode') return true;
57
- // Modern terminals setting TERM (e.g. Alacritty, Git Bash, Cygwin)
58
- if (env.TERM === 'xterm-256color' || env.TERM === 'alacritty') return true;
59
- // ConEmu / Cmder
60
- if (env.ConEmuTask) return true;
61
- // CI on Windows typically supports Unicode.
62
- if (isCI) return true;
63
- // Default cmd.exe / old powershell => False (ASCII)
64
- return false;
65
- }
66
- // 2. Non-Windows (Linux/macOS)
67
- if (env.TERM_PROGRAM === 'Apple_Terminal') return true;
68
- // Check if the LANG or LC_ALL variable contains UTF-8.
69
- const lang = env.LANG || '';
70
- const lcAll = env.LC_ALL || '';
71
- return lang && lang.toUpperCase().endsWith('UTF-8') || lcAll && lcAll.toUpperCase().endsWith('UTF-8');
72
- };
73
- return {
74
- isCI,
75
- hasTrueColor,
76
- // Enable Unicode only if it's TTY and environment supports it.
77
- hasUnicode: isTTY && isUnicodeSupported(),
78
- // Check if mouse should be enabled (TTY and not CI, or explicit override)
79
- // SGR is widely supported in modern terminals
80
- hasMouse: isTTY && !isCI
81
- };
82
- }
83
- function stripAnsi(str) {
84
- return str.replace(/\x1b\[[0-9;]*m/g, '');
85
- }
86
- /**
87
- * Sorted array of Unicode ranges that are typically full-width (2 columns).
88
- * Includes CJK, Emoji, Fullwidth forms, etc.
89
- * Format: [start, end] inclusive.
90
- */ const WIDE_RANGES = [
91
- [
92
- 0x1100,
93
- 0x11FF
94
- ],
95
- [
96
- 0x2E80,
97
- 0x2EFF
98
- ],
99
- [
100
- 0x2F00,
101
- 0x2FDF
102
- ],
103
- [
104
- 0x3000,
105
- 0x303F
106
- ],
107
- [
108
- 0x3040,
109
- 0x309F
110
- ],
111
- [
112
- 0x30A0,
113
- 0x30FF
114
- ],
115
- [
116
- 0x3100,
117
- 0x312F
118
- ],
119
- [
120
- 0x3130,
121
- 0x318F
122
- ],
123
- [
124
- 0x3200,
125
- 0x32FF
126
- ],
127
- [
128
- 0x3300,
129
- 0x33FF
130
- ],
131
- [
132
- 0x3400,
133
- 0x4DBF
134
- ],
135
- [
136
- 0x4E00,
137
- 0x9FFF
138
- ],
139
- [
140
- 0xA960,
141
- 0xA97F
142
- ],
143
- [
144
- 0xAC00,
145
- 0xD7AF
146
- ],
147
- [
148
- 0xD7B0,
149
- 0xD7FF
150
- ],
151
- [
152
- 0xF900,
153
- 0xFAFF
154
- ],
155
- [
156
- 0xFE10,
157
- 0xFE1F
158
- ],
159
- [
160
- 0xFE30,
161
- 0xFE4F
162
- ],
163
- [
164
- 0xFE50,
165
- 0xFE6F
166
- ],
167
- [
168
- 0xFF01,
169
- 0xFF60
170
- ],
171
- [
172
- 0xFFE0,
173
- 0xFFE6
174
- ],
175
- [
176
- 0x1F300,
177
- 0x1F6FF
178
- ],
179
- [
180
- 0x1F900,
181
- 0x1F9FF
182
- ]
183
- ];
184
- /**
185
- * Binary search to check if a code point is in the wide ranges.
186
- */ function isWideCodePoint(cp) {
187
- let low = 0;
188
- let high = WIDE_RANGES.length - 1;
189
- while(low <= high){
190
- const mid = Math.floor((low + high) / 2);
191
- const [start, end] = WIDE_RANGES[mid];
192
- if (cp >= start && cp <= end) {
193
- return true;
194
- } else if (cp < start) {
195
- high = mid - 1;
196
- } else {
197
- low = mid + 1;
198
- }
199
- }
200
- return false;
201
- }
202
- function stringWidth(str) {
203
- let width = 0;
204
- let inAnsi = false;
205
- for(let i = 0; i < str.length; i++){
206
- const code = str.charCodeAt(i);
207
- // Simple ANSI parser state check
208
- if (str[i] === '\x1b') {
209
- inAnsi = true;
210
- continue;
211
- }
212
- if (inAnsi) {
213
- if (str[i] === '[') {
214
- continue;
215
- }
216
- if (str[i] >= '@' && str[i] <= '~') {
217
- inAnsi = false;
218
- }
219
- continue;
220
- }
221
- // Handle surrogate pairs for high code points (Emoji)
222
- let cp = code;
223
- if (code >= 0xD800 && code <= 0xDBFF && i + 1 < str.length) {
224
- const next = str.charCodeAt(i + 1);
225
- if (next >= 0xDC00 && next <= 0xDFFF) {
226
- // Calculate code point from surrogate pair
227
- cp = (code - 0xD800) * 0x400 + (next - 0xDC00) + 0x10000;
228
- i++; // Skip next char
229
- }
230
- }
231
- width += isWideCodePoint(cp) ? 2 : 1;
232
- }
233
- return width;
234
- }
235
- function safeSplit(str) {
236
- // @ts-ignore - Intl.Segmenter is available in Node 16+ but TS might complain depending on lib settings
237
- const segmenter = new Intl.Segmenter(undefined, {
238
- granularity: 'grapheme'
239
- });
240
- const segments = segmenter.segment(str);
241
- const result = [];
242
- for (const segment of segments){
243
- result.push(segment.segment);
244
- }
245
- return result;
246
- }
247
- function fuzzyMatch(query, target) {
248
- if (!query) return {
249
- score: 0,
250
- indices: []
251
- };
252
- const queryLower = query.toLowerCase();
253
- const targetLower = target.toLowerCase();
254
- let queryIdx = 0;
255
- let targetIdx = 0;
256
- const indices = [];
257
- let score = 0;
258
- let consecutive = 0;
259
- // Track previous match index for consecutive check
260
- let lastMatchIdx = -1;
261
- // Simple greedy subsequence match
262
- while(queryIdx < queryLower.length && targetIdx < targetLower.length){
263
- const qChar = queryLower[queryIdx];
264
- const tChar = targetLower[targetIdx];
265
- if (qChar === tChar) {
266
- indices.push(targetIdx);
267
- let charScore = 1;
268
- // Bonus: Consecutive match
269
- if (lastMatchIdx !== -1 && targetIdx === lastMatchIdx + 1) {
270
- consecutive++;
271
- charScore += consecutive * 2; // Increasing bonus for longer runs
272
- } else {
273
- consecutive = 0;
274
- }
275
- // Bonus: Match at start of string
276
- if (targetIdx === 0) {
277
- charScore += 5;
278
- } else if (targetIdx > 0) {
279
- const prevChar = target.charAt(targetIdx - 1);
280
- if (/[\s_\-.]/.test(prevChar) || prevChar === '/') {
281
- charScore += 4;
282
- } else if (prevChar !== prevChar.toUpperCase() && target.charAt(targetIdx) === target.charAt(targetIdx).toUpperCase()) {
283
- // CamelCase hump
284
- charScore += 3;
285
- }
286
- }
287
- score += charScore;
288
- lastMatchIdx = targetIdx;
289
- queryIdx++;
290
- }
291
- targetIdx++;
292
- }
293
- // Must match all characters in query
294
- if (queryIdx < queryLower.length) {
295
- return null;
296
- }
297
- // Penalty for total length (prefer shorter strings)
298
- score -= target.length * 0.1;
299
- // Penalty for distance between first and last match (compactness)
300
- if (indices.length > 1) {
301
- const spread = indices[indices.length - 1] - indices[0];
302
- score -= spread * 0.5;
303
- }
304
- return {
305
- score,
306
- indices
307
- };
308
- }
309
- const Layout = {
310
- /**
311
- * Truncates a string to a specific visual width, respecting ANSI codes.
312
- */ truncate (str, width) {
313
- const visualWidth = stringWidth(str);
314
- if (visualWidth <= width) {
315
- return str;
316
- }
317
- let currentWidth = 0;
318
- let cutIndex = 0;
319
- let inAnsi = false;
320
- for(let i = 0; i < str.length; i++){
321
- if (str[i] === '\x1b') inAnsi = true;
322
- if (!inAnsi) {
323
- const code = str.charCodeAt(i);
324
- // Handle surrogate pair
325
- if (code >= 0xD800 && code <= 0xDBFF && i + 1 < str.length) {
326
- const next = str.charCodeAt(i + 1);
327
- if (next >= 0xDC00 && next <= 0xDFFF) {
328
- const cp = (code - 0xD800) * 0x400 + (next - 0xDC00) + 0x10000;
329
- const w = isWideCodePoint(cp) ? 2 : 1;
330
- if (currentWidth + w > width) break;
331
- currentWidth += w;
332
- cutIndex = i + 2;
333
- i++; // Skip next
334
- continue;
335
- }
336
- }
337
- const w = isWideCodePoint(code) ? 2 : 1;
338
- if (currentWidth + w > width) break;
339
- currentWidth += w;
340
- } else {
341
- if (str[i] === 'm' || str[i] >= 'A' && str[i] <= 'Z') inAnsi = false;
342
- }
343
- cutIndex = i + 1;
344
- }
345
- return str.substring(0, cutIndex) + '\x1b[0m';
346
- },
347
- /**
348
- * Pads a string to a specific visual length.
349
- * Respects ANSI codes (does not count them towards length).
350
- */ pad (text, length, align = 'left') {
351
- const visualLen = stringWidth(text);
352
- if (visualLen >= length) return text;
353
- const padLen = Math.max(0, length - visualLen);
354
- if (align === 'left') {
355
- return text + ' '.repeat(padLen);
356
- } else if (align === 'right') {
357
- return ' '.repeat(padLen) + text;
358
- } else {
359
- const leftPad = Math.floor(padLen / 2);
360
- const rightPad = padLen - leftPad;
361
- return ' '.repeat(leftPad) + text + ' '.repeat(rightPad);
362
- }
363
- },
364
- /**
365
- * Splits two multi-line strings side-by-side.
366
- * @param left Content for left column
367
- * @param right Content for right column
368
- * @param width Total available width
369
- * @param options Configuration for ratio and gap
370
- */ split (left, right, width, options = {}) {
371
- const ratio = options.ratio ?? 0.5;
372
- const gap = options.gap ?? 2;
373
- let leftWidth = Math.floor((width - gap) * ratio);
374
- let rightWidth = width - leftWidth - gap;
375
- if (leftWidth < 1 || rightWidth < 1) {
376
- leftWidth = Math.max(0, width);
377
- rightWidth = 0;
378
- // Fallback to single column if too narrow?
379
- // For now just prevent crash.
380
- }
381
- const leftLines = left.split('\n');
382
- const rightLines = right.split('\n');
383
- const maxLines = Math.max(leftLines.length, rightLines.length);
384
- const result = [];
385
- for(let i = 0; i < maxLines; i++){
386
- const leftLine = leftLines[i] || '';
387
- const rightLine = rightLines[i] || '';
388
- const l = Layout.pad(Layout.truncate(leftLine, leftWidth), leftWidth);
389
- const r = Layout.pad(Layout.truncate(rightLine, rightWidth), rightWidth);
390
- result.push(`${l}${' '.repeat(gap)}${r}`);
391
- }
392
- return result.join('\n');
393
- },
394
- /**
395
- * Wraps a string to a specific visual width.
396
- * Respects word boundaries where possible.
397
- */ wrap (str, width) {
398
- const paragraphs = str.split('\n');
399
- return paragraphs.map((para)=>{
400
- const words = para.split(' ');
401
- let currentLine = '';
402
- const lines = [];
403
- for (const word of words){
404
- const wordWidth = stringWidth(word);
405
- const currentWidth = stringWidth(currentLine);
406
- const spaceWidth = currentLine ? 1 : 0;
407
- if (currentWidth + spaceWidth + wordWidth <= width) {
408
- currentLine += (currentLine ? ' ' : '') + word;
409
- } else {
410
- if (currentLine) lines.push(currentLine);
411
- currentLine = word;
412
- }
413
- }
414
- if (currentLine) lines.push(currentLine);
415
- return lines.join('\n');
416
- }).join('\n');
417
- }
418
- };
419
- const Graph = {
420
- /**
421
- * Returns all dependencies (transitive) for an item.
422
- */ getDependencies (item, getDeps) {
423
- const visited = new Set();
424
- const result = [];
425
- const visit = (current)=>{
426
- if (visited.has(current)) return;
427
- visited.add(current);
428
- const deps = getDeps(current);
429
- for (const dep of deps){
430
- visit(dep);
431
- }
432
- if (current !== item) {
433
- result.push(current);
434
- }
435
- };
436
- visit(item);
437
- return result;
438
- },
439
- /**
440
- * Topologically sorts items based on dependencies.
441
- * Returns items in order (dependencies first).
442
- * Throws error if cycle detected.
443
- */ topologicalSort (items, getDeps) {
444
- const visited = new Set();
445
- const temp = new Set();
446
- const order = [];
447
- const visit = (node)=>{
448
- if (temp.has(node)) {
449
- throw new Error('Cyclic dependency detected');
450
- }
451
- if (visited.has(node)) return;
452
- temp.add(node);
453
- const deps = getDeps(node);
454
- for (const dep of deps){
455
- visit(dep);
456
- }
457
- temp.delete(node);
458
- visited.add(node);
459
- order.push(node);
460
- };
461
- for (const item of items){
462
- if (!visited.has(item)) {
463
- visit(item);
464
- }
465
- }
466
- return order;
467
- }
468
- };
469
- function generateProgressBar(current, total, width = 20) {
470
- const percentage = Math.min(Math.max(current / total, 0), 1);
471
- const barWidth = width;
472
- const filledWidth = Math.round(barWidth * percentage);
473
- const emptyWidth = barWidth - filledWidth;
474
- const filled = '█'.repeat(filledWidth);
475
- const empty = '-'.repeat(emptyWidth);
476
- const percentStr = Math.round(percentage * 100) + '%';
477
- return `[${filled}${empty}] ${percentStr}`;
478
- }
479
-
480
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils.ts"],"sourcesContent":["// src/utils.ts\n\n/**\n * Detects terminal capabilities.\n */\nexport function detectCapabilities() {\n const env = process.env;\n\n // Check for CI\n const isCI = !!env.CI;\n\n // Check for True Color support\n const hasTrueColor = env.COLORTERM === 'truecolor' || !!env.WT_SESSION;\n\n // Check if it is a TTY\n const isTTY = process.stdout.isTTY;\n const isWindows = process.platform === 'win32';\n\n // Better Unicode detection logic\n const isUnicodeSupported = () => {\n // 1. Windows: Check specific environmental variables\n if (isWindows) {\n // Windows Terminal\n if (env.WT_SESSION) return true;\n // VSCode terminal\n if (env.TERM_PROGRAM === 'vscode') return true;\n // Modern terminals setting TERM (e.g. Alacritty, Git Bash, Cygwin)\n if (env.TERM === 'xterm-256color' || env.TERM === 'alacritty') return true;\n // ConEmu / Cmder\n if (env.ConEmuTask) return true;\n\n // CI on Windows typically supports Unicode.\n if (isCI) return true;\n\n // Default cmd.exe / old powershell => False (ASCII)\n return false;\n }\n\n // 2. Non-Windows (Linux/macOS)\n if (env.TERM_PROGRAM === 'Apple_Terminal') return true;\n\n // Check if the LANG or LC_ALL variable contains UTF-8.\n const lang = env.LANG || '';\n const lcAll = env.LC_ALL || '';\n\n return (lang && lang.toUpperCase().endsWith('UTF-8')) ||\n (lcAll && lcAll.toUpperCase().endsWith('UTF-8'));\n };\n\n return {\n isCI,\n hasTrueColor,\n // Enable Unicode only if it's TTY and environment supports it.\n hasUnicode: isTTY && isUnicodeSupported(),\n // Check if mouse should be enabled (TTY and not CI, or explicit override)\n // SGR is widely supported in modern terminals\n hasMouse: isTTY && !isCI\n };\n}\n\n/**\n * Strips ANSI escape codes from a string.\n */\nexport function stripAnsi(str: string): string {\n return str.replace(/\\x1b\\[[0-9;]*m/g, '');\n}\n\n/**\n * Sorted array of Unicode ranges that are typically full-width (2 columns).\n * Includes CJK, Emoji, Fullwidth forms, etc.\n * Format: [start, end] inclusive.\n */\nconst WIDE_RANGES: [number, number][] = [\n [0x1100, 0x11FF], // Hangul Jamo\n [0x2E80, 0x2EFF], // CJK Radicals Supplement\n [0x2F00, 0x2FDF], // Kangxi Radicals\n [0x3000, 0x303F], // CJK Symbols and Punctuation\n [0x3040, 0x309F], // Hiragana\n [0x30A0, 0x30FF], // Katakana\n [0x3100, 0x312F], // Bopomofo\n [0x3130, 0x318F], // Hangul Compatibility Jamo\n [0x3200, 0x32FF], // Enclosed CJK Letters and Months\n [0x3300, 0x33FF], // CJK Compatibility\n [0x3400, 0x4DBF], // CJK Unified Ideographs Extension A\n [0x4E00, 0x9FFF], // CJK Unified Ideographs\n [0xA960, 0xA97F], // Hangul Jamo Extended-A\n [0xAC00, 0xD7AF], // Hangul Syllables\n [0xD7B0, 0xD7FF], // Hangul Jamo Extended-B\n [0xF900, 0xFAFF], // CJK Compatibility Ideographs\n [0xFE10, 0xFE1F], // Vertical Forms\n [0xFE30, 0xFE4F], // CJK Compatibility Forms\n [0xFE50, 0xFE6F], // Small Form Variants\n [0xFF01, 0xFF60], // Fullwidth ASCII variants\n [0xFFE0, 0xFFE6], // Fullwidth currency/symbols\n [0x1F300, 0x1F6FF], // Miscellaneous Symbols and Pictographs (Emoji)\n [0x1F900, 0x1F9FF], // Supplemental Symbols and Pictographs\n];\n\n/**\n * Binary search to check if a code point is in the wide ranges.\n */\nfunction isWideCodePoint(cp: number): boolean {\n let low = 0;\n let high = WIDE_RANGES.length - 1;\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n const [start, end] = WIDE_RANGES[mid];\n\n if (cp >= start && cp <= end) {\n return true;\n } else if (cp < start) {\n high = mid - 1;\n } else {\n low = mid + 1;\n }\n }\n return false;\n}\n\n/**\n * Calculates the visual width of a string.\n * Uses binary search for wide characters.\n * Handles ANSI codes (zero width).\n */\nexport function stringWidth(str: string): number {\n let width = 0;\n let inAnsi = false;\n\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n\n // Simple ANSI parser state check\n if (str[i] === '\\x1b') {\n inAnsi = true;\n continue;\n }\n if (inAnsi) {\n if (str[i] === '[') {\n // Continue, this is the start of CSI\n continue;\n }\n if ((str[i] >= '@' && str[i] <= '~')) {\n inAnsi = false;\n }\n continue;\n }\n\n // Handle surrogate pairs for high code points (Emoji)\n let cp = code;\n if (code >= 0xD800 && code <= 0xDBFF && i + 1 < str.length) {\n const next = str.charCodeAt(i + 1);\n if (next >= 0xDC00 && next <= 0xDFFF) {\n // Calculate code point from surrogate pair\n cp = (code - 0xD800) * 0x400 + (next - 0xDC00) + 0x10000;\n i++; // Skip next char\n }\n }\n\n width += isWideCodePoint(cp) ? 2 : 1;\n }\n return width;\n}\n\n/**\n * Safely splits a string into an array of grapheme clusters.\n * Uses Intl.Segmenter (Node 16+).\n */\nexport function safeSplit(str: string): string[] {\n // @ts-ignore - Intl.Segmenter is available in Node 16+ but TS might complain depending on lib settings\n const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n const segments = segmenter.segment(str);\n const result: string[] = [];\n for (const segment of segments) {\n result.push(segment.segment);\n }\n return result;\n}\n\n/**\n * Fuzzy match algorithm (Subsequence matching).\n * Returns score and matched indices, or null if no match.\n */\nexport function fuzzyMatch(query: string, target: string): { score: number; indices: number[] } | null {\n if (!query) return { score: 0, indices: [] };\n\n const queryLower = query.toLowerCase();\n const targetLower = target.toLowerCase();\n\n let queryIdx = 0;\n let targetIdx = 0;\n const indices: number[] = [];\n let score = 0;\n let consecutive = 0;\n // Track previous match index for consecutive check\n let lastMatchIdx = -1;\n\n // Simple greedy subsequence match\n while (queryIdx < queryLower.length && targetIdx < targetLower.length) {\n const qChar = queryLower[queryIdx];\n const tChar = targetLower[targetIdx];\n\n if (qChar === tChar) {\n indices.push(targetIdx);\n\n let charScore = 1;\n\n // Bonus: Consecutive match\n if (lastMatchIdx !== -1 && targetIdx === lastMatchIdx + 1) {\n consecutive++;\n charScore += (consecutive * 2); // Increasing bonus for longer runs\n } else {\n consecutive = 0;\n }\n\n // Bonus: Match at start of string\n if (targetIdx === 0) {\n charScore += 5;\n }\n // Bonus: Match after separator (camelCase or space or special char)\n else if (targetIdx > 0) {\n const prevChar = target.charAt(targetIdx - 1);\n if (/[\\s_\\-.]/.test(prevChar) || prevChar === '/') {\n charScore += 4;\n } else if (prevChar !== prevChar.toUpperCase() && target.charAt(targetIdx) === target.charAt(targetIdx).toUpperCase()) {\n // CamelCase hump\n charScore += 3;\n }\n }\n\n score += charScore;\n lastMatchIdx = targetIdx;\n queryIdx++;\n }\n targetIdx++;\n }\n\n // Must match all characters in query\n if (queryIdx < queryLower.length) {\n return null;\n }\n\n // Penalty for total length (prefer shorter strings)\n score -= target.length * 0.1;\n\n // Penalty for distance between first and last match (compactness)\n if (indices.length > 1) {\n const spread = indices[indices.length - 1] - indices[0];\n score -= spread * 0.5;\n }\n\n return { score, indices };\n}\n\n/**\n * Layout utilities for advanced rendering (Split View, etc.)\n */\nexport const Layout = {\n /**\n * Truncates a string to a specific visual width, respecting ANSI codes.\n */\n truncate(str: string, width: number): string {\n const visualWidth = stringWidth(str);\n if (visualWidth <= width) {\n return str;\n }\n\n let currentWidth = 0;\n let cutIndex = 0;\n let inAnsi = false;\n\n for (let i = 0; i < str.length; i++) {\n if (str[i] === '\\x1b') inAnsi = true;\n\n if (!inAnsi) {\n const code = str.charCodeAt(i);\n\n // Handle surrogate pair\n if (code >= 0xD800 && code <= 0xDBFF && i + 1 < str.length) {\n const next = str.charCodeAt(i + 1);\n if (next >= 0xDC00 && next <= 0xDFFF) {\n const cp = (code - 0xD800) * 0x400 + (next - 0xDC00) + 0x10000;\n const w = isWideCodePoint(cp) ? 2 : 1;\n if (currentWidth + w > width) break;\n currentWidth += w;\n cutIndex = i + 2;\n i++; // Skip next\n continue;\n }\n }\n\n const w = isWideCodePoint(code) ? 2 : 1;\n if (currentWidth + w > width) break;\n currentWidth += w;\n } else {\n if (str[i] === 'm' || (str[i] >= 'A' && str[i] <= 'Z')) inAnsi = false;\n }\n cutIndex = i + 1;\n }\n\n return str.substring(0, cutIndex) + '\\x1b[0m';\n },\n\n /**\n * Pads a string to a specific visual length.\n * Respects ANSI codes (does not count them towards length).\n */\n pad(text: string, length: number, align: 'left' | 'right' | 'center' = 'left'): string {\n const visualLen = stringWidth(text);\n if (visualLen >= length) return text;\n\n const padLen = Math.max(0, length - visualLen);\n if (align === 'left') {\n return text + ' '.repeat(padLen);\n } else if (align === 'right') {\n return ' '.repeat(padLen) + text;\n } else {\n const leftPad = Math.floor(padLen / 2);\n const rightPad = padLen - leftPad;\n return ' '.repeat(leftPad) + text + ' '.repeat(rightPad);\n }\n },\n\n /**\n * Splits two multi-line strings side-by-side.\n * @param left Content for left column\n * @param right Content for right column\n * @param width Total available width\n * @param options Configuration for ratio and gap\n */\n split(left: string, right: string, width: number, options: { ratio?: number, gap?: number } = {}): string {\n const ratio = options.ratio ?? 0.5;\n const gap = options.gap ?? 2;\n\n let leftWidth = Math.floor((width - gap) * ratio);\n let rightWidth = width - leftWidth - gap;\n\n if (leftWidth < 1 || rightWidth < 1) {\n leftWidth = Math.max(0, width);\n rightWidth = 0;\n // Fallback to single column if too narrow? \n // For now just prevent crash.\n }\n\n const leftLines = left.split('\\n');\n const rightLines = right.split('\\n');\n const maxLines = Math.max(leftLines.length, rightLines.length);\n\n const result: string[] = [];\n\n for (let i = 0; i < maxLines; i++) {\n const leftLine = leftLines[i] || '';\n const rightLine = rightLines[i] || '';\n\n const l = Layout.pad(Layout.truncate(leftLine, leftWidth), leftWidth);\n const r = Layout.pad(Layout.truncate(rightLine, rightWidth), rightWidth);\n\n result.push(`${l}${' '.repeat(gap)}${r}`);\n }\n\n return result.join('\\n');\n },\n\n /**\n * Wraps a string to a specific visual width.\n * Respects word boundaries where possible.\n */\n wrap(str: string, width: number): string {\n const paragraphs = str.split('\\n');\n return paragraphs.map(para => {\n const words = para.split(' ');\n let currentLine = '';\n const lines: string[] = [];\n\n for (const word of words) {\n const wordWidth = stringWidth(word);\n const currentWidth = stringWidth(currentLine);\n const spaceWidth = currentLine ? 1 : 0;\n\n if (currentWidth + spaceWidth + wordWidth <= width) {\n currentLine += (currentLine ? ' ' : '') + word;\n } else {\n if (currentLine) lines.push(currentLine);\n currentLine = word;\n }\n }\n if (currentLine) lines.push(currentLine);\n return lines.join('\\n');\n }).join('\\n');\n }\n};\n\n/**\n * Graph utilities for dependency management\n */\nexport const Graph = {\n /**\n * Returns all dependencies (transitive) for an item.\n */\n getDependencies<T>(item: T, getDeps: (i: T) => T[]): T[] {\n const visited = new Set<T>();\n const result: T[] = [];\n\n const visit = (current: T) => {\n if (visited.has(current)) return;\n visited.add(current);\n\n const deps = getDeps(current);\n for (const dep of deps) {\n visit(dep);\n }\n if (current !== item) {\n result.push(current);\n }\n };\n\n visit(item);\n return result;\n },\n\n /**\n * Topologically sorts items based on dependencies.\n * Returns items in order (dependencies first).\n * Throws error if cycle detected.\n */\n topologicalSort<T>(items: T[], getDeps: (i: T) => T[]): T[] {\n const visited = new Set<T>();\n const temp = new Set<T>();\n const order: T[] = [];\n\n const visit = (node: T) => {\n if (temp.has(node)) {\n throw new Error('Cyclic dependency detected');\n }\n if (visited.has(node)) return;\n\n temp.add(node);\n const deps = getDeps(node);\n for (const dep of deps) {\n visit(dep);\n }\n temp.delete(node);\n visited.add(node);\n order.push(node);\n };\n\n for (const item of items) {\n if (!visited.has(item)) {\n visit(item);\n }\n }\n\n return order;\n }\n};\n\n/**\n * Generates a progress bar string.\n */\nexport function generateProgressBar(current: number, total: number, width: number = 20): string {\n const percentage = Math.min(Math.max(current / total, 0), 1);\n const barWidth = width;\n const filledWidth = Math.round(barWidth * percentage);\n const emptyWidth = barWidth - filledWidth;\n\n const filled = '█'.repeat(filledWidth);\n const empty = '-'.repeat(emptyWidth);\n const percentStr = Math.round(percentage * 100) + '%';\n\n return `[${filled}${empty}] ${percentStr}`;\n}\n"],"names":["Graph","Layout","detectCapabilities","fuzzyMatch","generateProgressBar","safeSplit","stringWidth","stripAnsi","env","process","isCI","CI","hasTrueColor","COLORTERM","WT_SESSION","isTTY","stdout","isWindows","platform","isUnicodeSupported","TERM_PROGRAM","TERM","ConEmuTask","lang","LANG","lcAll","LC_ALL","toUpperCase","endsWith","hasUnicode","hasMouse","str","replace","WIDE_RANGES","isWideCodePoint","cp","low","high","length","mid","Math","floor","start","end","width","inAnsi","i","code","charCodeAt","next","segmenter","Intl","Segmenter","undefined","granularity","segments","segment","result","push","query","target","score","indices","queryLower","toLowerCase","targetLower","queryIdx","targetIdx","consecutive","lastMatchIdx","qChar","tChar","charScore","prevChar","charAt","test","spread","truncate","visualWidth","currentWidth","cutIndex","w","substring","pad","text","align","visualLen","padLen","max","repeat","leftPad","rightPad","split","left","right","options","ratio","gap","leftWidth","rightWidth","leftLines","rightLines","maxLines","leftLine","rightLine","l","r","join","wrap","paragraphs","map","para","words","currentLine","lines","word","wordWidth","spaceWidth","getDependencies","item","getDeps","visited","Set","visit","current","has","add","deps","dep","topologicalSort","items","temp","order","node","Error","delete","total","percentage","min","barWidth","filledWidth","round","emptyWidth","filled","empty","percentStr"],"mappings":"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"}