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,62 +1,68 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
constructor(options) {
|
|
10
|
-
super(options);
|
|
11
|
-
this.selectedIndex = 0;
|
|
12
|
-
this.grabbedIndex = null;
|
|
13
|
-
this.scrollTop = 0;
|
|
14
|
-
this.pageSize = 10;
|
|
15
|
-
this.items = [...options.items];
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "SortPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return SortPrompt;
|
|
16
9
|
}
|
|
10
|
+
});
|
|
11
|
+
const _ansi = require("../ansi");
|
|
12
|
+
const _base = require("../base");
|
|
13
|
+
const _theme = require("../theme");
|
|
14
|
+
const _symbols = require("../symbols");
|
|
15
|
+
function _define_property(obj, key, value) {
|
|
16
|
+
if (key in obj) {
|
|
17
|
+
Object.defineProperty(obj, key, {
|
|
18
|
+
value: value,
|
|
19
|
+
enumerable: true,
|
|
20
|
+
configurable: true,
|
|
21
|
+
writable: true
|
|
22
|
+
});
|
|
23
|
+
} else {
|
|
24
|
+
obj[key] = value;
|
|
25
|
+
}
|
|
26
|
+
return obj;
|
|
27
|
+
}
|
|
28
|
+
let SortPrompt = class SortPrompt extends _base.Prompt {
|
|
17
29
|
render(_firstRender) {
|
|
18
30
|
// Adjust Scroll Top
|
|
19
31
|
if (this.selectedIndex < this.scrollTop) {
|
|
20
32
|
this.scrollTop = this.selectedIndex;
|
|
21
|
-
}
|
|
22
|
-
else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
|
|
33
|
+
} else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
|
|
23
34
|
this.scrollTop = this.selectedIndex - this.pageSize + 1;
|
|
24
35
|
}
|
|
25
36
|
// Ensure valid scroll (handle list shrinking?) - list doesn't shrink here but good practice
|
|
26
37
|
this.scrollTop = Math.max(0, Math.min(this.scrollTop, this.items.length - this.pageSize));
|
|
27
|
-
if (this.scrollTop < 0)
|
|
28
|
-
this.scrollTop = 0;
|
|
38
|
+
if (this.scrollTop < 0) this.scrollTop = 0;
|
|
29
39
|
let output = '';
|
|
30
40
|
// Header
|
|
31
|
-
output += `${
|
|
41
|
+
output += `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} ${_theme.theme.muted}(Press <space> to grab, arrows to move, <enter> to confirm)${_ansi.ANSI.RESET}\n`;
|
|
32
42
|
const visibleItems = this.items.slice(this.scrollTop, this.scrollTop + this.pageSize);
|
|
33
|
-
visibleItems.forEach((item, index)
|
|
43
|
+
visibleItems.forEach((item, index)=>{
|
|
34
44
|
const actualIndex = this.scrollTop + index;
|
|
35
|
-
if (index > 0)
|
|
36
|
-
output += '\n';
|
|
45
|
+
if (index > 0) output += '\n';
|
|
37
46
|
const isSelected = actualIndex === this.selectedIndex;
|
|
38
47
|
const isGrabbed = actualIndex === this.grabbedIndex;
|
|
39
48
|
// Pointer
|
|
40
49
|
let prefix = ' ';
|
|
41
50
|
if (isSelected) {
|
|
42
51
|
if (isGrabbed) {
|
|
43
|
-
prefix = `${
|
|
52
|
+
prefix = `${_theme.theme.main}${_symbols.symbols.pointer}${_symbols.symbols.pointer} `; // Double pointer for grabbed?
|
|
53
|
+
} else {
|
|
54
|
+
prefix = `${_theme.theme.main}${_symbols.symbols.pointer} `;
|
|
44
55
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
else if (isGrabbed) {
|
|
50
|
-
// Should not happen if we move grabbed item with cursor
|
|
51
|
-
// But if logic differs, maybe.
|
|
56
|
+
} else if (isGrabbed) {
|
|
57
|
+
// Should not happen if we move grabbed item with cursor
|
|
58
|
+
// But if logic differs, maybe.
|
|
52
59
|
}
|
|
53
60
|
// Item Content
|
|
54
61
|
let content = item;
|
|
55
62
|
if (isGrabbed) {
|
|
56
|
-
content = `${
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
content = `${theme_1.theme.main}${content}${ansi_1.ANSI.RESET}`;
|
|
63
|
+
content = `${_ansi.ANSI.BOLD}${_theme.theme.main}${content}${_ansi.ANSI.RESET}`;
|
|
64
|
+
} else if (isSelected) {
|
|
65
|
+
content = `${_theme.theme.main}${content}${_ansi.ANSI.RESET}`;
|
|
60
66
|
}
|
|
61
67
|
output += `${prefix}${content}`;
|
|
62
68
|
});
|
|
@@ -72,8 +78,7 @@ class SortPrompt extends base_1.Prompt {
|
|
|
72
78
|
if (char === ' ') {
|
|
73
79
|
if (this.grabbedIndex === null) {
|
|
74
80
|
this.grabbedIndex = this.selectedIndex;
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
81
|
+
} else {
|
|
77
82
|
this.grabbedIndex = null;
|
|
78
83
|
}
|
|
79
84
|
this.render(false);
|
|
@@ -89,8 +94,7 @@ class SortPrompt extends base_1.Prompt {
|
|
|
89
94
|
this.selectedIndex = newIndex;
|
|
90
95
|
this.grabbedIndex = newIndex;
|
|
91
96
|
}
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
97
|
+
} else {
|
|
94
98
|
// Move cursor up
|
|
95
99
|
this.selectedIndex = this.selectedIndex > 0 ? this.selectedIndex - 1 : this.items.length - 1;
|
|
96
100
|
}
|
|
@@ -107,8 +111,7 @@ class SortPrompt extends base_1.Prompt {
|
|
|
107
111
|
this.selectedIndex = newIndex;
|
|
108
112
|
this.grabbedIndex = newIndex;
|
|
109
113
|
}
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
114
|
+
} else {
|
|
112
115
|
// Move cursor down
|
|
113
116
|
this.selectedIndex = this.selectedIndex < this.items.length - 1 ? this.selectedIndex + 1 : 0;
|
|
114
117
|
}
|
|
@@ -117,7 +120,10 @@ class SortPrompt extends base_1.Prompt {
|
|
|
117
120
|
}
|
|
118
121
|
}
|
|
119
122
|
swap(i, j) {
|
|
120
|
-
[this.items[i], this.items[j]] = [
|
|
123
|
+
[this.items[i], this.items[j]] = [
|
|
124
|
+
this.items[j],
|
|
125
|
+
this.items[i]
|
|
126
|
+
];
|
|
121
127
|
}
|
|
122
128
|
handleMouse(event) {
|
|
123
129
|
// Simple scroll support for navigation
|
|
@@ -130,13 +136,11 @@ class SortPrompt extends base_1.Prompt {
|
|
|
130
136
|
this.selectedIndex = newIndex;
|
|
131
137
|
this.grabbedIndex = newIndex;
|
|
132
138
|
}
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
139
|
+
} else {
|
|
135
140
|
this.selectedIndex = this.selectedIndex > 0 ? this.selectedIndex - 1 : this.items.length - 1;
|
|
136
141
|
}
|
|
137
142
|
this.render(false);
|
|
138
|
-
}
|
|
139
|
-
else if (event.scroll === 'down') {
|
|
143
|
+
} else if (event.scroll === 'down') {
|
|
140
144
|
if (this.grabbedIndex !== null) {
|
|
141
145
|
if (this.selectedIndex < this.items.length - 1) {
|
|
142
146
|
const newIndex = this.selectedIndex + 1;
|
|
@@ -144,13 +148,19 @@ class SortPrompt extends base_1.Prompt {
|
|
|
144
148
|
this.selectedIndex = newIndex;
|
|
145
149
|
this.grabbedIndex = newIndex;
|
|
146
150
|
}
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
151
|
+
} else {
|
|
149
152
|
this.selectedIndex = this.selectedIndex < this.items.length - 1 ? this.selectedIndex + 1 : 0;
|
|
150
153
|
}
|
|
151
154
|
this.render(false);
|
|
152
155
|
}
|
|
153
156
|
}
|
|
154
157
|
}
|
|
155
|
-
|
|
156
|
-
|
|
158
|
+
constructor(options){
|
|
159
|
+
super(options), _define_property(this, "items", void 0), _define_property(this, "selectedIndex", 0), _define_property(this, "grabbedIndex", null), _define_property(this, "scrollTop", 0), _define_property(this, "pageSize", 10);
|
|
160
|
+
this.items = [
|
|
161
|
+
...options.items
|
|
162
|
+
];
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
//# sourceMappingURL=sort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/sort.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { SortOptions, MouseEvent } from '../types';\n\nexport class SortPrompt extends Prompt<string[], SortOptions> {\n private items: string[];\n private selectedIndex: number = 0;\n private grabbedIndex: number | null = null;\n private scrollTop: number = 0;\n private readonly pageSize: number = 10;\n\n constructor(options: SortOptions) {\n super(options);\n this.items = [...options.items];\n }\n\n protected render(_firstRender: boolean) {\n // Adjust Scroll Top\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 // Ensure valid scroll (handle list shrinking?) - list doesn't shrink here but good practice\n this.scrollTop = Math.max(0, Math.min(this.scrollTop, this.items.length - this.pageSize));\n if (this.scrollTop < 0) this.scrollTop = 0;\n\n let output = '';\n\n // Header\n output += `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET} ${theme.muted}(Press <space> to grab, arrows to move, <enter> to confirm)${ANSI.RESET}\\n`;\n\n const visibleItems = this.items.slice(this.scrollTop, this.scrollTop + this.pageSize);\n\n visibleItems.forEach((item, index) => {\n const actualIndex = this.scrollTop + index;\n if (index > 0) output += '\\n';\n\n const isSelected = actualIndex === this.selectedIndex;\n const isGrabbed = actualIndex === this.grabbedIndex;\n\n // Pointer\n let prefix = ' ';\n if (isSelected) {\n if (isGrabbed) {\n prefix = `${theme.main}${symbols.pointer}${symbols.pointer} `; // Double pointer for grabbed?\n } else {\n prefix = `${theme.main}${symbols.pointer} `;\n }\n } else if (isGrabbed) {\n // Should not happen if we move grabbed item with cursor\n // But if logic differs, maybe.\n }\n\n // Item Content\n let content = item;\n if (isGrabbed) {\n content = `${ANSI.BOLD}${theme.main}${content}${ANSI.RESET}`;\n } else if (isSelected) {\n content = `${theme.main}${content}${ANSI.RESET}`;\n }\n\n output += `${prefix}${content}`;\n });\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string) {\n // Enter\n if (char === '\\r' || char === '\\n') {\n this.submit(this.items);\n return;\n }\n\n // Space (Grab/Drop)\n if (char === ' ') {\n if (this.grabbedIndex === null) {\n this.grabbedIndex = this.selectedIndex;\n } else {\n this.grabbedIndex = null;\n }\n this.render(false);\n return;\n }\n\n // Up\n if (this.isUp(char)) {\n if (this.grabbedIndex !== null) {\n // Move item up\n if (this.selectedIndex > 0) {\n const newIndex = this.selectedIndex - 1;\n this.swap(this.selectedIndex, newIndex);\n this.selectedIndex = newIndex;\n this.grabbedIndex = newIndex;\n }\n } else {\n // Move cursor up\n this.selectedIndex = this.selectedIndex > 0 ? this.selectedIndex - 1 : this.items.length - 1;\n }\n this.render(false);\n return;\n }\n\n // Down\n if (this.isDown(char)) {\n if (this.grabbedIndex !== null) {\n // Move item down\n if (this.selectedIndex < this.items.length - 1) {\n const newIndex = this.selectedIndex + 1;\n this.swap(this.selectedIndex, newIndex);\n this.selectedIndex = newIndex;\n this.grabbedIndex = newIndex;\n }\n } else {\n // Move cursor down\n this.selectedIndex = this.selectedIndex < this.items.length - 1 ? this.selectedIndex + 1 : 0;\n }\n this.render(false);\n return;\n }\n }\n\n private swap(i: number, j: number) {\n [this.items[i], this.items[j]] = [this.items[j], this.items[i]];\n }\n\n protected handleMouse(event: MouseEvent) {\n // Simple scroll support for navigation\n if (event.action === 'scroll') {\n if (event.scroll === 'up') {\n if (this.grabbedIndex !== null) {\n if (this.selectedIndex > 0) {\n const newIndex = this.selectedIndex - 1;\n this.swap(this.selectedIndex, newIndex);\n this.selectedIndex = newIndex;\n this.grabbedIndex = newIndex;\n }\n } else {\n this.selectedIndex = this.selectedIndex > 0 ? this.selectedIndex - 1 : this.items.length - 1;\n }\n this.render(false);\n } else if (event.scroll === 'down') {\n if (this.grabbedIndex !== null) {\n if (this.selectedIndex < this.items.length - 1) {\n const newIndex = this.selectedIndex + 1;\n this.swap(this.selectedIndex, newIndex);\n this.selectedIndex = newIndex;\n this.grabbedIndex = newIndex;\n }\n } else {\n this.selectedIndex = this.selectedIndex < this.items.length - 1 ? this.selectedIndex + 1 : 0;\n }\n this.render(false);\n }\n }\n }\n}\n"],"names":["SortPrompt","Prompt","render","_firstRender","selectedIndex","scrollTop","pageSize","Math","max","min","items","length","output","theme","success","ANSI","RESET","BOLD","title","options","message","muted","visibleItems","slice","forEach","item","index","actualIndex","isSelected","isGrabbed","grabbedIndex","prefix","main","symbols","pointer","content","renderFrame","handleInput","char","submit","isUp","newIndex","swap","isDown","i","j","handleMouse","event","action","scroll"],"mappings":";;;;+BAMaA;;;eAAAA;;;sBANQ;sBACE;uBACD;yBACE;;;;;;;;;;;;;;AAGjB,IAAA,AAAMA,aAAN,MAAMA,mBAAmBC,YAAM;IAYxBC,OAAOC,YAAqB,EAAE;QACpC,oBAAoB;QACpB,IAAI,IAAI,CAACC,aAAa,GAAG,IAAI,CAACC,SAAS,EAAE;YACrC,IAAI,CAACA,SAAS,GAAG,IAAI,CAACD,aAAa;QACvC,OAAO,IAAI,IAAI,CAACA,aAAa,IAAI,IAAI,CAACC,SAAS,GAAG,IAAI,CAACC,QAAQ,EAAE;YAC7D,IAAI,CAACD,SAAS,GAAG,IAAI,CAACD,aAAa,GAAG,IAAI,CAACE,QAAQ,GAAG;QAC1D;QAEA,4FAA4F;QAC5F,IAAI,CAACD,SAAS,GAAGE,KAAKC,GAAG,CAAC,GAAGD,KAAKE,GAAG,CAAC,IAAI,CAACJ,SAAS,EAAE,IAAI,CAACK,KAAK,CAACC,MAAM,GAAG,IAAI,CAACL,QAAQ;QACvF,IAAI,IAAI,CAACD,SAAS,GAAG,GAAG,IAAI,CAACA,SAAS,GAAG;QAEzC,IAAIO,SAAS;QAEb,SAAS;QACTA,UAAU,GAAGC,YAAK,CAACC,OAAO,CAAC,CAAC,EAAEC,UAAI,CAACC,KAAK,CAAC,CAAC,EAAED,UAAI,CAACE,IAAI,GAAGJ,YAAK,CAACK,KAAK,GAAG,IAAI,CAACC,OAAO,CAACC,OAAO,GAAGL,UAAI,CAACC,KAAK,CAAC,CAAC,EAAEH,YAAK,CAACQ,KAAK,CAAC,2DAA2D,EAAEN,UAAI,CAACC,KAAK,CAAC,EAAE,CAAC;QAElM,MAAMM,eAAe,IAAI,CAACZ,KAAK,CAACa,KAAK,CAAC,IAAI,CAAClB,SAAS,EAAE,IAAI,CAACA,SAAS,GAAG,IAAI,CAACC,QAAQ;QAEpFgB,aAAaE,OAAO,CAAC,CAACC,MAAMC;YACxB,MAAMC,cAAc,IAAI,CAACtB,SAAS,GAAGqB;YACrC,IAAIA,QAAQ,GAAGd,UAAU;YAEzB,MAAMgB,aAAaD,gBAAgB,IAAI,CAACvB,aAAa;YACrD,MAAMyB,YAAYF,gBAAgB,IAAI,CAACG,YAAY;YAEnD,UAAU;YACV,IAAIC,SAAS;YACb,IAAIH,YAAY;gBACZ,IAAIC,WAAW;oBACXE,SAAS,GAAGlB,YAAK,CAACmB,IAAI,GAAGC,gBAAO,CAACC,OAAO,GAAGD,gBAAO,CAACC,OAAO,CAAC,CAAC,CAAC,EAAE,8BAA8B;gBACjG,OAAO;oBACHH,SAAS,GAAGlB,YAAK,CAACmB,IAAI,GAAGC,gBAAO,CAACC,OAAO,CAAC,CAAC,CAAC;gBAC/C;YACJ,OAAO,IAAIL,WAAW;YAClB,wDAAwD;YACxD,+BAA+B;YACnC;YAEA,eAAe;YACf,IAAIM,UAAUV;YACd,IAAII,WAAW;gBACXM,UAAU,GAAGpB,UAAI,CAACE,IAAI,GAAGJ,YAAK,CAACmB,IAAI,GAAGG,UAAUpB,UAAI,CAACC,KAAK,EAAE;YAChE,OAAO,IAAIY,YAAY;gBACnBO,UAAU,GAAGtB,YAAK,CAACmB,IAAI,GAAGG,UAAUpB,UAAI,CAACC,KAAK,EAAE;YACpD;YAEAJ,UAAU,GAAGmB,SAASI,SAAS;QACnC;QAEA,IAAI,CAACC,WAAW,CAACxB;IACrB;IAEUyB,YAAYC,IAAY,EAAE;QAChC,QAAQ;QACR,IAAIA,SAAS,QAAQA,SAAS,MAAM;YAChC,IAAI,CAACC,MAAM,CAAC,IAAI,CAAC7B,KAAK;YACtB;QACJ;QAEA,oBAAoB;QACpB,IAAI4B,SAAS,KAAK;YACd,IAAI,IAAI,CAACR,YAAY,KAAK,MAAM;gBAC5B,IAAI,CAACA,YAAY,GAAG,IAAI,CAAC1B,aAAa;YAC1C,OAAO;gBACH,IAAI,CAAC0B,YAAY,GAAG;YACxB;YACA,IAAI,CAAC5B,MAAM,CAAC;YACZ;QACJ;QAEA,KAAK;QACL,IAAI,IAAI,CAACsC,IAAI,CAACF,OAAO;YACjB,IAAI,IAAI,CAACR,YAAY,KAAK,MAAM;gBAC5B,eAAe;gBACf,IAAI,IAAI,CAAC1B,aAAa,GAAG,GAAG;oBACxB,MAAMqC,WAAW,IAAI,CAACrC,aAAa,GAAG;oBACtC,IAAI,CAACsC,IAAI,CAAC,IAAI,CAACtC,aAAa,EAAEqC;oBAC9B,IAAI,CAACrC,aAAa,GAAGqC;oBACrB,IAAI,CAACX,YAAY,GAAGW;gBACxB;YACJ,OAAO;gBACH,iBAAiB;gBACjB,IAAI,CAACrC,aAAa,GAAG,IAAI,CAACA,aAAa,GAAG,IAAI,IAAI,CAACA,aAAa,GAAG,IAAI,IAAI,CAACM,KAAK,CAACC,MAAM,GAAG;YAC/F;YACA,IAAI,CAACT,MAAM,CAAC;YACZ;QACJ;QAEA,OAAO;QACP,IAAI,IAAI,CAACyC,MAAM,CAACL,OAAO;YACnB,IAAI,IAAI,CAACR,YAAY,KAAK,MAAM;gBAC5B,iBAAiB;gBACjB,IAAI,IAAI,CAAC1B,aAAa,GAAG,IAAI,CAACM,KAAK,CAACC,MAAM,GAAG,GAAG;oBAC5C,MAAM8B,WAAW,IAAI,CAACrC,aAAa,GAAG;oBACtC,IAAI,CAACsC,IAAI,CAAC,IAAI,CAACtC,aAAa,EAAEqC;oBAC9B,IAAI,CAACrC,aAAa,GAAGqC;oBACrB,IAAI,CAACX,YAAY,GAAGW;gBACxB;YACJ,OAAO;gBACH,mBAAmB;gBACnB,IAAI,CAACrC,aAAa,GAAG,IAAI,CAACA,aAAa,GAAG,IAAI,CAACM,KAAK,CAACC,MAAM,GAAG,IAAI,IAAI,CAACP,aAAa,GAAG,IAAI;YAC/F;YACA,IAAI,CAACF,MAAM,CAAC;YACZ;QACJ;IACJ;IAEQwC,KAAKE,CAAS,EAAEC,CAAS,EAAE;QAC/B,CAAC,IAAI,CAACnC,KAAK,CAACkC,EAAE,EAAE,IAAI,CAAClC,KAAK,CAACmC,EAAE,CAAC,GAAG;YAAC,IAAI,CAACnC,KAAK,CAACmC,EAAE;YAAE,IAAI,CAACnC,KAAK,CAACkC,EAAE;SAAC;IACnE;IAEUE,YAAYC,KAAiB,EAAE;QACrC,uCAAuC;QACvC,IAAIA,MAAMC,MAAM,KAAK,UAAU;YAC3B,IAAID,MAAME,MAAM,KAAK,MAAM;gBACvB,IAAI,IAAI,CAACnB,YAAY,KAAK,MAAM;oBAC5B,IAAI,IAAI,CAAC1B,aAAa,GAAG,GAAG;wBACxB,MAAMqC,WAAW,IAAI,CAACrC,aAAa,GAAG;wBACtC,IAAI,CAACsC,IAAI,CAAC,IAAI,CAACtC,aAAa,EAAEqC;wBAC9B,IAAI,CAACrC,aAAa,GAAGqC;wBACrB,IAAI,CAACX,YAAY,GAAGW;oBACxB;gBACJ,OAAO;oBACH,IAAI,CAACrC,aAAa,GAAG,IAAI,CAACA,aAAa,GAAG,IAAI,IAAI,CAACA,aAAa,GAAG,IAAI,IAAI,CAACM,KAAK,CAACC,MAAM,GAAG;gBAC/F;gBACA,IAAI,CAACT,MAAM,CAAC;YAChB,OAAO,IAAI6C,MAAME,MAAM,KAAK,QAAQ;gBAChC,IAAI,IAAI,CAACnB,YAAY,KAAK,MAAM;oBAC5B,IAAI,IAAI,CAAC1B,aAAa,GAAG,IAAI,CAACM,KAAK,CAACC,MAAM,GAAG,GAAG;wBAC5C,MAAM8B,WAAW,IAAI,CAACrC,aAAa,GAAG;wBACtC,IAAI,CAACsC,IAAI,CAAC,IAAI,CAACtC,aAAa,EAAEqC;wBAC9B,IAAI,CAACrC,aAAa,GAAGqC;wBACrB,IAAI,CAACX,YAAY,GAAGW;oBACxB;gBACJ,OAAO;oBACH,IAAI,CAACrC,aAAa,GAAG,IAAI,CAACA,aAAa,GAAG,IAAI,CAACM,KAAK,CAACC,MAAM,GAAG,IAAI,IAAI,CAACP,aAAa,GAAG,IAAI;gBAC/F;gBACA,IAAI,CAACF,MAAM,CAAC;YAChB;QACJ;IACJ;IAlJA,YAAYiB,OAAoB,CAAE;QAC9B,KAAK,CAACA,UAPV,uBAAQT,SAAR,KAAA,IACA,uBAAQN,iBAAwB,IAChC,uBAAQ0B,gBAA8B,OACtC,uBAAQzB,aAAoB,IAC5B,uBAAiBC,YAAmB;QAIhC,IAAI,CAACI,KAAK,GAAG;eAAIS,QAAQT,KAAK;SAAC;IACnC;AAgJJ"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "SpamPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return SpamPrompt;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _ansi = require("../ansi");
|
|
12
|
+
const _base = require("../base");
|
|
13
|
+
const _theme = require("../theme");
|
|
14
|
+
const _symbols = require("../symbols");
|
|
15
|
+
function _define_property(obj, key, value) {
|
|
16
|
+
if (key in obj) {
|
|
17
|
+
Object.defineProperty(obj, key, {
|
|
18
|
+
value: value,
|
|
19
|
+
enumerable: true,
|
|
20
|
+
configurable: true,
|
|
21
|
+
writable: true
|
|
22
|
+
});
|
|
23
|
+
} else {
|
|
24
|
+
obj[key] = value;
|
|
25
|
+
}
|
|
26
|
+
return obj;
|
|
27
|
+
}
|
|
28
|
+
let SpamPrompt = class SpamPrompt extends _base.Prompt {
|
|
29
|
+
cleanup() {
|
|
30
|
+
if (this.decayTimer) clearInterval(this.decayTimer);
|
|
31
|
+
super.cleanup();
|
|
32
|
+
}
|
|
33
|
+
render(_firstRender) {
|
|
34
|
+
const progress = Math.min(this.count / this.options.threshold, 1);
|
|
35
|
+
const filledLen = Math.round(progress * this.width);
|
|
36
|
+
const emptyLen = this.width - filledLen;
|
|
37
|
+
// Visual Bar: [#####-----]
|
|
38
|
+
const filled = _symbols.symbols.line.repeat(filledLen).replace(/./g, '#'); // Or use block char
|
|
39
|
+
const empty = _symbols.symbols.line.repeat(emptyLen);
|
|
40
|
+
const barColor = progress === 1 ? _theme.theme.success : _theme.theme.error;
|
|
41
|
+
const bar = `${_theme.theme.muted}[${barColor}${filled}${_theme.theme.muted}${empty}]${_ansi.ANSI.RESET}`;
|
|
42
|
+
let output = `${_theme.theme.error}${_symbols.symbols.cross} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}\n`;
|
|
43
|
+
output += ` ${bar} ${Math.floor(progress * 100)}%`;
|
|
44
|
+
if (this.count >= this.options.threshold) {
|
|
45
|
+
output += ` ${_theme.theme.success} READY! Press Enter${_ansi.ANSI.RESET}`;
|
|
46
|
+
} else {
|
|
47
|
+
output += ` ${_theme.theme.muted}(Mash '${this.options.spamKey || 'Space'}' to fill)${_ansi.ANSI.RESET}`;
|
|
48
|
+
}
|
|
49
|
+
this.renderFrame(output);
|
|
50
|
+
}
|
|
51
|
+
handleInput(char) {
|
|
52
|
+
// Confirm execution
|
|
53
|
+
if (this.count >= this.options.threshold && (char === '\r' || char === '\n')) {
|
|
54
|
+
this.submit(true);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const trigger = this.options.spamKey || ' ';
|
|
58
|
+
// Check if key matches (or any key if not specified)
|
|
59
|
+
if (char === trigger) {
|
|
60
|
+
if (this.count < this.options.threshold) {
|
|
61
|
+
this.count++;
|
|
62
|
+
this.render(false);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
constructor(options){
|
|
67
|
+
super(options), _define_property(this, "count", 0), _define_property(this, "width", 20) // Visual width of the bar
|
|
68
|
+
, _define_property(this, "decayTimer", void 0);
|
|
69
|
+
if (options.decay) {
|
|
70
|
+
this.decayTimer = setInterval(()=>{
|
|
71
|
+
if (this.count > 0) {
|
|
72
|
+
this.count = Math.max(0, this.count - 1);
|
|
73
|
+
this.render(false);
|
|
74
|
+
}
|
|
75
|
+
}, 200); // Drop 5 presses per second
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
//# sourceMappingURL=spam.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/spam.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { BaseOptions } from '../types';\n\ninterface SpamOptions extends BaseOptions {\n threshold: number; // Number of presses required\n spamKey?: string; // Default to 'space' or generic 'any'\n decay?: boolean; // Evil mode: progress drops if you stop spamming!\n}\n\nexport class SpamPrompt extends Prompt<boolean, SpamOptions> {\n private count: number = 0;\n private width: number = 20; // Visual width of the bar\n private decayTimer?: NodeJS.Timeout;\n\n constructor(options: SpamOptions) {\n super(options);\n\n if (options.decay) {\n this.decayTimer = setInterval(() => {\n if (this.count > 0) {\n this.count = Math.max(0, this.count - 1);\n this.render(false);\n }\n }, 200); // Drop 5 presses per second\n }\n }\n\n protected cleanup() {\n if (this.decayTimer) clearInterval(this.decayTimer);\n super.cleanup();\n }\n\n protected render(_firstRender: boolean) {\n const progress = Math.min(this.count / this.options.threshold, 1);\n const filledLen = Math.round(progress * this.width);\n const emptyLen = this.width - filledLen;\n\n // Visual Bar: [#####-----]\n const filled = symbols.line.repeat(filledLen).replace(/./g, '#'); // Or use block char\n const empty = symbols.line.repeat(emptyLen);\n\n const barColor = progress === 1 ? theme.success : theme.error;\n const bar = `${theme.muted}[${barColor}${filled}${theme.muted}${empty}]${ANSI.RESET}`;\n\n let output = `${theme.error}${symbols.cross} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}\\n`;\n output += ` ${bar} ${Math.floor(progress * 100)}%`;\n\n if (this.count >= this.options.threshold) {\n output += ` ${theme.success} READY! Press Enter${ANSI.RESET}`;\n } else {\n output += ` ${theme.muted}(Mash '${this.options.spamKey || 'Space'}' to fill)${ANSI.RESET}`;\n }\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string) {\n // Confirm execution\n if (this.count >= this.options.threshold && (char === '\\r' || char === '\\n')) {\n this.submit(true);\n return;\n }\n\n const trigger = this.options.spamKey || ' ';\n\n // Check if key matches (or any key if not specified)\n if (char === trigger) {\n if (this.count < this.options.threshold) {\n this.count++;\n this.render(false);\n }\n }\n }\n}"],"names":["SpamPrompt","Prompt","cleanup","decayTimer","clearInterval","render","_firstRender","progress","Math","min","count","options","threshold","filledLen","round","width","emptyLen","filled","symbols","line","repeat","replace","empty","barColor","theme","success","error","bar","muted","ANSI","RESET","output","cross","BOLD","title","message","floor","spamKey","renderFrame","handleInput","char","submit","trigger","decay","setInterval","max"],"mappings":"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"}
|
|
@@ -1,33 +1,40 @@
|
|
|
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
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "SpreadsheetPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return SpreadsheetPrompt;
|
|
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;
|
|
21
26
|
}
|
|
27
|
+
return obj;
|
|
28
|
+
}
|
|
29
|
+
let SpreadsheetPrompt = class SpreadsheetPrompt extends _base.Prompt {
|
|
22
30
|
calculateColWidths() {
|
|
23
|
-
this.colWidths = this.options.columns.map(col
|
|
24
|
-
if (col.width)
|
|
25
|
-
return col.width;
|
|
31
|
+
this.colWidths = this.options.columns.map((col)=>{
|
|
32
|
+
if (col.width) return col.width;
|
|
26
33
|
// Auto calculate based on header and data
|
|
27
|
-
let max = (0,
|
|
28
|
-
this.options.data.forEach(row
|
|
34
|
+
let max = (0, _utils.stringWidth)(col.name);
|
|
35
|
+
this.options.data.forEach((row)=>{
|
|
29
36
|
const val = String(row[col.key] || '');
|
|
30
|
-
max = Math.max(max, (0,
|
|
37
|
+
max = Math.max(max, (0, _utils.stringWidth)(val));
|
|
31
38
|
});
|
|
32
39
|
return Math.min(max + 2, 30); // Cap at 30 chars
|
|
33
40
|
});
|
|
@@ -35,52 +42,48 @@ class SpreadsheetPrompt extends base_1.Prompt {
|
|
|
35
42
|
render(_firstRender) {
|
|
36
43
|
let output = '';
|
|
37
44
|
// Title
|
|
38
|
-
const mode = this.editMode ? `${
|
|
39
|
-
output += `${
|
|
40
|
-
output += `${
|
|
45
|
+
const mode = this.editMode ? `${_ansi.ANSI.FG_YELLOW}[EDIT]${_ansi.ANSI.RESET}` : `${_ansi.ANSI.FG_BLUE}[NAV]${_ansi.ANSI.RESET}`;
|
|
46
|
+
output += `${_theme.theme.title}${this.options.message} ${mode}${_ansi.ANSI.RESET}\n`;
|
|
47
|
+
output += `${_ansi.ANSI.DIM}(Arrows: Move, Enter/Type: Edit, Esc: Cancel)${_ansi.ANSI.RESET}\n`;
|
|
41
48
|
// Viewport Logic (Rows)
|
|
42
49
|
const maxScrollRow = Math.max(0, this.options.data.length - this.viewportHeight);
|
|
43
|
-
if (this.cursorRow < this.scrollRow)
|
|
44
|
-
|
|
45
|
-
if (this.cursorRow >= this.scrollRow + this.viewportHeight)
|
|
46
|
-
this.scrollRow = this.cursorRow - this.viewportHeight + 1;
|
|
50
|
+
if (this.cursorRow < this.scrollRow) this.scrollRow = this.cursorRow;
|
|
51
|
+
if (this.cursorRow >= this.scrollRow + this.viewportHeight) this.scrollRow = this.cursorRow - this.viewportHeight + 1;
|
|
47
52
|
this.scrollRow = Math.min(maxScrollRow, this.scrollRow);
|
|
48
53
|
// Viewport Logic (Columns - Horizontal Scroll)
|
|
49
54
|
const termWidth = this.stdout.columns || 80;
|
|
50
55
|
let currentWidth = 4; // Row number column (3 digits + space)
|
|
51
56
|
const visibleCols = [];
|
|
52
|
-
for
|
|
57
|
+
for(let i = this.scrollCol; i < this.options.columns.length; i++){
|
|
53
58
|
const w = this.colWidths[i];
|
|
54
59
|
// Check if adding this column exceeds width
|
|
55
60
|
// We allow at least one column even if it exceeds? No, standard behavior.
|
|
56
|
-
if (currentWidth + w + 1 > termWidth && visibleCols.length > 0)
|
|
57
|
-
break;
|
|
61
|
+
if (currentWidth + w + 1 > termWidth && visibleCols.length > 0) break;
|
|
58
62
|
visibleCols.push(i);
|
|
59
63
|
currentWidth += w + 1;
|
|
60
64
|
}
|
|
61
65
|
// Render Header
|
|
62
66
|
let headerStr = ' ';
|
|
63
67
|
let totalWidth = 3;
|
|
64
|
-
visibleCols.forEach(idx
|
|
68
|
+
visibleCols.forEach((idx)=>{
|
|
65
69
|
const col = this.options.columns[idx];
|
|
66
70
|
const w = this.colWidths[idx];
|
|
67
71
|
headerStr += this.pad(col.name, w) + ' ';
|
|
68
72
|
totalWidth += w + 1;
|
|
69
73
|
});
|
|
70
|
-
output += `${
|
|
71
|
-
output += `${
|
|
74
|
+
output += `${_ansi.ANSI.BOLD}${headerStr}${_ansi.ANSI.RESET}\n`;
|
|
75
|
+
output += `${_ansi.ANSI.DIM} ${_symbols.symbols.horizontal.repeat(Math.max(0, totalWidth - 3))}${_ansi.ANSI.RESET}\n`;
|
|
72
76
|
// Render Rows
|
|
73
|
-
for
|
|
77
|
+
for(let i = 0; i < this.viewportHeight; i++){
|
|
74
78
|
const rowIndex = this.scrollRow + i;
|
|
75
|
-
if (rowIndex >= this.options.data.length)
|
|
76
|
-
break;
|
|
79
|
+
if (rowIndex >= this.options.data.length) break;
|
|
77
80
|
const rowData = this.options.data[rowIndex];
|
|
78
81
|
// Row Number
|
|
79
|
-
let rowStr = `${
|
|
80
|
-
visibleCols.forEach(colIndex
|
|
82
|
+
let rowStr = `${_ansi.ANSI.DIM}${String(rowIndex + 1).padEnd(3)}${_ansi.ANSI.RESET}`;
|
|
83
|
+
visibleCols.forEach((colIndex)=>{
|
|
81
84
|
const col = this.options.columns[colIndex];
|
|
82
85
|
const w = this.colWidths[colIndex];
|
|
83
|
-
const isCursor =
|
|
86
|
+
const isCursor = rowIndex === this.cursorRow && colIndex === this.cursorCol;
|
|
84
87
|
let val = String(rowData[col.key] || '');
|
|
85
88
|
if (isCursor && this.editMode) {
|
|
86
89
|
val = this.tempValue;
|
|
@@ -90,11 +93,10 @@ class SpreadsheetPrompt extends base_1.Prompt {
|
|
|
90
93
|
if (isCursor) {
|
|
91
94
|
if (this.editMode) {
|
|
92
95
|
// Highlight editing
|
|
93
|
-
displayVal = `${
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
+
displayVal = `${_theme.theme.main}${_ansi.ANSI.UNDERLINE}${displayVal}${_ansi.ANSI.RESET}`;
|
|
97
|
+
} else {
|
|
96
98
|
// Highlight selection
|
|
97
|
-
displayVal = `${
|
|
99
|
+
displayVal = `${_ansi.ANSI.REVERSE}${displayVal}${_ansi.ANSI.RESET}`;
|
|
98
100
|
}
|
|
99
101
|
}
|
|
100
102
|
rowStr += displayVal + ' ';
|
|
@@ -103,24 +105,21 @@ class SpreadsheetPrompt extends base_1.Prompt {
|
|
|
103
105
|
}
|
|
104
106
|
// Footer / Status
|
|
105
107
|
if (this.editMode) {
|
|
106
|
-
output += `\n${
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
output += `\n${ansi_1.ANSI.DIM}Press 's' or Enter to Save & Exit${ansi_1.ANSI.RESET}`;
|
|
108
|
+
output += `\n${_ansi.ANSI.FG_YELLOW}Editing cell (${this.cursorRow + 1}, ${this.options.columns[this.cursorCol].name}). Press Enter to save.${_ansi.ANSI.RESET}`;
|
|
109
|
+
} else {
|
|
110
|
+
output += `\n${_ansi.ANSI.DIM}Press 's' or Enter to Save & Exit${_ansi.ANSI.RESET}`;
|
|
110
111
|
}
|
|
111
112
|
this.renderFrame(output);
|
|
112
113
|
}
|
|
113
114
|
pad(str, width) {
|
|
114
|
-
const w = (0,
|
|
115
|
-
if (w >= width)
|
|
116
|
-
return str;
|
|
115
|
+
const w = (0, _utils.stringWidth)(str);
|
|
116
|
+
if (w >= width) return str;
|
|
117
117
|
return str + ' '.repeat(width - w);
|
|
118
118
|
}
|
|
119
119
|
handleInput(char, _key) {
|
|
120
120
|
if (this.editMode) {
|
|
121
121
|
this.handleEditInput(char);
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
122
|
+
} else {
|
|
124
123
|
this.handleNavInput(char);
|
|
125
124
|
}
|
|
126
125
|
}
|
|
@@ -148,21 +147,19 @@ class SpreadsheetPrompt extends base_1.Prompt {
|
|
|
148
147
|
this.cursorCol = Math.min(this.options.columns.length - 1, this.cursorCol + 1);
|
|
149
148
|
// Adjust scrollCol to keep cursor visible
|
|
150
149
|
// Loop until cursorCol is within visible range
|
|
151
|
-
while
|
|
150
|
+
while(true){
|
|
152
151
|
const termWidth = this.stdout.columns || 80;
|
|
153
152
|
let w = 4; // Row num
|
|
154
153
|
let isVisible = false;
|
|
155
|
-
for
|
|
154
|
+
for(let i = this.scrollCol; i < this.options.columns.length; i++){
|
|
156
155
|
w += this.colWidths[i] + 1;
|
|
157
|
-
if (w > termWidth && i > this.scrollCol)
|
|
158
|
-
break; // Allow at least one
|
|
156
|
+
if (w > termWidth && i > this.scrollCol) break; // Allow at least one
|
|
159
157
|
if (i === this.cursorCol) {
|
|
160
158
|
isVisible = true;
|
|
161
159
|
break;
|
|
162
160
|
}
|
|
163
161
|
}
|
|
164
|
-
if (isVisible)
|
|
165
|
-
break;
|
|
162
|
+
if (isVisible) break;
|
|
166
163
|
this.scrollCol++;
|
|
167
164
|
if (this.scrollCol > this.cursorCol) {
|
|
168
165
|
this.scrollCol = this.cursorCol;
|
|
@@ -190,8 +187,7 @@ class SpreadsheetPrompt extends base_1.Prompt {
|
|
|
190
187
|
}
|
|
191
188
|
startEditing(initialChar = '') {
|
|
192
189
|
const col = this.options.columns[this.cursorCol];
|
|
193
|
-
if (col.editable === false)
|
|
194
|
-
return;
|
|
190
|
+
if (col.editable === false) return;
|
|
195
191
|
this.editMode = true;
|
|
196
192
|
const currentVal = String(this.options.data[this.cursorRow][col.key] || '');
|
|
197
193
|
this.tempValue = initialChar ? initialChar : currentVal;
|
|
@@ -208,7 +204,7 @@ class SpreadsheetPrompt extends base_1.Prompt {
|
|
|
208
204
|
this.render(false);
|
|
209
205
|
return;
|
|
210
206
|
}
|
|
211
|
-
if (char === '\x1b') {
|
|
207
|
+
if (char === '\x1b') {
|
|
212
208
|
this.editMode = false;
|
|
213
209
|
this.render(false);
|
|
214
210
|
return;
|
|
@@ -228,12 +224,17 @@ class SpreadsheetPrompt extends base_1.Prompt {
|
|
|
228
224
|
if (event.scroll === 'up') {
|
|
229
225
|
this.cursorRow = Math.max(0, this.cursorRow - 1);
|
|
230
226
|
this.render(false);
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
227
|
+
} else {
|
|
233
228
|
this.cursorRow = Math.min(this.options.data.length - 1, this.cursorRow + 1);
|
|
234
229
|
this.render(false);
|
|
235
230
|
}
|
|
236
231
|
}
|
|
237
232
|
}
|
|
238
|
-
|
|
239
|
-
|
|
233
|
+
constructor(options){
|
|
234
|
+
super(options), _define_property(this, "cursorRow", 0), _define_property(this, "cursorCol", 0), _define_property(this, "scrollRow", 0), _define_property(this, "scrollCol", 0), _define_property(this, "editMode", false), _define_property(this, "tempValue", ''), _define_property(this, "colWidths", []), _define_property(this, "viewportHeight", void 0);
|
|
235
|
+
this.viewportHeight = options.rows || 10;
|
|
236
|
+
this.calculateColWidths();
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
//# sourceMappingURL=spreadsheet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/spreadsheet.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { SpreadsheetOptions, MouseEvent } from '../types';\nimport { stringWidth } from '../utils';\n\nexport class SpreadsheetPrompt extends Prompt<Record<string, any>[], SpreadsheetOptions> {\n private cursorRow: number = 0;\n private cursorCol: number = 0;\n private scrollRow: number = 0;\n private scrollCol: number = 0;\n\n private editMode: boolean = false;\n private tempValue: string = '';\n\n private colWidths: number[] = [];\n private viewportHeight: number;\n\n constructor(options: SpreadsheetOptions) {\n super(options);\n this.viewportHeight = options.rows || 10;\n this.calculateColWidths();\n }\n\n private calculateColWidths() {\n this.colWidths = this.options.columns.map(col => {\n if (col.width) return col.width;\n\n // Auto calculate based on header and data\n let max = stringWidth(col.name);\n this.options.data.forEach(row => {\n const val = String(row[col.key] || '');\n max = Math.max(max, stringWidth(val));\n });\n return Math.min(max + 2, 30); // Cap at 30 chars\n });\n }\n\n protected render(_firstRender: boolean) {\n let output = '';\n\n // Title\n const mode = this.editMode ? `${ANSI.FG_YELLOW}[EDIT]${ANSI.RESET}` : `${ANSI.FG_BLUE}[NAV]${ANSI.RESET}`;\n output += `${theme.title}${this.options.message} ${mode}${ANSI.RESET}\\n`;\n\n output += `${ANSI.DIM}(Arrows: Move, Enter/Type: Edit, Esc: Cancel)${ANSI.RESET}\\n`;\n\n // Viewport Logic (Rows)\n const maxScrollRow = Math.max(0, this.options.data.length - this.viewportHeight);\n if (this.cursorRow < this.scrollRow) this.scrollRow = this.cursorRow;\n if (this.cursorRow >= this.scrollRow + this.viewportHeight) this.scrollRow = this.cursorRow - this.viewportHeight + 1;\n this.scrollRow = Math.min(maxScrollRow, this.scrollRow);\n\n // Viewport Logic (Columns - Horizontal Scroll)\n const termWidth = this.stdout.columns || 80;\n let currentWidth = 4; // Row number column (3 digits + space)\n const visibleCols: number[] = [];\n\n for (let i = this.scrollCol; i < this.options.columns.length; i++) {\n const w = this.colWidths[i];\n // Check if adding this column exceeds width\n // We allow at least one column even if it exceeds? No, standard behavior.\n if (currentWidth + w + 1 > termWidth && visibleCols.length > 0) break;\n\n visibleCols.push(i);\n currentWidth += w + 1;\n }\n\n // Render Header\n let headerStr = ' ';\n let totalWidth = 3;\n\n visibleCols.forEach(idx => {\n const col = this.options.columns[idx];\n const w = this.colWidths[idx];\n headerStr += this.pad(col.name, w) + ' ';\n totalWidth += w + 1;\n });\n\n output += `${ANSI.BOLD}${headerStr}${ANSI.RESET}\\n`;\n output += `${ANSI.DIM} ${symbols.horizontal.repeat(Math.max(0, totalWidth - 3))}${ANSI.RESET}\\n`;\n\n // Render Rows\n for (let i = 0; i < this.viewportHeight; i++) {\n const rowIndex = this.scrollRow + i;\n if (rowIndex >= this.options.data.length) break;\n\n const rowData = this.options.data[rowIndex];\n // Row Number\n let rowStr = `${ANSI.DIM}${String(rowIndex + 1).padEnd(3)}${ANSI.RESET}`;\n\n visibleCols.forEach(colIndex => {\n const col = this.options.columns[colIndex];\n const w = this.colWidths[colIndex];\n const isCursor = (rowIndex === this.cursorRow) && (colIndex === this.cursorCol);\n\n let val = String(rowData[col.key] || '');\n if (isCursor && this.editMode) {\n val = this.tempValue;\n }\n\n let displayVal = this.truncate(val, w);\n displayVal = this.pad(displayVal, w);\n\n if (isCursor) {\n if (this.editMode) {\n // Highlight editing\n displayVal = `${theme.main}${ANSI.UNDERLINE}${displayVal}${ANSI.RESET}`;\n } else {\n // Highlight selection\n displayVal = `${ANSI.REVERSE}${displayVal}${ANSI.RESET}`;\n }\n }\n\n rowStr += displayVal + ' ';\n });\n output += rowStr + '\\n';\n }\n\n // Footer / Status\n if (this.editMode) {\n output += `\\n${ANSI.FG_YELLOW}Editing cell (${this.cursorRow + 1}, ${this.options.columns[this.cursorCol].name}). Press Enter to save.${ANSI.RESET}`;\n } else {\n output += `\\n${ANSI.DIM}Press 's' or Enter to Save & Exit${ANSI.RESET}`;\n }\n\n this.renderFrame(output);\n }\n\n private pad(str: string, width: number): string {\n const w = stringWidth(str);\n if (w >= width) return str;\n return str + ' '.repeat(width - w);\n }\n\n protected handleInput(char: string, _key: Buffer) {\n if (this.editMode) {\n this.handleEditInput(char);\n } else {\n this.handleNavInput(char);\n }\n }\n\n private handleNavInput(char: string) {\n // Navigation\n if (this.isUp(char)) {\n this.cursorRow = Math.max(0, this.cursorRow - 1);\n this.render(false);\n return;\n }\n if (this.isDown(char)) {\n this.cursorRow = Math.min(this.options.data.length - 1, this.cursorRow + 1);\n this.render(false);\n return;\n }\n if (this.isLeft(char) || char === '\\x1b[Z') {\n this.cursorCol = Math.max(0, this.cursorCol - 1);\n if (this.cursorCol < this.scrollCol) {\n this.scrollCol = this.cursorCol;\n }\n this.render(false);\n return;\n }\n if (this.isRight(char) || char === '\\t') {\n this.cursorCol = Math.min(this.options.columns.length - 1, this.cursorCol + 1);\n\n // Adjust scrollCol to keep cursor visible\n // Loop until cursorCol is within visible range\n while (true) {\n const termWidth = this.stdout.columns || 80;\n let w = 4; // Row num\n let isVisible = false;\n\n for (let i = this.scrollCol; i < this.options.columns.length; i++) {\n w += this.colWidths[i] + 1;\n if (w > termWidth && i > this.scrollCol) break; // Allow at least one\n\n if (i === this.cursorCol) {\n isVisible = true;\n break;\n }\n }\n\n if (isVisible) break;\n this.scrollCol++;\n if (this.scrollCol > this.cursorCol) {\n this.scrollCol = this.cursorCol;\n break;\n }\n }\n\n this.render(false);\n return;\n }\n\n // Enter Edit Mode\n if (char === '\\r' || char === '\\n') {\n this.startEditing();\n return;\n }\n\n // Shortcuts\n if (char === 's') {\n this.submit(this.options.data);\n return;\n }\n\n // Removed 'q' unsafe exit.\n\n // Typing starts editing\n if (!/^[\\x00-\\x1F]/.test(char)) {\n this.startEditing(char);\n }\n }\n\n private startEditing(initialChar: string = '') {\n const col = this.options.columns[this.cursorCol];\n if (col.editable === false) return;\n\n this.editMode = true;\n const currentVal = String(this.options.data[this.cursorRow][col.key] || '');\n this.tempValue = initialChar ? initialChar : currentVal;\n this.render(false);\n }\n\n private handleEditInput(char: string) {\n if (char === '\\r' || char === '\\n') {\n // Save\n const col = this.options.columns[this.cursorCol];\n this.options.data[this.cursorRow][col.key] = this.tempValue;\n this.editMode = false;\n // Recalculate width if needed?\n this.calculateColWidths(); // Update widths\n this.render(false);\n return;\n }\n\n if (char === '\\x1b') { // Esc\n this.editMode = false;\n this.render(false);\n return;\n }\n\n if (char === '\\x7f' || char === '\\b') {\n this.tempValue = this.tempValue.slice(0, -1);\n this.render(false);\n return;\n }\n\n if (!/^[\\x00-\\x1F]/.test(char)) {\n this.tempValue += char;\n this.render(false);\n }\n }\n\n protected handleMouse(event: MouseEvent) {\n if (event.action === 'scroll') {\n if (event.scroll === 'up') {\n this.cursorRow = Math.max(0, this.cursorRow - 1);\n this.render(false);\n } else {\n this.cursorRow = Math.min(this.options.data.length - 1, this.cursorRow + 1);\n this.render(false);\n }\n }\n }\n}\n"],"names":["SpreadsheetPrompt","Prompt","calculateColWidths","colWidths","options","columns","map","col","width","max","stringWidth","name","data","forEach","row","val","String","key","Math","min","render","_firstRender","output","mode","editMode","ANSI","FG_YELLOW","RESET","FG_BLUE","theme","title","message","DIM","maxScrollRow","length","viewportHeight","cursorRow","scrollRow","termWidth","stdout","currentWidth","visibleCols","i","scrollCol","w","push","headerStr","totalWidth","idx","pad","BOLD","symbols","horizontal","repeat","rowIndex","rowData","rowStr","padEnd","colIndex","isCursor","cursorCol","tempValue","displayVal","truncate","main","UNDERLINE","REVERSE","renderFrame","str","handleInput","char","_key","handleEditInput","handleNavInput","isUp","isDown","isLeft","isRight","isVisible","startEditing","submit","test","initialChar","editable","currentVal","slice","handleMouse","event","action","scroll","rows"],"mappings":";;;;+BAOaA;;;eAAAA;;;sBAPQ;sBACE;uBACD;yBACE;uBAEI;;;;;;;;;;;;;;AAErB,IAAA,AAAMA,oBAAN,MAAMA,0BAA0BC,YAAM;IAkBjCC,qBAAqB;QACzB,IAAI,CAACC,SAAS,GAAG,IAAI,CAACC,OAAO,CAACC,OAAO,CAACC,GAAG,CAACC,CAAAA;YACtC,IAAIA,IAAIC,KAAK,EAAE,OAAOD,IAAIC,KAAK;YAE/B,0CAA0C;YAC1C,IAAIC,MAAMC,IAAAA,kBAAW,EAACH,IAAII,IAAI;YAC9B,IAAI,CAACP,OAAO,CAACQ,IAAI,CAACC,OAAO,CAACC,CAAAA;gBACtB,MAAMC,MAAMC,OAAOF,GAAG,CAACP,IAAIU,GAAG,CAAC,IAAI;gBACnCR,MAAMS,KAAKT,GAAG,CAACA,KAAKC,IAAAA,kBAAW,EAACK;YACpC;YACA,OAAOG,KAAKC,GAAG,CAACV,MAAM,GAAG,KAAK,kBAAkB;QACpD;IACJ;IAEUW,OAAOC,YAAqB,EAAE;QACpC,IAAIC,SAAS;QAEb,QAAQ;QACR,MAAMC,OAAO,IAAI,CAACC,QAAQ,GAAG,GAAGC,UAAI,CAACC,SAAS,CAAC,MAAM,EAAED,UAAI,CAACE,KAAK,EAAE,GAAG,GAAGF,UAAI,CAACG,OAAO,CAAC,KAAK,EAAEH,UAAI,CAACE,KAAK,EAAE;QACzGL,UAAU,GAAGO,YAAK,CAACC,KAAK,GAAG,IAAI,CAAC1B,OAAO,CAAC2B,OAAO,CAAC,CAAC,EAAER,OAAOE,UAAI,CAACE,KAAK,CAAC,EAAE,CAAC;QAExEL,UAAU,GAAGG,UAAI,CAACO,GAAG,CAAC,6CAA6C,EAAEP,UAAI,CAACE,KAAK,CAAC,EAAE,CAAC;QAEnF,wBAAwB;QACxB,MAAMM,eAAef,KAAKT,GAAG,CAAC,GAAG,IAAI,CAACL,OAAO,CAACQ,IAAI,CAACsB,MAAM,GAAG,IAAI,CAACC,cAAc;QAC/E,IAAI,IAAI,CAACC,SAAS,GAAG,IAAI,CAACC,SAAS,EAAE,IAAI,CAACA,SAAS,GAAG,IAAI,CAACD,SAAS;QACpE,IAAI,IAAI,CAACA,SAAS,IAAI,IAAI,CAACC,SAAS,GAAG,IAAI,CAACF,cAAc,EAAE,IAAI,CAACE,SAAS,GAAG,IAAI,CAACD,SAAS,GAAG,IAAI,CAACD,cAAc,GAAG;QACpH,IAAI,CAACE,SAAS,GAAGnB,KAAKC,GAAG,CAACc,cAAc,IAAI,CAACI,SAAS;QAEtD,+CAA+C;QAC/C,MAAMC,YAAY,IAAI,CAACC,MAAM,CAAClC,OAAO,IAAI;QACzC,IAAImC,eAAe,GAAG,uCAAuC;QAC7D,MAAMC,cAAwB,EAAE;QAEhC,IAAK,IAAIC,IAAI,IAAI,CAACC,SAAS,EAAED,IAAI,IAAI,CAACtC,OAAO,CAACC,OAAO,CAAC6B,MAAM,EAAEQ,IAAK;YAC/D,MAAME,IAAI,IAAI,CAACzC,SAAS,CAACuC,EAAE;YAC3B,4CAA4C;YAC5C,0EAA0E;YAC1E,IAAIF,eAAeI,IAAI,IAAIN,aAAaG,YAAYP,MAAM,GAAG,GAAG;YAEhEO,YAAYI,IAAI,CAACH;YACjBF,gBAAgBI,IAAI;QACxB;QAEA,gBAAgB;QAChB,IAAIE,YAAY;QAChB,IAAIC,aAAa;QAEjBN,YAAY5B,OAAO,CAACmC,CAAAA;YAChB,MAAMzC,MAAM,IAAI,CAACH,OAAO,CAACC,OAAO,CAAC2C,IAAI;YACrC,MAAMJ,IAAI,IAAI,CAACzC,SAAS,CAAC6C,IAAI;YAC7BF,aAAa,IAAI,CAACG,GAAG,CAAC1C,IAAII,IAAI,EAAEiC,KAAK;YACrCG,cAAcH,IAAI;QACtB;QAEAtB,UAAU,GAAGG,UAAI,CAACyB,IAAI,GAAGJ,YAAYrB,UAAI,CAACE,KAAK,CAAC,EAAE,CAAC;QACnDL,UAAU,GAAGG,UAAI,CAACO,GAAG,CAAC,GAAG,EAAEmB,gBAAO,CAACC,UAAU,CAACC,MAAM,CAACnC,KAAKT,GAAG,CAAC,GAAGsC,aAAa,MAAMtB,UAAI,CAACE,KAAK,CAAC,EAAE,CAAC;QAElG,cAAc;QACd,IAAK,IAAIe,IAAI,GAAGA,IAAI,IAAI,CAACP,cAAc,EAAEO,IAAK;YAC1C,MAAMY,WAAW,IAAI,CAACjB,SAAS,GAAGK;YAClC,IAAIY,YAAY,IAAI,CAAClD,OAAO,CAACQ,IAAI,CAACsB,MAAM,EAAE;YAE1C,MAAMqB,UAAU,IAAI,CAACnD,OAAO,CAACQ,IAAI,CAAC0C,SAAS;YAC3C,aAAa;YACb,IAAIE,SAAS,GAAG/B,UAAI,CAACO,GAAG,GAAGhB,OAAOsC,WAAW,GAAGG,MAAM,CAAC,KAAKhC,UAAI,CAACE,KAAK,EAAE;YAExEc,YAAY5B,OAAO,CAAC6C,CAAAA;gBAChB,MAAMnD,MAAM,IAAI,CAACH,OAAO,CAACC,OAAO,CAACqD,SAAS;gBAC1C,MAAMd,IAAI,IAAI,CAACzC,SAAS,CAACuD,SAAS;gBAClC,MAAMC,WAAW,AAACL,aAAa,IAAI,CAAClB,SAAS,IAAMsB,aAAa,IAAI,CAACE,SAAS;gBAE9E,IAAI7C,MAAMC,OAAOuC,OAAO,CAAChD,IAAIU,GAAG,CAAC,IAAI;gBACrC,IAAI0C,YAAY,IAAI,CAACnC,QAAQ,EAAE;oBAC3BT,MAAM,IAAI,CAAC8C,SAAS;gBACxB;gBAEA,IAAIC,aAAa,IAAI,CAACC,QAAQ,CAAChD,KAAK6B;gBACpCkB,aAAa,IAAI,CAACb,GAAG,CAACa,YAAYlB;gBAElC,IAAIe,UAAU;oBACV,IAAI,IAAI,CAACnC,QAAQ,EAAE;wBACf,oBAAoB;wBACpBsC,aAAa,GAAGjC,YAAK,CAACmC,IAAI,GAAGvC,UAAI,CAACwC,SAAS,GAAGH,aAAarC,UAAI,CAACE,KAAK,EAAE;oBAC3E,OAAO;wBACH,sBAAsB;wBACtBmC,aAAa,GAAGrC,UAAI,CAACyC,OAAO,GAAGJ,aAAarC,UAAI,CAACE,KAAK,EAAE;oBAC5D;gBACJ;gBAEA6B,UAAUM,aAAa;YAC3B;YACAxC,UAAUkC,SAAS;QACvB;QAEA,kBAAkB;QAClB,IAAI,IAAI,CAAChC,QAAQ,EAAE;YACfF,UAAU,CAAC,EAAE,EAAEG,UAAI,CAACC,SAAS,CAAC,cAAc,EAAE,IAAI,CAACU,SAAS,GAAG,EAAE,EAAE,EAAE,IAAI,CAAChC,OAAO,CAACC,OAAO,CAAC,IAAI,CAACuD,SAAS,CAAC,CAACjD,IAAI,CAAC,uBAAuB,EAAEc,UAAI,CAACE,KAAK,EAAE;QACxJ,OAAO;YACHL,UAAU,CAAC,EAAE,EAAEG,UAAI,CAACO,GAAG,CAAC,iCAAiC,EAAEP,UAAI,CAACE,KAAK,EAAE;QAC3E;QAEA,IAAI,CAACwC,WAAW,CAAC7C;IACrB;IAEQ2B,IAAImB,GAAW,EAAE5D,KAAa,EAAU;QAC5C,MAAMoC,IAAIlC,IAAAA,kBAAW,EAAC0D;QACtB,IAAIxB,KAAKpC,OAAO,OAAO4D;QACvB,OAAOA,MAAM,IAAIf,MAAM,CAAC7C,QAAQoC;IACpC;IAEUyB,YAAYC,IAAY,EAAEC,IAAY,EAAE;QAC9C,IAAI,IAAI,CAAC/C,QAAQ,EAAE;YACf,IAAI,CAACgD,eAAe,CAACF;QACzB,OAAO;YACH,IAAI,CAACG,cAAc,CAACH;QACxB;IACJ;IAEQG,eAAeH,IAAY,EAAE;QACjC,aAAa;QACb,IAAI,IAAI,CAACI,IAAI,CAACJ,OAAO;YACjB,IAAI,CAAClC,SAAS,GAAGlB,KAAKT,GAAG,CAAC,GAAG,IAAI,CAAC2B,SAAS,GAAG;YAC9C,IAAI,CAAChB,MAAM,CAAC;YACZ;QACJ;QACA,IAAI,IAAI,CAACuD,MAAM,CAACL,OAAO;YACnB,IAAI,CAAClC,SAAS,GAAGlB,KAAKC,GAAG,CAAC,IAAI,CAACf,OAAO,CAACQ,IAAI,CAACsB,MAAM,GAAG,GAAG,IAAI,CAACE,SAAS,GAAG;YACzE,IAAI,CAAChB,MAAM,CAAC;YACZ;QACJ;QACA,IAAI,IAAI,CAACwD,MAAM,CAACN,SAASA,SAAS,UAAU;YACxC,IAAI,CAACV,SAAS,GAAG1C,KAAKT,GAAG,CAAC,GAAG,IAAI,CAACmD,SAAS,GAAG;YAC9C,IAAI,IAAI,CAACA,SAAS,GAAG,IAAI,CAACjB,SAAS,EAAE;gBACjC,IAAI,CAACA,SAAS,GAAG,IAAI,CAACiB,SAAS;YACnC;YACA,IAAI,CAACxC,MAAM,CAAC;YACZ;QACJ;QACA,IAAI,IAAI,CAACyD,OAAO,CAACP,SAASA,SAAS,MAAM;YACrC,IAAI,CAACV,SAAS,GAAG1C,KAAKC,GAAG,CAAC,IAAI,CAACf,OAAO,CAACC,OAAO,CAAC6B,MAAM,GAAG,GAAG,IAAI,CAAC0B,SAAS,GAAG;YAE5E,0CAA0C;YAC1C,+CAA+C;YAC/C,MAAO,KAAM;gBACT,MAAMtB,YAAY,IAAI,CAACC,MAAM,CAAClC,OAAO,IAAI;gBACzC,IAAIuC,IAAI,GAAG,UAAU;gBACrB,IAAIkC,YAAY;gBAEhB,IAAK,IAAIpC,IAAI,IAAI,CAACC,SAAS,EAAED,IAAI,IAAI,CAACtC,OAAO,CAACC,OAAO,CAAC6B,MAAM,EAAEQ,IAAK;oBAC/DE,KAAK,IAAI,CAACzC,SAAS,CAACuC,EAAE,GAAG;oBACzB,IAAIE,IAAIN,aAAaI,IAAI,IAAI,CAACC,SAAS,EAAE,OAAO,qBAAqB;oBAErE,IAAID,MAAM,IAAI,CAACkB,SAAS,EAAE;wBACtBkB,YAAY;wBACZ;oBACJ;gBACJ;gBAEA,IAAIA,WAAW;gBACf,IAAI,CAACnC,SAAS;gBACd,IAAI,IAAI,CAACA,SAAS,GAAG,IAAI,CAACiB,SAAS,EAAE;oBACjC,IAAI,CAACjB,SAAS,GAAG,IAAI,CAACiB,SAAS;oBAC/B;gBACJ;YACJ;YAEA,IAAI,CAACxC,MAAM,CAAC;YACZ;QACJ;QAEA,kBAAkB;QAClB,IAAIkD,SAAS,QAAQA,SAAS,MAAM;YAChC,IAAI,CAACS,YAAY;YACjB;QACJ;QAEA,YAAY;QACZ,IAAIT,SAAS,KAAK;YACd,IAAI,CAACU,MAAM,CAAC,IAAI,CAAC5E,OAAO,CAACQ,IAAI;YAC7B;QACJ;QAEA,2BAA2B;QAE3B,wBAAwB;QACxB,IAAI,CAAC,eAAeqE,IAAI,CAACX,OAAO;YAC5B,IAAI,CAACS,YAAY,CAACT;QACtB;IACJ;IAEQS,aAAaG,cAAsB,EAAE,EAAE;QAC3C,MAAM3E,MAAM,IAAI,CAACH,OAAO,CAACC,OAAO,CAAC,IAAI,CAACuD,SAAS,CAAC;QAChD,IAAIrD,IAAI4E,QAAQ,KAAK,OAAO;QAE5B,IAAI,CAAC3D,QAAQ,GAAG;QAChB,MAAM4D,aAAapE,OAAO,IAAI,CAACZ,OAAO,CAACQ,IAAI,CAAC,IAAI,CAACwB,SAAS,CAAC,CAAC7B,IAAIU,GAAG,CAAC,IAAI;QACxE,IAAI,CAAC4C,SAAS,GAAGqB,cAAcA,cAAcE;QAC7C,IAAI,CAAChE,MAAM,CAAC;IAChB;IAEQoD,gBAAgBF,IAAY,EAAE;QAClC,IAAIA,SAAS,QAAQA,SAAS,MAAM;YAChC,OAAO;YACP,MAAM/D,MAAM,IAAI,CAACH,OAAO,CAACC,OAAO,CAAC,IAAI,CAACuD,SAAS,CAAC;YAChD,IAAI,CAACxD,OAAO,CAACQ,IAAI,CAAC,IAAI,CAACwB,SAAS,CAAC,CAAC7B,IAAIU,GAAG,CAAC,GAAG,IAAI,CAAC4C,SAAS;YAC3D,IAAI,CAACrC,QAAQ,GAAG;YAChB,+BAA+B;YAC/B,IAAI,CAACtB,kBAAkB,IAAI,gBAAgB;YAC3C,IAAI,CAACkB,MAAM,CAAC;YACZ;QACJ;QAEA,IAAIkD,SAAS,QAAQ;YACjB,IAAI,CAAC9C,QAAQ,GAAG;YAChB,IAAI,CAACJ,MAAM,CAAC;YACZ;QACJ;QAEA,IAAIkD,SAAS,UAAUA,SAAS,MAAM;YAClC,IAAI,CAACT,SAAS,GAAG,IAAI,CAACA,SAAS,CAACwB,KAAK,CAAC,GAAG,CAAC;YAC1C,IAAI,CAACjE,MAAM,CAAC;YACZ;QACJ;QAEA,IAAI,CAAC,eAAe6D,IAAI,CAACX,OAAO;YAC5B,IAAI,CAACT,SAAS,IAAIS;YAClB,IAAI,CAAClD,MAAM,CAAC;QAChB;IACJ;IAEUkE,YAAYC,KAAiB,EAAE;QACrC,IAAIA,MAAMC,MAAM,KAAK,UAAU;YAC3B,IAAID,MAAME,MAAM,KAAK,MAAM;gBACvB,IAAI,CAACrD,SAAS,GAAGlB,KAAKT,GAAG,CAAC,GAAG,IAAI,CAAC2B,SAAS,GAAG;gBAC9C,IAAI,CAAChB,MAAM,CAAC;YAChB,OAAO;gBACH,IAAI,CAACgB,SAAS,GAAGlB,KAAKC,GAAG,CAAC,IAAI,CAACf,OAAO,CAACQ,IAAI,CAACsB,MAAM,GAAG,GAAG,IAAI,CAACE,SAAS,GAAG;gBACzE,IAAI,CAAChB,MAAM,CAAC;YAChB;QACJ;IACJ;IAvPA,YAAYhB,OAA2B,CAAE;QACrC,KAAK,CAACA,UAZV,uBAAQgC,aAAoB,IAC5B,uBAAQwB,aAAoB,IAC5B,uBAAQvB,aAAoB,IAC5B,uBAAQM,aAAoB,IAE5B,uBAAQnB,YAAoB,QAC5B,uBAAQqC,aAAoB,KAE5B,uBAAQ1D,aAAsB,EAAE,GAChC,uBAAQgC,kBAAR,KAAA;QAII,IAAI,CAACA,cAAc,GAAG/B,QAAQsF,IAAI,IAAI;QACtC,IAAI,CAACxF,kBAAkB;IAC3B;AAoPJ"}
|