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.
- package/README.md +11 -2
- package/dist/{ansi.js → src/ansi.js} +17 -9
- package/dist/src/ansi.js.map +1 -0
- package/dist/{base.js → src/base.js} +82 -70
- package/dist/src/base.js.map +1 -0
- package/dist/{core.js → src/core.js} +266 -320
- package/dist/src/core.js.map +1 -0
- package/dist/src/data/countries.js +569 -0
- package/dist/src/data/countries.js.map +1 -0
- package/dist/src/data/licenses.js +480 -0
- package/dist/src/data/licenses.js.map +1 -0
- package/dist/{highlight.js → src/highlight.js} +77 -69
- package/dist/src/highlight.js.map +1 -0
- package/dist/src/index.js +66 -0
- package/dist/src/index.js.map +1 -0
- package/dist/{input.js → src/input.js} +47 -41
- package/dist/src/input.js.map +1 -0
- package/dist/src/pipeline.js +273 -0
- package/dist/src/pipeline.js.map +1 -0
- package/dist/{prompts → src/prompts}/autocomplete.js +58 -57
- package/dist/src/prompts/autocomplete.js.map +1 -0
- package/dist/{prompts → src/prompts}/box.js +86 -53
- package/dist/src/prompts/box.js.map +1 -0
- package/dist/{prompts → src/prompts}/breadcrumb-search.js +110 -98
- package/dist/src/prompts/breadcrumb-search.js.map +1 -0
- package/dist/{prompts → src/prompts}/breadcrumb.js +126 -121
- package/dist/src/prompts/breadcrumb.js.map +1 -0
- package/dist/{prompts → src/prompts}/byte.js +69 -52
- package/dist/src/prompts/byte.js.map +1 -0
- package/dist/{prompts → src/prompts}/calculator.js +79 -56
- package/dist/src/prompts/calculator.js.map +1 -0
- package/dist/{prompts → src/prompts}/calendar.js +167 -127
- package/dist/src/prompts/calendar.js.map +1 -0
- package/dist/{prompts → src/prompts}/checkbox.js +53 -49
- package/dist/src/prompts/checkbox.js.map +1 -0
- package/dist/{prompts → src/prompts}/code.js +88 -76
- package/dist/src/prompts/code.js.map +1 -0
- package/dist/{prompts → src/prompts}/color.js +68 -50
- package/dist/src/prompts/color.js.map +1 -0
- package/dist/{prompts → src/prompts}/confirm.js +22 -15
- package/dist/src/prompts/confirm.js.map +1 -0
- package/dist/{prompts → src/prompts}/connection-string.js +59 -36
- package/dist/src/prompts/connection-string.js.map +1 -0
- package/dist/{prompts → src/prompts}/cron.js +90 -59
- package/dist/src/prompts/cron.js.map +1 -0
- package/dist/src/prompts/curl-utils.js +71 -0
- package/dist/src/prompts/curl-utils.js.map +1 -0
- package/dist/{prompts → src/prompts}/curl.js +153 -132
- package/dist/src/prompts/curl.js.map +1 -0
- package/dist/{prompts → src/prompts}/data-inspector.js +96 -91
- package/dist/src/prompts/data-inspector.js.map +1 -0
- package/dist/{prompts → src/prompts}/date.js +64 -57
- package/dist/src/prompts/date.js.map +1 -0
- package/dist/{prompts → src/prompts}/dependency.js +84 -80
- package/dist/src/prompts/dependency.js.map +1 -0
- package/dist/{prompts → src/prompts}/dial.js +49 -35
- package/dist/src/prompts/dial.js.map +1 -0
- package/dist/src/prompts/diff.js +118 -0
- package/dist/src/prompts/diff.js.map +1 -0
- package/dist/{prompts → src/prompts}/draw.js +83 -80
- package/dist/src/prompts/draw.js.map +1 -0
- package/dist/src/prompts/editor.js +234 -0
- package/dist/src/prompts/editor.js.map +1 -0
- package/dist/{prompts → src/prompts}/emoji.js +80 -82
- package/dist/src/prompts/emoji.js.map +1 -0
- package/dist/{prompts → src/prompts}/exec.js +60 -46
- package/dist/src/prompts/exec.js.map +1 -0
- package/dist/src/prompts/file.js +217 -0
- package/dist/src/prompts/file.js.map +1 -0
- package/dist/{prompts → src/prompts}/form.js +63 -54
- package/dist/src/prompts/form.js.map +1 -0
- package/dist/{prompts → src/prompts}/fuzzy-multi-column.js +65 -53
- package/dist/src/prompts/fuzzy-multi-column.js.map +1 -0
- package/dist/{prompts → src/prompts}/fuzzy.js +66 -55
- package/dist/src/prompts/fuzzy.js.map +1 -0
- package/dist/src/prompts/gauge.js +137 -0
- package/dist/src/prompts/gauge.js.map +1 -0
- package/dist/{prompts → src/prompts}/grid.js +70 -57
- package/dist/src/prompts/grid.js.map +1 -0
- package/dist/{prompts → src/prompts}/heatmap.js +70 -64
- package/dist/src/prompts/heatmap.js.map +1 -0
- package/dist/{prompts → src/prompts}/ip.js +56 -36
- package/dist/src/prompts/ip.js.map +1 -0
- package/dist/{prompts → src/prompts}/kanban.js +63 -58
- package/dist/src/prompts/kanban.js.map +1 -0
- package/dist/src/prompts/keypress.js +54 -0
- package/dist/src/prompts/keypress.js.map +1 -0
- package/dist/src/prompts/license.js +144 -0
- package/dist/src/prompts/license.js.map +1 -0
- package/dist/{prompts → src/prompts}/list.js +46 -31
- package/dist/src/prompts/list.js.map +1 -0
- package/dist/{prompts → src/prompts}/map.js +93 -77
- package/dist/src/prompts/map.js.map +1 -0
- package/dist/{prompts → src/prompts}/match.js +91 -95
- package/dist/src/prompts/match.js.map +1 -0
- package/dist/{prompts → src/prompts}/miller.js +74 -67
- package/dist/src/prompts/miller.js.map +1 -0
- package/dist/{prompts → src/prompts}/multi-column-select.js +54 -44
- package/dist/src/prompts/multi-column-select.js.map +1 -0
- package/dist/{prompts → src/prompts}/multi-range.js +70 -52
- package/dist/src/prompts/multi-range.js.map +1 -0
- package/dist/{prompts → src/prompts}/multi-select.js +67 -58
- package/dist/src/prompts/multi-select.js.map +1 -0
- package/dist/{prompts → src/prompts}/number.js +51 -39
- package/dist/src/prompts/number.js.map +1 -0
- package/dist/{prompts → src/prompts}/otp.js +43 -27
- package/dist/src/prompts/otp.js.map +1 -0
- package/dist/{prompts → src/prompts}/pattern.js +74 -71
- package/dist/src/prompts/pattern.js.map +1 -0
- package/dist/{prompts → src/prompts}/phone.js +107 -118
- package/dist/src/prompts/phone.js.map +1 -0
- package/dist/src/prompts/quiz-select.js +114 -0
- package/dist/src/prompts/quiz-select.js.map +1 -0
- package/dist/src/prompts/quiz-text.js +98 -0
- package/dist/src/prompts/quiz-text.js.map +1 -0
- package/dist/{prompts → src/prompts}/range.js +85 -61
- package/dist/src/prompts/range.js.map +1 -0
- package/dist/{prompts → src/prompts}/rating.js +29 -24
- package/dist/src/prompts/rating.js.map +1 -0
- package/dist/{prompts → src/prompts}/regex.js +50 -36
- package/dist/src/prompts/regex.js.map +1 -0
- package/dist/{prompts → src/prompts}/region.js +62 -56
- package/dist/src/prompts/region.js.map +1 -0
- package/dist/{prompts → src/prompts}/schedule.js +82 -75
- package/dist/src/prompts/schedule.js.map +1 -0
- package/dist/{prompts → src/prompts}/scroll.js +61 -58
- package/dist/src/prompts/scroll.js.map +1 -0
- package/dist/src/prompts/seat.js +164 -0
- package/dist/src/prompts/seat.js.map +1 -0
- package/dist/{prompts → src/prompts}/select-range.js +58 -46
- package/dist/src/prompts/select-range.js.map +1 -0
- package/dist/{prompts → src/prompts}/select.js +65 -66
- package/dist/src/prompts/select.js.map +1 -0
- package/dist/{prompts → src/prompts}/semver.js +24 -13
- package/dist/src/prompts/semver.js.map +1 -0
- package/dist/src/prompts/shortcut.js +133 -0
- package/dist/src/prompts/shortcut.js.map +1 -0
- package/dist/{prompts → src/prompts}/slider.js +28 -23
- package/dist/src/prompts/slider.js.map +1 -0
- package/dist/src/prompts/slot.js +117 -0
- package/dist/src/prompts/slot.js.map +1 -0
- package/dist/{prompts → src/prompts}/snippet.js +82 -61
- package/dist/src/prompts/snippet.js.map +1 -0
- package/dist/{prompts → src/prompts}/sort-grid.js +64 -59
- package/dist/src/prompts/sort-grid.js.map +1 -0
- package/dist/{prompts → src/prompts}/sort.js +59 -49
- package/dist/src/prompts/sort.js.map +1 -0
- package/dist/src/prompts/spam.js +80 -0
- package/dist/src/prompts/spam.js.map +1 -0
- package/dist/{prompts → src/prompts}/spreadsheet.js +71 -70
- package/dist/src/prompts/spreadsheet.js.map +1 -0
- package/dist/{prompts → src/prompts}/table.js +52 -38
- package/dist/src/prompts/table.js.map +1 -0
- package/dist/{prompts → src/prompts}/text.js +74 -70
- package/dist/src/prompts/text.js.map +1 -0
- package/dist/{prompts → src/prompts}/time.js +105 -96
- package/dist/src/prompts/time.js.map +1 -0
- package/dist/src/prompts/toggle.js +53 -0
- package/dist/src/prompts/toggle.js.map +1 -0
- package/dist/{prompts → src/prompts}/transfer.js +71 -67
- package/dist/src/prompts/transfer.js.map +1 -0
- package/dist/{prompts → src/prompts}/tree-select.js +83 -86
- package/dist/src/prompts/tree-select.js.map +1 -0
- package/dist/{prompts → src/prompts}/tree.js +69 -67
- package/dist/src/prompts/tree.js.map +1 -0
- package/dist/src/prompts/wait.js +79 -0
- package/dist/src/prompts/wait.js.map +1 -0
- package/dist/src/spinner.js +105 -0
- package/dist/src/spinner.js.map +1 -0
- package/dist/{symbols.js → src/symbols.js} +32 -7
- package/dist/src/symbols.js.map +1 -0
- package/dist/{tasks.js → src/tasks.js} +104 -79
- package/dist/src/tasks.js.map +1 -0
- package/dist/src/theme.js +29 -0
- package/dist/src/theme.js.map +1 -0
- package/dist/src/types.js +8 -0
- package/dist/src/types.js.map +1 -0
- package/dist/{utils.js → src/utils.js} +196 -152
- package/dist/src/utils.js.map +1 -0
- package/package.json +16 -13
- package/dist/ansi.d.ts +0 -36
- package/dist/base.d.ts +0 -60
- package/dist/core.d.ts +0 -1072
- package/dist/data/countries.d.ts +0 -2
- package/dist/data/countries.js +0 -105
- package/dist/data/licenses.d.ts +0 -2
- package/dist/data/licenses.js +0 -109
- package/dist/highlight.d.ts +0 -7
- package/dist/index.d.ts +0 -48
- package/dist/index.js +0 -64
- package/dist/input.d.ts +0 -14
- package/dist/pipeline.d.ts +0 -39
- package/dist/pipeline.js +0 -54
- package/dist/prompts/autocomplete.d.ts +0 -22
- package/dist/prompts/box.d.ts +0 -21
- package/dist/prompts/breadcrumb-search.d.ts +0 -14
- package/dist/prompts/breadcrumb.d.ts +0 -32
- package/dist/prompts/byte.d.ts +0 -13
- package/dist/prompts/calculator.d.ts +0 -17
- package/dist/prompts/calendar.d.ts +0 -33
- package/dist/prompts/checkbox.d.ts +0 -13
- package/dist/prompts/code.d.ts +0 -19
- package/dist/prompts/color.d.ts +0 -14
- package/dist/prompts/confirm.d.ts +0 -8
- package/dist/prompts/connection-string.d.ts +0 -18
- package/dist/prompts/cron.d.ts +0 -13
- package/dist/prompts/curl-utils.d.ts +0 -25
- package/dist/prompts/curl-utils.js +0 -41
- package/dist/prompts/curl.d.ts +0 -41
- package/dist/prompts/data-inspector.d.ts +0 -22
- package/dist/prompts/date.d.ts +0 -12
- package/dist/prompts/dependency.d.ts +0 -16
- package/dist/prompts/dial.d.ts +0 -10
- package/dist/prompts/diff.d.ts +0 -10
- package/dist/prompts/diff.js +0 -101
- package/dist/prompts/draw.d.ts +0 -20
- package/dist/prompts/editor.d.ts +0 -14
- package/dist/prompts/editor.js +0 -203
- package/dist/prompts/emoji.d.ts +0 -18
- package/dist/prompts/exec.d.ts +0 -17
- package/dist/prompts/file.d.ts +0 -21
- package/dist/prompts/file.js +0 -210
- package/dist/prompts/form.d.ts +0 -18
- package/dist/prompts/fuzzy-multi-column.d.ts +0 -12
- package/dist/prompts/fuzzy.d.ts +0 -12
- package/dist/prompts/gauge.d.ts +0 -21
- package/dist/prompts/gauge.js +0 -130
- package/dist/prompts/grid.d.ts +0 -14
- package/dist/prompts/heatmap.d.ts +0 -13
- package/dist/prompts/ip.d.ts +0 -11
- package/dist/prompts/kanban.d.ts +0 -17
- package/dist/prompts/keypress.d.ts +0 -7
- package/dist/prompts/keypress.js +0 -55
- package/dist/prompts/license.d.ts +0 -9
- package/dist/prompts/license.js +0 -105
- package/dist/prompts/list.d.ts +0 -9
- package/dist/prompts/map.d.ts +0 -17
- package/dist/prompts/match.d.ts +0 -19
- package/dist/prompts/miller.d.ts +0 -15
- package/dist/prompts/multi-column-select.d.ts +0 -10
- package/dist/prompts/multi-range.d.ts +0 -9
- package/dist/prompts/multi-select.d.ts +0 -15
- package/dist/prompts/number.d.ts +0 -11
- package/dist/prompts/otp.d.ts +0 -10
- package/dist/prompts/pattern.d.ts +0 -22
- package/dist/prompts/phone.d.ts +0 -41
- package/dist/prompts/quiz-select.d.ts +0 -10
- package/dist/prompts/quiz-select.js +0 -104
- package/dist/prompts/quiz-text.d.ts +0 -11
- package/dist/prompts/quiz-text.js +0 -82
- package/dist/prompts/range.d.ts +0 -9
- package/dist/prompts/rating.d.ts +0 -8
- package/dist/prompts/regex.d.ts +0 -13
- package/dist/prompts/region.d.ts +0 -11
- package/dist/prompts/schedule.d.ts +0 -20
- package/dist/prompts/scroll.d.ts +0 -13
- package/dist/prompts/seat.d.ts +0 -17
- package/dist/prompts/seat.js +0 -165
- package/dist/prompts/select-range.d.ts +0 -8
- package/dist/prompts/select.d.ts +0 -15
- package/dist/prompts/semver.d.ts +0 -6
- package/dist/prompts/shortcut.d.ts +0 -9
- package/dist/prompts/shortcut.js +0 -135
- package/dist/prompts/slider.d.ts +0 -8
- package/dist/prompts/slot.d.ts +0 -16
- package/dist/prompts/slot.js +0 -107
- package/dist/prompts/snippet.d.ts +0 -19
- package/dist/prompts/sort-grid.d.ts +0 -16
- package/dist/prompts/sort.d.ts +0 -14
- package/dist/prompts/spam.d.ts +0 -17
- package/dist/prompts/spam.js +0 -62
- package/dist/prompts/spreadsheet.d.ts +0 -21
- package/dist/prompts/table.d.ts +0 -14
- package/dist/prompts/text.d.ts +0 -17
- package/dist/prompts/time.d.ts +0 -12
- package/dist/prompts/toggle.d.ts +0 -8
- package/dist/prompts/toggle.js +0 -47
- package/dist/prompts/transfer.d.ts +0 -18
- package/dist/prompts/tree-select.d.ts +0 -31
- package/dist/prompts/tree.d.ts +0 -20
- package/dist/prompts/wait.d.ts +0 -18
- package/dist/prompts/wait.js +0 -62
- package/dist/spinner.d.ts +0 -33
- package/dist/spinner.js +0 -89
- package/dist/symbols.d.ts +0 -33
- package/dist/tasks.d.ts +0 -57
- package/dist/theme.d.ts +0 -2
- package/dist/theme.js +0 -20
- package/dist/types.d.ts +0 -503
- package/dist/types.js +0 -5
- package/dist/utils.d.ts +0 -81
|
@@ -1,66 +1,76 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "TablePrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return TablePrompt;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _ansi = require("../ansi");
|
|
12
|
+
const _base = require("../base");
|
|
13
|
+
const _theme = require("../theme");
|
|
14
|
+
const _symbols = require("../symbols");
|
|
15
|
+
const _utils = require("../utils");
|
|
16
|
+
function _define_property(obj, key, value) {
|
|
17
|
+
if (key in obj) {
|
|
18
|
+
Object.defineProperty(obj, key, {
|
|
19
|
+
value: value,
|
|
20
|
+
enumerable: true,
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: true
|
|
23
|
+
});
|
|
24
|
+
} else {
|
|
25
|
+
obj[key] = value;
|
|
17
26
|
}
|
|
27
|
+
return obj;
|
|
28
|
+
}
|
|
29
|
+
let TablePrompt = class TablePrompt extends _base.Prompt {
|
|
18
30
|
calculateColWidths() {
|
|
19
31
|
const { columns, data } = this.options;
|
|
20
|
-
this.colWidths = columns.map(c
|
|
21
|
-
data.forEach(row
|
|
22
|
-
row.row.forEach((cell, idx)
|
|
32
|
+
this.colWidths = columns.map((c)=>(0, _utils.stringWidth)(c));
|
|
33
|
+
data.forEach((row)=>{
|
|
34
|
+
row.row.forEach((cell, idx)=>{
|
|
23
35
|
if (idx < this.colWidths.length) {
|
|
24
|
-
this.colWidths[idx] = Math.max(this.colWidths[idx], (0,
|
|
36
|
+
this.colWidths[idx] = Math.max(this.colWidths[idx], (0, _utils.stringWidth)(cell));
|
|
25
37
|
}
|
|
26
38
|
});
|
|
27
39
|
});
|
|
28
40
|
// Add padding
|
|
29
|
-
this.colWidths = this.colWidths.map(w
|
|
41
|
+
this.colWidths = this.colWidths.map((w)=>w + 2);
|
|
30
42
|
}
|
|
31
43
|
render(_firstRender) {
|
|
32
44
|
// Scroll Logic
|
|
33
45
|
if (this.selectedIndex < this.scrollTop) {
|
|
34
46
|
this.scrollTop = this.selectedIndex;
|
|
35
|
-
}
|
|
36
|
-
else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
|
|
47
|
+
} else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
|
|
37
48
|
this.scrollTop = this.selectedIndex - this.pageSize + 1;
|
|
38
49
|
}
|
|
39
50
|
const maxScroll = Math.max(0, this.options.data.length - this.pageSize);
|
|
40
51
|
this.scrollTop = Math.min(this.scrollTop, maxScroll);
|
|
41
52
|
let output = '';
|
|
42
53
|
// Title
|
|
43
|
-
output += `${
|
|
54
|
+
output += `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}\n`;
|
|
44
55
|
// Table Header
|
|
45
56
|
let headerStr = ' '; // Indent for pointer space
|
|
46
|
-
this.options.columns.forEach((col, i)
|
|
57
|
+
this.options.columns.forEach((col, i)=>{
|
|
47
58
|
headerStr += this.pad(col, this.colWidths[i]);
|
|
48
59
|
});
|
|
49
|
-
output += `${
|
|
60
|
+
output += `${_ansi.ANSI.BOLD}${headerStr}${_ansi.ANSI.RESET}\n`;
|
|
50
61
|
// Table Body
|
|
51
62
|
const visibleRows = this.options.data.slice(this.scrollTop, this.scrollTop + this.pageSize);
|
|
52
|
-
visibleRows.forEach((item, index)
|
|
63
|
+
visibleRows.forEach((item, index)=>{
|
|
53
64
|
const actualIndex = this.scrollTop + index;
|
|
54
|
-
if (index > 0)
|
|
55
|
-
output += '\n';
|
|
65
|
+
if (index > 0) output += '\n';
|
|
56
66
|
const isSelected = actualIndex === this.selectedIndex;
|
|
57
|
-
const pointer = isSelected ? `${
|
|
67
|
+
const pointer = isSelected ? `${_theme.theme.main}${_symbols.symbols.pointer}${_ansi.ANSI.RESET} ` : ' ';
|
|
58
68
|
let rowStr = '';
|
|
59
|
-
item.row.forEach((cell, colIdx)
|
|
69
|
+
item.row.forEach((cell, colIdx)=>{
|
|
60
70
|
const width = this.colWidths[colIdx];
|
|
61
71
|
let cellStr = this.pad(cell, width);
|
|
62
72
|
if (isSelected) {
|
|
63
|
-
cellStr = `${
|
|
73
|
+
cellStr = `${_theme.theme.main}${cellStr}${_ansi.ANSI.RESET}`;
|
|
64
74
|
}
|
|
65
75
|
rowStr += cellStr;
|
|
66
76
|
});
|
|
@@ -69,9 +79,8 @@ class TablePrompt extends base_1.Prompt {
|
|
|
69
79
|
this.renderFrame(output);
|
|
70
80
|
}
|
|
71
81
|
pad(str, width) {
|
|
72
|
-
const len = (0,
|
|
73
|
-
if (len >= width)
|
|
74
|
-
return str;
|
|
82
|
+
const len = (0, _utils.stringWidth)(str);
|
|
83
|
+
if (len >= width) return str;
|
|
75
84
|
return str + ' '.repeat(width - len);
|
|
76
85
|
}
|
|
77
86
|
handleInput(char) {
|
|
@@ -95,12 +104,17 @@ class TablePrompt extends base_1.Prompt {
|
|
|
95
104
|
if (event.scroll === 'up') {
|
|
96
105
|
this.selectedIndex = this.selectedIndex > 0 ? this.selectedIndex - 1 : this.options.data.length - 1;
|
|
97
106
|
this.render(false);
|
|
98
|
-
}
|
|
99
|
-
else if (event.scroll === 'down') {
|
|
107
|
+
} else if (event.scroll === 'down') {
|
|
100
108
|
this.selectedIndex = this.selectedIndex < this.options.data.length - 1 ? this.selectedIndex + 1 : 0;
|
|
101
109
|
this.render(false);
|
|
102
110
|
}
|
|
103
111
|
}
|
|
104
112
|
}
|
|
105
|
-
|
|
106
|
-
|
|
113
|
+
constructor(options){
|
|
114
|
+
super(options), _define_property(this, "selectedIndex", 0), _define_property(this, "scrollTop", 0), _define_property(this, "pageSize", void 0), _define_property(this, "colWidths", []);
|
|
115
|
+
this.pageSize = options.rows || 7;
|
|
116
|
+
this.calculateColWidths();
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
//# sourceMappingURL=table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/table.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { TableOptions, MouseEvent } from '../types';\nimport { stringWidth } from '../utils';\n\nexport class TablePrompt<V> extends Prompt<V, TableOptions<V>> {\n private selectedIndex: number = 0;\n private scrollTop: number = 0;\n private readonly pageSize: number;\n private colWidths: number[] = [];\n\n constructor(options: TableOptions<V>) {\n super(options);\n this.pageSize = options.rows || 7;\n this.calculateColWidths();\n }\n\n private calculateColWidths() {\n const { columns, data } = this.options;\n this.colWidths = columns.map(c => stringWidth(c));\n\n data.forEach(row => {\n row.row.forEach((cell, idx) => {\n if (idx < this.colWidths.length) {\n this.colWidths[idx] = Math.max(this.colWidths[idx], stringWidth(cell));\n }\n });\n });\n\n // Add padding\n this.colWidths = this.colWidths.map(w => w + 2);\n }\n\n protected render(_firstRender: boolean) {\n // Scroll Logic\n if (this.selectedIndex < this.scrollTop) {\n this.scrollTop = this.selectedIndex;\n } else if (this.selectedIndex >= this.scrollTop + this.pageSize) {\n this.scrollTop = this.selectedIndex - this.pageSize + 1;\n }\n\n const maxScroll = Math.max(0, this.options.data.length - this.pageSize);\n this.scrollTop = Math.min(this.scrollTop, maxScroll);\n\n let output = '';\n\n // Title\n output += `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}\\n`;\n\n // Table Header\n let headerStr = ' '; // Indent for pointer space\n this.options.columns.forEach((col, i) => {\n headerStr += this.pad(col, this.colWidths[i]);\n });\n output += `${ANSI.BOLD}${headerStr}${ANSI.RESET}\\n`;\n\n // Table Body\n const visibleRows = this.options.data.slice(this.scrollTop, this.scrollTop + this.pageSize);\n\n visibleRows.forEach((item, index) => {\n const actualIndex = this.scrollTop + index;\n if (index > 0) output += '\\n';\n\n const isSelected = actualIndex === this.selectedIndex;\n const pointer = isSelected ? `${theme.main}${symbols.pointer}${ANSI.RESET} ` : ' ';\n\n let rowStr = '';\n item.row.forEach((cell, colIdx) => {\n const width = this.colWidths[colIdx];\n let cellStr = this.pad(cell, width);\n\n if (isSelected) {\n cellStr = `${theme.main}${cellStr}${ANSI.RESET}`;\n }\n rowStr += cellStr;\n });\n\n output += `${pointer}${rowStr}`;\n });\n\n this.renderFrame(output);\n }\n\n private pad(str: string, width: number): string {\n const len = stringWidth(str);\n if (len >= width) return str;\n return str + ' '.repeat(width - len);\n }\n\n protected handleInput(char: string) {\n if (char === '\\r' || char === '\\n') {\n this.submit(this.options.data[this.selectedIndex].value);\n return;\n }\n\n if (this.isUp(char)) {\n this.selectedIndex = this.selectedIndex > 0 ? this.selectedIndex - 1 : this.options.data.length - 1;\n this.render(false);\n return;\n }\n\n if (this.isDown(char)) {\n this.selectedIndex = this.selectedIndex < this.options.data.length - 1 ? this.selectedIndex + 1 : 0;\n this.render(false);\n return;\n }\n }\n\n protected handleMouse(event: MouseEvent) {\n if (event.action === 'scroll') {\n if (event.scroll === 'up') {\n this.selectedIndex = this.selectedIndex > 0 ? this.selectedIndex - 1 : this.options.data.length - 1;\n this.render(false);\n } else if (event.scroll === 'down') {\n this.selectedIndex = this.selectedIndex < this.options.data.length - 1 ? this.selectedIndex + 1 : 0;\n this.render(false);\n }\n }\n }\n}\n"],"names":["TablePrompt","Prompt","calculateColWidths","columns","data","options","colWidths","map","c","stringWidth","forEach","row","cell","idx","length","Math","max","w","render","_firstRender","selectedIndex","scrollTop","pageSize","maxScroll","min","output","theme","success","ANSI","RESET","BOLD","title","message","headerStr","col","i","pad","visibleRows","slice","item","index","actualIndex","isSelected","pointer","main","symbols","rowStr","colIdx","width","cellStr","renderFrame","str","len","repeat","handleInput","char","submit","value","isUp","isDown","handleMouse","event","action","scroll","rows"],"mappings":"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"}
|
|
@@ -1,27 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "TextPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return TextPrompt;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _ansi = require("../ansi");
|
|
12
|
+
const _base = require("../base");
|
|
13
|
+
const _theme = require("../theme");
|
|
14
|
+
const _symbols = require("../symbols");
|
|
15
|
+
const _utils = require("../utils");
|
|
16
|
+
function _define_property(obj, key, value) {
|
|
17
|
+
if (key in obj) {
|
|
18
|
+
Object.defineProperty(obj, key, {
|
|
19
|
+
value: value,
|
|
20
|
+
enumerable: true,
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: true
|
|
23
|
+
});
|
|
24
|
+
} else {
|
|
25
|
+
obj[key] = value;
|
|
24
26
|
}
|
|
27
|
+
return obj;
|
|
28
|
+
}
|
|
29
|
+
let TextPrompt = class TextPrompt extends _base.Prompt {
|
|
25
30
|
triggerSuggest() {
|
|
26
31
|
if (!this.options.suggest || this.cursor !== this.segments.length) {
|
|
27
32
|
this.ghost = '';
|
|
@@ -30,27 +35,24 @@ class TextPrompt extends base_1.Prompt {
|
|
|
30
35
|
const currentValue = this.segments.join('');
|
|
31
36
|
const result = this.options.suggest(currentValue);
|
|
32
37
|
if (result instanceof Promise) {
|
|
33
|
-
result.then(suggestion
|
|
38
|
+
result.then((suggestion)=>{
|
|
34
39
|
// Check if value is still the same (avoid race condition)
|
|
35
40
|
if (this.segments.join('') === currentValue) {
|
|
36
41
|
if (suggestion.startsWith(currentValue) && suggestion.length > currentValue.length) {
|
|
37
42
|
this.ghost = suggestion.slice(currentValue.length);
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
43
|
+
} else {
|
|
40
44
|
this.ghost = '';
|
|
41
45
|
}
|
|
42
46
|
this.render(false);
|
|
43
47
|
}
|
|
44
48
|
});
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
49
|
+
} else {
|
|
47
50
|
if (result.startsWith(currentValue) && result.length > currentValue.length) {
|
|
48
51
|
this.ghost = result.slice(currentValue.length);
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
52
|
+
} else {
|
|
51
53
|
this.ghost = '';
|
|
52
54
|
}
|
|
53
|
-
|
|
55
|
+
// render will be called by the caller of triggerSuggest usually, but here we might need to ensure it
|
|
54
56
|
}
|
|
55
57
|
}
|
|
56
58
|
render(firstRender) {
|
|
@@ -60,9 +62,9 @@ class TextPrompt extends base_1.Prompt {
|
|
|
60
62
|
this.lastLinesUp = 0;
|
|
61
63
|
// Calculate available width
|
|
62
64
|
// 1. Prepare Prompt Label
|
|
63
|
-
const icon = this.errorMsg ? `${
|
|
64
|
-
const hint = this.options.multiline ? ` ${
|
|
65
|
-
const prefix = `${icon} ${
|
|
65
|
+
const icon = this.errorMsg ? `${_theme.theme.error}${_symbols.symbols.cross}` : `${_theme.theme.success}?`;
|
|
66
|
+
const hint = this.options.multiline ? ` ${_theme.theme.muted}(Press Ctrl+D to submit)${_ansi.ANSI.RESET}` : '';
|
|
67
|
+
const prefix = `${icon} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}${hint} `;
|
|
66
68
|
// We need visual length of prefix to calculate available space for input on the first line
|
|
67
69
|
const prefixVisualLen = this.stripAnsi(prefix).length;
|
|
68
70
|
// 2. Prepare Value Display
|
|
@@ -73,12 +75,13 @@ class TextPrompt extends base_1.Prompt {
|
|
|
73
75
|
this.value = this.segments.join('');
|
|
74
76
|
if (this.segments.length === 0 && this.options.placeholder && !this.errorMsg && !this.hasTyped) {
|
|
75
77
|
// Placeholder case
|
|
76
|
-
const placeholder = `${
|
|
77
|
-
displayValueLines = [
|
|
78
|
+
const placeholder = `${_theme.theme.muted}${this.options.placeholder}${_ansi.ANSI.RESET}`;
|
|
79
|
+
displayValueLines = [
|
|
80
|
+
placeholder
|
|
81
|
+
];
|
|
78
82
|
cursorRelativeRow = 0;
|
|
79
83
|
cursorRelativeCol = 0;
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
84
|
+
} else {
|
|
82
85
|
const maskChar = this.options.mask ?? (this.options.isPassword ? '*' : undefined);
|
|
83
86
|
// Note: password masking replaces each grapheme with '*'
|
|
84
87
|
// Split by lines (for multiline support)
|
|
@@ -91,17 +94,15 @@ class TextPrompt extends base_1.Prompt {
|
|
|
91
94
|
cursorLineIndex = 0;
|
|
92
95
|
// If we want visual cursor position, we need visual width of segments.
|
|
93
96
|
let visualColIndex = 0;
|
|
94
|
-
for
|
|
97
|
+
for(let i = 0; i < this.cursor; i++){
|
|
95
98
|
const seg = this.segments[i];
|
|
96
99
|
if (seg === '\n') {
|
|
97
100
|
cursorLineIndex++;
|
|
98
101
|
visualColIndex = 0;
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
102
|
+
} else {
|
|
101
103
|
if (maskChar !== undefined) {
|
|
102
104
|
visualColIndex += maskChar.length;
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
+
} else {
|
|
105
106
|
visualColIndex += this.getSegmentWidth(seg);
|
|
106
107
|
}
|
|
107
108
|
}
|
|
@@ -112,53 +113,50 @@ class TextPrompt extends base_1.Prompt {
|
|
|
112
113
|
// We need to reconstruct lines from segments to apply styling/truncation logic per line.
|
|
113
114
|
let currentLineSegments = [];
|
|
114
115
|
const processedLines = []; // Array of segment arrays
|
|
115
|
-
for (const seg of this.segments)
|
|
116
|
+
for (const seg of this.segments){
|
|
116
117
|
if (seg === '\n') {
|
|
117
118
|
processedLines.push(currentLineSegments);
|
|
118
119
|
currentLineSegments = [];
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
120
|
+
} else {
|
|
121
121
|
currentLineSegments.push(seg);
|
|
122
122
|
}
|
|
123
123
|
}
|
|
124
124
|
processedLines.push(currentLineSegments); // Last line
|
|
125
|
-
processedLines.forEach((lineSegs)
|
|
125
|
+
processedLines.forEach((lineSegs)=>{
|
|
126
126
|
// Reconstruct line string for display calculation
|
|
127
127
|
// If password, join with *?
|
|
128
128
|
let visibleLine = '';
|
|
129
129
|
if (maskChar !== undefined) {
|
|
130
130
|
visibleLine = maskChar.repeat(lineSegs.length);
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
131
|
+
} else {
|
|
133
132
|
visibleLine = lineSegs.join('');
|
|
134
133
|
}
|
|
135
|
-
displayValueLines.push(
|
|
134
|
+
displayValueLines.push(_theme.theme.main + visibleLine + _ansi.ANSI.RESET);
|
|
136
135
|
});
|
|
137
136
|
// Append ghost text if applicable
|
|
138
137
|
if (this.ghost && this.cursor === this.segments.length && displayValueLines.length > 0) {
|
|
139
|
-
displayValueLines[displayValueLines.length - 1] +=
|
|
138
|
+
displayValueLines[displayValueLines.length - 1] += _theme.theme.muted + this.ghost + _ansi.ANSI.RESET;
|
|
140
139
|
}
|
|
141
140
|
}
|
|
142
141
|
// 3. Assemble Output
|
|
143
142
|
let output = '';
|
|
144
|
-
displayValueLines.forEach((lineStr, idx)
|
|
143
|
+
displayValueLines.forEach((lineStr, idx)=>{
|
|
145
144
|
if (idx === 0) {
|
|
146
145
|
output += prefix + lineStr;
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
146
|
+
} else {
|
|
149
147
|
output += '\n' + lineStr;
|
|
150
148
|
}
|
|
151
149
|
});
|
|
152
150
|
if (this.errorMsg) {
|
|
153
|
-
output += `\n${
|
|
151
|
+
output += `\n${_theme.theme.error}>> ${this.errorMsg}${_ansi.ANSI.RESET}`;
|
|
154
152
|
}
|
|
155
153
|
// 4. Render Frame
|
|
156
154
|
this.renderFrame(output);
|
|
157
|
-
this.print(
|
|
155
|
+
this.print(_ansi.ANSI.SHOW_CURSOR);
|
|
158
156
|
// 5. Move Cursor
|
|
159
157
|
const errorOffset = this.errorMsg ? 1 : 0;
|
|
160
158
|
const totalRows = displayValueLines.length + errorOffset;
|
|
161
|
-
const linesUp =
|
|
159
|
+
const linesUp = totalRows - 1 - cursorRelativeRow;
|
|
162
160
|
if (linesUp > 0) {
|
|
163
161
|
this.print(`\x1b[${linesUp}A`);
|
|
164
162
|
}
|
|
@@ -166,18 +164,17 @@ class TextPrompt extends base_1.Prompt {
|
|
|
166
164
|
let targetCol = 0;
|
|
167
165
|
if (cursorRelativeRow === 0) {
|
|
168
166
|
targetCol = prefixVisualLen + cursorRelativeCol;
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
167
|
+
} else {
|
|
171
168
|
targetCol = cursorRelativeCol;
|
|
172
169
|
}
|
|
173
|
-
this.print(
|
|
170
|
+
this.print(_ansi.ANSI.CURSOR_LEFT);
|
|
174
171
|
if (targetCol > 0) {
|
|
175
172
|
this.print(`\x1b[${targetCol}C`);
|
|
176
173
|
}
|
|
177
174
|
}
|
|
178
175
|
// Helper to get width of a segment
|
|
179
176
|
getSegmentWidth(seg) {
|
|
180
|
-
return (0,
|
|
177
|
+
return (0, _utils.stringWidth)(seg);
|
|
181
178
|
}
|
|
182
179
|
cleanup() {
|
|
183
180
|
if (this.lastLinesUp > 0) {
|
|
@@ -190,7 +187,7 @@ class TextPrompt extends base_1.Prompt {
|
|
|
190
187
|
// Tab (Accept Suggestion)
|
|
191
188
|
if (char === '\t') {
|
|
192
189
|
if (this.ghost) {
|
|
193
|
-
const ghostSegments = (0,
|
|
190
|
+
const ghostSegments = (0, _utils.safeSplit)(this.ghost);
|
|
194
191
|
this.segments.splice(this.cursor, 0, ...ghostSegments);
|
|
195
192
|
this.cursor += ghostSegments.length;
|
|
196
193
|
this.ghost = '';
|
|
@@ -261,7 +258,7 @@ class TextPrompt extends base_1.Prompt {
|
|
|
261
258
|
// safeSplit the input char(s) - could be pasted text
|
|
262
259
|
if (!/^[\x00-\x1F]/.test(char) && !char.startsWith('\x1b')) {
|
|
263
260
|
this.hasTyped = true;
|
|
264
|
-
const newSegments = (0,
|
|
261
|
+
const newSegments = (0, _utils.safeSplit)(char);
|
|
265
262
|
this.segments.splice(this.cursor, 0, ...newSegments);
|
|
266
263
|
this.cursor += newSegments.length;
|
|
267
264
|
this.errorMsg = '';
|
|
@@ -276,21 +273,19 @@ class TextPrompt extends base_1.Prompt {
|
|
|
276
273
|
if (result instanceof Promise) {
|
|
277
274
|
this.errorMsg = 'Validating...';
|
|
278
275
|
this.render(false);
|
|
279
|
-
result.then(valid
|
|
276
|
+
result.then((valid)=>{
|
|
280
277
|
if (typeof valid === 'string' && valid.length > 0) {
|
|
281
278
|
this.errorMsg = valid;
|
|
282
279
|
this.render(false);
|
|
283
|
-
}
|
|
284
|
-
else if (valid === false) {
|
|
280
|
+
} else if (valid === false) {
|
|
285
281
|
this.errorMsg = 'Invalid input';
|
|
286
282
|
this.render(false);
|
|
287
|
-
}
|
|
288
|
-
else {
|
|
283
|
+
} else {
|
|
289
284
|
this.errorMsg = '';
|
|
290
285
|
this.render(false);
|
|
291
286
|
this.submit(this.value);
|
|
292
287
|
}
|
|
293
|
-
}).catch(err
|
|
288
|
+
}).catch((err)=>{
|
|
294
289
|
this.errorMsg = err.message || 'Validation failed';
|
|
295
290
|
this.render(false);
|
|
296
291
|
});
|
|
@@ -309,5 +304,14 @@ class TextPrompt extends base_1.Prompt {
|
|
|
309
304
|
}
|
|
310
305
|
this.submit(this.value);
|
|
311
306
|
}
|
|
312
|
-
|
|
313
|
-
|
|
307
|
+
constructor(options){
|
|
308
|
+
super(options), _define_property(this, "errorMsg", ''), // cursor is now an index into the grapheme segments array
|
|
309
|
+
_define_property(this, "cursor", 0), _define_property(this, "hasTyped", false), _define_property(this, "segments", []), _define_property(this, "lastLinesUp", 0), _define_property(this, "ghost", '');
|
|
310
|
+
this.value = options.initial || '';
|
|
311
|
+
// Initialize segments from value
|
|
312
|
+
this.segments = (0, _utils.safeSplit)(this.value);
|
|
313
|
+
this.cursor = this.segments.length;
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/text.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { TextOptions } from '../types';\nimport { safeSplit, stringWidth } from '../utils';\n\n// --- Implementation: Text Prompt ---\nexport class TextPrompt<O extends TextOptions = TextOptions> extends Prompt<string, O> {\n protected errorMsg: string = '';\n // cursor is now an index into the grapheme segments array\n protected cursor: number = 0;\n protected hasTyped: boolean = false;\n protected segments: string[] = [];\n protected lastLinesUp: number = 0;\n private ghost: string = '';\n\n constructor(options: O) {\n super(options);\n this.value = options.initial || '';\n // Initialize segments from value\n this.segments = safeSplit(this.value);\n this.cursor = this.segments.length;\n }\n\n private triggerSuggest() {\n if (!this.options.suggest || this.cursor !== this.segments.length) {\n this.ghost = '';\n return;\n }\n\n const currentValue = this.segments.join('');\n const result = this.options.suggest(currentValue);\n\n if (result instanceof Promise) {\n result.then(suggestion => {\n // Check if value is still the same (avoid race condition)\n if (this.segments.join('') === currentValue) {\n if (suggestion.startsWith(currentValue) && suggestion.length > currentValue.length) {\n this.ghost = suggestion.slice(currentValue.length);\n } else {\n this.ghost = '';\n }\n this.render(false);\n }\n });\n } else {\n if (result.startsWith(currentValue) && result.length > currentValue.length) {\n this.ghost = result.slice(currentValue.length);\n } else {\n this.ghost = '';\n }\n // render will be called by the caller of triggerSuggest usually, but here we might need to ensure it\n }\n }\n\n protected render(firstRender: boolean) {\n if (!firstRender && this.lastLinesUp > 0) {\n this.print(`\\x1b[${this.lastLinesUp}B`);\n }\n this.lastLinesUp = 0;\n\n // Calculate available width\n // 1. Prepare Prompt Label\n const icon = this.errorMsg ? `${theme.error}${symbols.cross}` : `${theme.success}?`;\n const hint = this.options.multiline ? ` ${theme.muted}(Press Ctrl+D to submit)${ANSI.RESET}` : '';\n const prefix = `${icon} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}${hint} `;\n\n // We need visual length of prefix to calculate available space for input on the first line\n const prefixVisualLen = this.stripAnsi(prefix).length;\n\n // 2. Prepare Value Display\n let displayValueLines: string[] = [];\n let cursorRelativeRow = 0;\n let cursorRelativeCol = 0; // Visual column index\n\n // Reconstruct value from segments for logic that needs raw string\n this.value = this.segments.join('');\n\n if (this.segments.length === 0 && this.options.placeholder && !this.errorMsg && !this.hasTyped) {\n // Placeholder case\n const placeholder = `${theme.muted}${this.options.placeholder}${ANSI.RESET}`;\n displayValueLines = [placeholder];\n cursorRelativeRow = 0;\n cursorRelativeCol = 0;\n } else {\n const maskChar = this.options.mask ?? (this.options.isPassword ? '*' : undefined);\n // Note: password masking replaces each grapheme with '*'\n\n // Split by lines (for multiline support)\n\n // Determine which line the cursor is on\n // We need to map 'cursor' (segments index) to line/col.\n // This is tricky because segments might contain '\\n'.\n // safeSplit treats '\\n' as a segment.\n\n let cursorLineIndex = 0;\n\n // Let's iterate segments to find cursor position (row, col)\n cursorLineIndex = 0;\n // If we want visual cursor position, we need visual width of segments.\n let visualColIndex = 0;\n\n for (let i = 0; i < this.cursor; i++) {\n const seg = this.segments[i];\n if (seg === '\\n') {\n cursorLineIndex++;\n visualColIndex = 0;\n } else {\n if (maskChar !== undefined) {\n visualColIndex += maskChar.length;\n } else {\n visualColIndex += this.getSegmentWidth(seg);\n }\n }\n }\n\n cursorRelativeRow = cursorLineIndex;\n cursorRelativeCol = visualColIndex;\n\n // Now prepare lines for display (scrolling/truncation)\n // We need to reconstruct lines from segments to apply styling/truncation logic per line.\n\n let currentLineSegments: string[] = [];\n const processedLines: string[][] = []; // Array of segment arrays\n\n for (const seg of this.segments) {\n if (seg === '\\n') {\n processedLines.push(currentLineSegments);\n currentLineSegments = [];\n } else {\n currentLineSegments.push(seg);\n }\n }\n processedLines.push(currentLineSegments); // Last line\n\n processedLines.forEach((lineSegs: string[]) => {\n\n // Reconstruct line string for display calculation\n // If password, join with *?\n let visibleLine = '';\n if (maskChar !== undefined) {\n visibleLine = maskChar.repeat(lineSegs.length);\n } else {\n visibleLine = lineSegs.join('');\n }\n\n displayValueLines.push(theme.main + visibleLine + ANSI.RESET);\n });\n\n // Append ghost text if applicable\n if (this.ghost && this.cursor === this.segments.length && displayValueLines.length > 0) {\n displayValueLines[displayValueLines.length - 1] += theme.muted + this.ghost + ANSI.RESET;\n }\n }\n\n // 3. Assemble Output\n let output = '';\n displayValueLines.forEach((lineStr, idx) => {\n if (idx === 0) {\n output += prefix + lineStr;\n } else {\n output += '\\n' + lineStr;\n }\n });\n\n if (this.errorMsg) {\n output += `\\n${theme.error}>> ${this.errorMsg}${ANSI.RESET}`;\n }\n\n // 4. Render Frame\n this.renderFrame(output);\n\n this.print(ANSI.SHOW_CURSOR);\n\n // 5. Move Cursor\n const errorOffset = this.errorMsg ? 1 : 0;\n const totalRows = displayValueLines.length + errorOffset;\n\n const linesUp = (totalRows - 1) - cursorRelativeRow;\n if (linesUp > 0) {\n this.print(`\\x1b[${linesUp}A`);\n }\n this.lastLinesUp = linesUp;\n\n let targetCol = 0;\n if (cursorRelativeRow === 0) {\n targetCol = prefixVisualLen + cursorRelativeCol;\n } else {\n targetCol = cursorRelativeCol;\n }\n\n this.print(ANSI.CURSOR_LEFT);\n if (targetCol > 0) {\n this.print(`\\x1b[${targetCol}C`);\n }\n }\n\n // Helper to get width of a segment\n private getSegmentWidth(seg: string): number {\n return stringWidth(seg);\n }\n\n protected cleanup() {\n if (this.lastLinesUp > 0) {\n this.print(`\\x1b[${this.lastLinesUp}B`);\n this.lastLinesUp = 0;\n }\n super.cleanup();\n }\n\n protected handleInput(char: string) {\n // Tab (Accept Suggestion)\n if (char === '\\t') {\n if (this.ghost) {\n const ghostSegments = safeSplit(this.ghost);\n this.segments.splice(this.cursor, 0, ...ghostSegments);\n this.cursor += ghostSegments.length;\n this.ghost = '';\n this.errorMsg = '';\n this.triggerSuggest(); // Maybe fetch next suggestion?\n this.render(false);\n }\n return;\n }\n\n // Enter\n if (char === '\\r' || char === '\\n') {\n if (this.options.multiline) {\n // Insert newline segment\n this.segments.splice(this.cursor, 0, '\\n');\n this.cursor++;\n this.render(false);\n return;\n }\n\n this.validateAndSubmit();\n return;\n }\n\n // Ctrl+D / Ctrl+S\n if (this.options.multiline && (char === '\\u0004' || char === '\\u0013')) {\n this.validateAndSubmit();\n return;\n }\n\n // Backspace\n if (char === '\\u0008' || char === '\\x7f') {\n this.hasTyped = true;\n if (this.cursor > 0) {\n // Remove segment at cursor - 1\n this.segments.splice(this.cursor - 1, 1);\n this.cursor--;\n this.errorMsg = '';\n this.triggerSuggest();\n this.render(false);\n }\n return;\n }\n\n // Arrow Left\n if (this.isLeft(char)) {\n if (this.cursor > 0) {\n this.cursor--;\n this.render(false);\n }\n return;\n }\n\n // Arrow Right\n if (this.isRight(char)) {\n if (this.cursor < this.segments.length) {\n this.cursor++;\n this.render(false);\n }\n return;\n }\n\n // Delete key\n if (char === '\\u001b[3~') {\n this.hasTyped = true;\n if (this.cursor < this.segments.length) {\n this.segments.splice(this.cursor, 1);\n this.errorMsg = '';\n this.triggerSuggest();\n this.render(false);\n }\n return;\n }\n\n // Regular Typing & Paste\n // safeSplit the input char(s) - could be pasted text\n if (!/^[\\x00-\\x1F]/.test(char) && !char.startsWith('\\x1b')) {\n this.hasTyped = true;\n const newSegments = safeSplit(char);\n this.segments.splice(this.cursor, 0, ...newSegments);\n this.cursor += newSegments.length;\n this.errorMsg = '';\n this.triggerSuggest();\n this.render(false);\n }\n }\n\n private validateAndSubmit() {\n this.value = this.segments.join('');\n if (this.options.validate) {\n const result = this.options.validate(this.value);\n\n if (result instanceof Promise) {\n this.errorMsg = 'Validating...';\n this.render(false);\n\n result.then(valid => {\n if (typeof valid === 'string' && valid.length > 0) {\n this.errorMsg = valid;\n this.render(false);\n } else if (valid === false) {\n this.errorMsg = 'Invalid input';\n this.render(false);\n } else {\n this.errorMsg = '';\n this.render(false);\n this.submit(this.value);\n }\n }).catch(err => {\n this.errorMsg = err.message || 'Validation failed';\n this.render(false);\n });\n return;\n }\n\n if (typeof result === 'string' && result.length > 0) {\n this.errorMsg = result;\n this.render(false);\n return;\n }\n if (result === false) {\n this.errorMsg = 'Invalid input';\n this.render(false);\n return;\n }\n }\n\n this.submit(this.value);\n }\n}\n"],"names":["TextPrompt","Prompt","triggerSuggest","options","suggest","cursor","segments","length","ghost","currentValue","join","result","Promise","then","suggestion","startsWith","slice","render","firstRender","lastLinesUp","print","icon","errorMsg","theme","error","symbols","cross","success","hint","multiline","muted","ANSI","RESET","prefix","BOLD","title","message","prefixVisualLen","stripAnsi","displayValueLines","cursorRelativeRow","cursorRelativeCol","value","placeholder","hasTyped","maskChar","mask","isPassword","undefined","cursorLineIndex","visualColIndex","i","seg","getSegmentWidth","currentLineSegments","processedLines","push","forEach","lineSegs","visibleLine","repeat","main","output","lineStr","idx","renderFrame","SHOW_CURSOR","errorOffset","totalRows","linesUp","targetCol","CURSOR_LEFT","stringWidth","cleanup","handleInput","char","ghostSegments","safeSplit","splice","validateAndSubmit","isLeft","isRight","test","newSegments","validate","valid","submit","catch","err","initial"],"mappings":";;;;+BAQaA;;;eAAAA;;;sBARQ;sBACE;uBACD;yBACE;uBAEe;;;;;;;;;;;;;;AAGhC,IAAA,AAAMA,aAAN,MAAMA,mBAAwDC,YAAM;IAiB/DC,iBAAiB;QACrB,IAAI,CAAC,IAAI,CAACC,OAAO,CAACC,OAAO,IAAI,IAAI,CAACC,MAAM,KAAK,IAAI,CAACC,QAAQ,CAACC,MAAM,EAAE;YAC/D,IAAI,CAACC,KAAK,GAAG;YACb;QACJ;QAEA,MAAMC,eAAe,IAAI,CAACH,QAAQ,CAACI,IAAI,CAAC;QACxC,MAAMC,SAAS,IAAI,CAACR,OAAO,CAACC,OAAO,CAACK;QAEpC,IAAIE,kBAAkBC,SAAS;YAC3BD,OAAOE,IAAI,CAACC,CAAAA;gBACR,0DAA0D;gBAC1D,IAAI,IAAI,CAACR,QAAQ,CAACI,IAAI,CAAC,QAAQD,cAAc;oBACzC,IAAIK,WAAWC,UAAU,CAACN,iBAAiBK,WAAWP,MAAM,GAAGE,aAAaF,MAAM,EAAE;wBAChF,IAAI,CAACC,KAAK,GAAGM,WAAWE,KAAK,CAACP,aAAaF,MAAM;oBACrD,OAAO;wBACH,IAAI,CAACC,KAAK,GAAG;oBACjB;oBACA,IAAI,CAACS,MAAM,CAAC;gBAChB;YACJ;QACJ,OAAO;YACH,IAAIN,OAAOI,UAAU,CAACN,iBAAiBE,OAAOJ,MAAM,GAAGE,aAAaF,MAAM,EAAE;gBACxE,IAAI,CAACC,KAAK,GAAGG,OAAOK,KAAK,CAACP,aAAaF,MAAM;YACjD,OAAO;gBACH,IAAI,CAACC,KAAK,GAAG;YACjB;QACA,qGAAqG;QACzG;IACJ;IAEUS,OAAOC,WAAoB,EAAE;QACnC,IAAI,CAACA,eAAe,IAAI,CAACC,WAAW,GAAG,GAAG;YACtC,IAAI,CAACC,KAAK,CAAC,CAAC,KAAK,EAAE,IAAI,CAACD,WAAW,CAAC,CAAC,CAAC;QAC1C;QACA,IAAI,CAACA,WAAW,GAAG;QAEnB,4BAA4B;QAC5B,0BAA0B;QAC1B,MAAME,OAAO,IAAI,CAACC,QAAQ,GAAG,GAAGC,YAAK,CAACC,KAAK,GAAGC,gBAAO,CAACC,KAAK,EAAE,GAAG,GAAGH,YAAK,CAACI,OAAO,CAAC,CAAC,CAAC;QACnF,MAAMC,OAAO,IAAI,CAACzB,OAAO,CAAC0B,SAAS,GAAG,CAAC,CAAC,EAAEN,YAAK,CAACO,KAAK,CAAC,wBAAwB,EAAEC,UAAI,CAACC,KAAK,EAAE,GAAG;QAC/F,MAAMC,SAAS,GAAGZ,KAAK,CAAC,EAAEU,UAAI,CAACG,IAAI,GAAGX,YAAK,CAACY,KAAK,GAAG,IAAI,CAAChC,OAAO,CAACiC,OAAO,GAAGL,UAAI,CAACC,KAAK,GAAGJ,KAAK,CAAC,CAAC;QAE/F,2FAA2F;QAC3F,MAAMS,kBAAkB,IAAI,CAACC,SAAS,CAACL,QAAQ1B,MAAM;QAErD,2BAA2B;QAC3B,IAAIgC,oBAA8B,EAAE;QACpC,IAAIC,oBAAoB;QACxB,IAAIC,oBAAoB,GAAG,sBAAsB;QAEjD,kEAAkE;QAClE,IAAI,CAACC,KAAK,GAAG,IAAI,CAACpC,QAAQ,CAACI,IAAI,CAAC;QAEhC,IAAI,IAAI,CAACJ,QAAQ,CAACC,MAAM,KAAK,KAAK,IAAI,CAACJ,OAAO,CAACwC,WAAW,IAAI,CAAC,IAAI,CAACrB,QAAQ,IAAI,CAAC,IAAI,CAACsB,QAAQ,EAAE;YAC5F,mBAAmB;YACnB,MAAMD,cAAc,GAAGpB,YAAK,CAACO,KAAK,GAAG,IAAI,CAAC3B,OAAO,CAACwC,WAAW,GAAGZ,UAAI,CAACC,KAAK,EAAE;YAC5EO,oBAAoB;gBAACI;aAAY;YACjCH,oBAAoB;YACpBC,oBAAoB;QACxB,OAAO;YACH,MAAMI,WAAW,IAAI,CAAC1C,OAAO,CAAC2C,IAAI,IAAK,CAAA,IAAI,CAAC3C,OAAO,CAAC4C,UAAU,GAAG,MAAMC,SAAQ;YAC/E,yDAAyD;YAEzD,yCAAyC;YAEzC,wCAAwC;YACxC,wDAAwD;YACxD,sDAAsD;YACtD,sCAAsC;YAEtC,IAAIC,kBAAkB;YAEtB,4DAA4D;YAC5DA,kBAAkB;YAClB,uEAAuE;YACvE,IAAIC,iBAAiB;YAErB,IAAK,IAAIC,IAAI,GAAGA,IAAI,IAAI,CAAC9C,MAAM,EAAE8C,IAAK;gBAClC,MAAMC,MAAM,IAAI,CAAC9C,QAAQ,CAAC6C,EAAE;gBAC5B,IAAIC,QAAQ,MAAM;oBACdH;oBACAC,iBAAiB;gBACrB,OAAO;oBACH,IAAIL,aAAaG,WAAW;wBACxBE,kBAAkBL,SAAStC,MAAM;oBACrC,OAAO;wBACH2C,kBAAkB,IAAI,CAACG,eAAe,CAACD;oBAC3C;gBACJ;YACJ;YAEAZ,oBAAoBS;YACpBR,oBAAoBS;YAEpB,uDAAuD;YACvD,yFAAyF;YAEzF,IAAII,sBAAgC,EAAE;YACtC,MAAMC,iBAA6B,EAAE,EAAE,0BAA0B;YAEjE,KAAK,MAAMH,OAAO,IAAI,CAAC9C,QAAQ,CAAE;gBAC7B,IAAI8C,QAAQ,MAAM;oBACdG,eAAeC,IAAI,CAACF;oBACpBA,sBAAsB,EAAE;gBAC5B,OAAO;oBACHA,oBAAoBE,IAAI,CAACJ;gBAC7B;YACJ;YACAG,eAAeC,IAAI,CAACF,sBAAsB,YAAY;YAEtDC,eAAeE,OAAO,CAAC,CAACC;gBAEpB,kDAAkD;gBAClD,4BAA4B;gBAC5B,IAAIC,cAAc;gBAClB,IAAId,aAAaG,WAAW;oBACxBW,cAAcd,SAASe,MAAM,CAACF,SAASnD,MAAM;gBACjD,OAAO;oBACHoD,cAAcD,SAAShD,IAAI,CAAC;gBAChC;gBAEA6B,kBAAkBiB,IAAI,CAACjC,YAAK,CAACsC,IAAI,GAAGF,cAAc5B,UAAI,CAACC,KAAK;YAChE;YAEA,kCAAkC;YAClC,IAAI,IAAI,CAACxB,KAAK,IAAI,IAAI,CAACH,MAAM,KAAK,IAAI,CAACC,QAAQ,CAACC,MAAM,IAAIgC,kBAAkBhC,MAAM,GAAG,GAAG;gBACpFgC,iBAAiB,CAACA,kBAAkBhC,MAAM,GAAG,EAAE,IAAIgB,YAAK,CAACO,KAAK,GAAG,IAAI,CAACtB,KAAK,GAAGuB,UAAI,CAACC,KAAK;YAC5F;QACJ;QAEA,qBAAqB;QACrB,IAAI8B,SAAS;QACbvB,kBAAkBkB,OAAO,CAAC,CAACM,SAASC;YAChC,IAAIA,QAAQ,GAAG;gBACXF,UAAU7B,SAAS8B;YACvB,OAAO;gBACHD,UAAU,OAAOC;YACrB;QACJ;QAEA,IAAI,IAAI,CAACzC,QAAQ,EAAE;YACfwC,UAAU,CAAC,EAAE,EAAEvC,YAAK,CAACC,KAAK,CAAC,GAAG,EAAE,IAAI,CAACF,QAAQ,GAAGS,UAAI,CAACC,KAAK,EAAE;QAChE;QAEA,kBAAkB;QAClB,IAAI,CAACiC,WAAW,CAACH;QAEjB,IAAI,CAAC1C,KAAK,CAACW,UAAI,CAACmC,WAAW;QAE3B,iBAAiB;QACjB,MAAMC,cAAc,IAAI,CAAC7C,QAAQ,GAAG,IAAI;QACxC,MAAM8C,YAAY7B,kBAAkBhC,MAAM,GAAG4D;QAE7C,MAAME,UAAU,AAACD,YAAY,IAAK5B;QAClC,IAAI6B,UAAU,GAAG;YACb,IAAI,CAACjD,KAAK,CAAC,CAAC,KAAK,EAAEiD,QAAQ,CAAC,CAAC;QACjC;QACA,IAAI,CAAClD,WAAW,GAAGkD;QAEnB,IAAIC,YAAY;QAChB,IAAI9B,sBAAsB,GAAG;YACzB8B,YAAYjC,kBAAkBI;QAClC,OAAO;YACH6B,YAAY7B;QAChB;QAEA,IAAI,CAACrB,KAAK,CAACW,UAAI,CAACwC,WAAW;QAC3B,IAAID,YAAY,GAAG;YACf,IAAI,CAAClD,KAAK,CAAC,CAAC,KAAK,EAAEkD,UAAU,CAAC,CAAC;QACnC;IACJ;IAEA,mCAAmC;IAC3BjB,gBAAgBD,GAAW,EAAU;QACzC,OAAOoB,IAAAA,kBAAW,EAACpB;IACvB;IAEUqB,UAAU;QAChB,IAAI,IAAI,CAACtD,WAAW,GAAG,GAAG;YACtB,IAAI,CAACC,KAAK,CAAC,CAAC,KAAK,EAAE,IAAI,CAACD,WAAW,CAAC,CAAC,CAAC;YACtC,IAAI,CAACA,WAAW,GAAG;QACvB;QACA,KAAK,CAACsD;IACV;IAEUC,YAAYC,IAAY,EAAE;QAChC,0BAA0B;QAC1B,IAAIA,SAAS,MAAM;YACf,IAAI,IAAI,CAACnE,KAAK,EAAE;gBACZ,MAAMoE,gBAAgBC,IAAAA,gBAAS,EAAC,IAAI,CAACrE,KAAK;gBAC1C,IAAI,CAACF,QAAQ,CAACwE,MAAM,CAAC,IAAI,CAACzE,MAAM,EAAE,MAAMuE;gBACxC,IAAI,CAACvE,MAAM,IAAIuE,cAAcrE,MAAM;gBACnC,IAAI,CAACC,KAAK,GAAG;gBACb,IAAI,CAACc,QAAQ,GAAG;gBAChB,IAAI,CAACpB,cAAc,IAAI,+BAA+B;gBACtD,IAAI,CAACe,MAAM,CAAC;YAChB;YACA;QACJ;QAEA,QAAQ;QACR,IAAI0D,SAAS,QAAQA,SAAS,MAAM;YAChC,IAAI,IAAI,CAACxE,OAAO,CAAC0B,SAAS,EAAE;gBACxB,yBAAyB;gBACzB,IAAI,CAACvB,QAAQ,CAACwE,MAAM,CAAC,IAAI,CAACzE,MAAM,EAAE,GAAG;gBACrC,IAAI,CAACA,MAAM;gBACX,IAAI,CAACY,MAAM,CAAC;gBACZ;YACJ;YAEA,IAAI,CAAC8D,iBAAiB;YACtB;QACJ;QAEA,kBAAkB;QAClB,IAAI,IAAI,CAAC5E,OAAO,CAAC0B,SAAS,IAAK8C,CAAAA,SAAS,YAAYA,SAAS,QAAO,GAAI;YACpE,IAAI,CAACI,iBAAiB;YACtB;QACJ;QAEA,YAAY;QACZ,IAAIJ,SAAS,YAAYA,SAAS,QAAQ;YACtC,IAAI,CAAC/B,QAAQ,GAAG;YAChB,IAAI,IAAI,CAACvC,MAAM,GAAG,GAAG;gBACjB,+BAA+B;gBAC/B,IAAI,CAACC,QAAQ,CAACwE,MAAM,CAAC,IAAI,CAACzE,MAAM,GAAG,GAAG;gBACtC,IAAI,CAACA,MAAM;gBACX,IAAI,CAACiB,QAAQ,GAAG;gBAChB,IAAI,CAACpB,cAAc;gBACnB,IAAI,CAACe,MAAM,CAAC;YAChB;YACA;QACJ;QAEA,aAAa;QACb,IAAI,IAAI,CAAC+D,MAAM,CAACL,OAAO;YACnB,IAAI,IAAI,CAACtE,MAAM,GAAG,GAAG;gBACjB,IAAI,CAACA,MAAM;gBACX,IAAI,CAACY,MAAM,CAAC;YAChB;YACA;QACJ;QAEA,cAAc;QACd,IAAI,IAAI,CAACgE,OAAO,CAACN,OAAO;YACpB,IAAI,IAAI,CAACtE,MAAM,GAAG,IAAI,CAACC,QAAQ,CAACC,MAAM,EAAE;gBACpC,IAAI,CAACF,MAAM;gBACX,IAAI,CAACY,MAAM,CAAC;YAChB;YACA;QACJ;QAEA,aAAa;QACb,IAAI0D,SAAS,aAAa;YACtB,IAAI,CAAC/B,QAAQ,GAAG;YAChB,IAAI,IAAI,CAACvC,MAAM,GAAG,IAAI,CAACC,QAAQ,CAACC,MAAM,EAAE;gBACpC,IAAI,CAACD,QAAQ,CAACwE,MAAM,CAAC,IAAI,CAACzE,MAAM,EAAE;gBAClC,IAAI,CAACiB,QAAQ,GAAG;gBAChB,IAAI,CAACpB,cAAc;gBACnB,IAAI,CAACe,MAAM,CAAC;YAChB;YACA;QACJ;QAEA,yBAAyB;QACzB,qDAAqD;QACrD,IAAI,CAAC,eAAeiE,IAAI,CAACP,SAAS,CAACA,KAAK5D,UAAU,CAAC,SAAS;YACxD,IAAI,CAAC6B,QAAQ,GAAG;YAChB,MAAMuC,cAAcN,IAAAA,gBAAS,EAACF;YAC9B,IAAI,CAACrE,QAAQ,CAACwE,MAAM,CAAC,IAAI,CAACzE,MAAM,EAAE,MAAM8E;YACxC,IAAI,CAAC9E,MAAM,IAAI8E,YAAY5E,MAAM;YACjC,IAAI,CAACe,QAAQ,GAAG;YAChB,IAAI,CAACpB,cAAc;YACnB,IAAI,CAACe,MAAM,CAAC;QAChB;IACJ;IAEQ8D,oBAAoB;QACxB,IAAI,CAACrC,KAAK,GAAG,IAAI,CAACpC,QAAQ,CAACI,IAAI,CAAC;QAChC,IAAI,IAAI,CAACP,OAAO,CAACiF,QAAQ,EAAE;YACvB,MAAMzE,SAAS,IAAI,CAACR,OAAO,CAACiF,QAAQ,CAAC,IAAI,CAAC1C,KAAK;YAE/C,IAAI/B,kBAAkBC,SAAS;gBAC3B,IAAI,CAACU,QAAQ,GAAG;gBAChB,IAAI,CAACL,MAAM,CAAC;gBAEZN,OAAOE,IAAI,CAACwE,CAAAA;oBACR,IAAI,OAAOA,UAAU,YAAYA,MAAM9E,MAAM,GAAG,GAAG;wBAC/C,IAAI,CAACe,QAAQ,GAAG+D;wBAChB,IAAI,CAACpE,MAAM,CAAC;oBAChB,OAAO,IAAIoE,UAAU,OAAO;wBACxB,IAAI,CAAC/D,QAAQ,GAAG;wBAChB,IAAI,CAACL,MAAM,CAAC;oBAChB,OAAO;wBACH,IAAI,CAACK,QAAQ,GAAG;wBAChB,IAAI,CAACL,MAAM,CAAC;wBACZ,IAAI,CAACqE,MAAM,CAAC,IAAI,CAAC5C,KAAK;oBAC1B;gBACJ,GAAG6C,KAAK,CAACC,CAAAA;oBACL,IAAI,CAAClE,QAAQ,GAAGkE,IAAIpD,OAAO,IAAI;oBAC/B,IAAI,CAACnB,MAAM,CAAC;gBAChB;gBACA;YACJ;YAEA,IAAI,OAAON,WAAW,YAAYA,OAAOJ,MAAM,GAAG,GAAG;gBACjD,IAAI,CAACe,QAAQ,GAAGX;gBAChB,IAAI,CAACM,MAAM,CAAC;gBACZ;YACJ;YACA,IAAIN,WAAW,OAAO;gBAClB,IAAI,CAACW,QAAQ,GAAG;gBAChB,IAAI,CAACL,MAAM,CAAC;gBACZ;YACJ;QACJ;QAEA,IAAI,CAACqE,MAAM,CAAC,IAAI,CAAC5C,KAAK;IAC1B;IAvUA,YAAYvC,OAAU,CAAE;QACpB,KAAK,CAACA,UATV,uBAAUmB,YAAmB,KAC7B,0DAA0D;QAC1D,uBAAUjB,UAAiB,IAC3B,uBAAUuC,YAAoB,QAC9B,uBAAUtC,YAAqB,EAAE,GACjC,uBAAUa,eAAsB,IAChC,uBAAQX,SAAgB;QAIpB,IAAI,CAACkC,KAAK,GAAGvC,QAAQsF,OAAO,IAAI;QAChC,iCAAiC;QACjC,IAAI,CAACnF,QAAQ,GAAGuE,IAAAA,gBAAS,EAAC,IAAI,CAACnC,KAAK;QACpC,IAAI,CAACrC,MAAM,GAAG,IAAI,CAACC,QAAQ,CAACC,MAAM;IACtC;AAkUJ"}
|