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,17 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "FuzzyMultiColumnPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return FuzzyMultiColumnPrompt;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _multicolumnselect = require("./multi-column-select");
|
|
12
|
+
const _theme = require("../theme");
|
|
13
|
+
const _ansi = require("../ansi");
|
|
14
|
+
const _utils = require("../utils");
|
|
15
|
+
const _symbols = require("../symbols");
|
|
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;
|
|
14
26
|
}
|
|
27
|
+
return obj;
|
|
28
|
+
}
|
|
29
|
+
let FuzzyMultiColumnPrompt = class FuzzyMultiColumnPrompt extends _multicolumnselect.MultiColumnSelectPrompt {
|
|
15
30
|
getFilteredChoices() {
|
|
16
31
|
return this.filteredResults || this.options.choices;
|
|
17
32
|
}
|
|
@@ -29,13 +44,11 @@ class FuzzyMultiColumnPrompt extends multi_column_select_1.MultiColumnSelectProm
|
|
|
29
44
|
this.searchBuffer += char;
|
|
30
45
|
// Check if debounce is needed
|
|
31
46
|
if (this.options.choices.length > 1000) {
|
|
32
|
-
if (this.debounceTimer)
|
|
33
|
-
|
|
34
|
-
this.debounceTimer = setTimeout(() => {
|
|
47
|
+
if (this.debounceTimer) clearTimeout(this.debounceTimer);
|
|
48
|
+
this.debounceTimer = setTimeout(()=>{
|
|
35
49
|
this.performSearch();
|
|
36
50
|
}, 150); // 150ms debounce
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
51
|
+
} else {
|
|
39
52
|
this.performSearch();
|
|
40
53
|
}
|
|
41
54
|
return;
|
|
@@ -45,17 +58,17 @@ class FuzzyMultiColumnPrompt extends multi_column_select_1.MultiColumnSelectProm
|
|
|
45
58
|
performSearch() {
|
|
46
59
|
if (!this.searchBuffer) {
|
|
47
60
|
this.filteredResults = this.options.choices;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
this.filteredResults = results.map(r
|
|
61
|
+
} else {
|
|
62
|
+
const results = this.options.choices.map((c)=>{
|
|
63
|
+
if (this.isSeparator(c)) return null;
|
|
64
|
+
const match = (0, _utils.fuzzyMatch)(this.searchBuffer, c.title);
|
|
65
|
+
return {
|
|
66
|
+
choice: c,
|
|
67
|
+
match
|
|
68
|
+
};
|
|
69
|
+
}).filter((item)=>item && item.match !== null)// Sort by score descending
|
|
70
|
+
.sort((a, b)=>b.match.score - a.match.score);
|
|
71
|
+
this.filteredResults = results.map((r)=>{
|
|
59
72
|
r.choice._match = r.match;
|
|
60
73
|
return r.choice;
|
|
61
74
|
});
|
|
@@ -66,16 +79,14 @@ class FuzzyMultiColumnPrompt extends multi_column_select_1.MultiColumnSelectProm
|
|
|
66
79
|
highlight(text, indices, isSelected) {
|
|
67
80
|
let output = '';
|
|
68
81
|
const indexSet = new Set(indices);
|
|
69
|
-
for
|
|
82
|
+
for(let i = 0; i < text.length; i++){
|
|
70
83
|
if (indexSet.has(i)) {
|
|
71
84
|
if (isSelected) {
|
|
72
|
-
output += `${
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
output += `${ansi_1.ANSI.BOLD}${ansi_1.ANSI.FG_CYAN}${text[i]}${ansi_1.ANSI.RESET}`;
|
|
85
|
+
output += `${_ansi.ANSI.BOLD}${_ansi.ANSI.FG_WHITE}${text[i]}${_theme.theme.main}`; // Reset to main theme
|
|
86
|
+
} else {
|
|
87
|
+
output += `${_ansi.ANSI.BOLD}${_ansi.ANSI.FG_CYAN}${text[i]}${_ansi.ANSI.RESET}`;
|
|
76
88
|
}
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
89
|
+
} else {
|
|
79
90
|
output += text[i];
|
|
80
91
|
}
|
|
81
92
|
}
|
|
@@ -85,10 +96,10 @@ class FuzzyMultiColumnPrompt extends multi_column_select_1.MultiColumnSelectProm
|
|
|
85
96
|
let output = '';
|
|
86
97
|
const choices = this.getFilteredChoices();
|
|
87
98
|
// Header
|
|
88
|
-
const searchStr = this.searchBuffer ? ` ${
|
|
89
|
-
output += `${
|
|
99
|
+
const searchStr = this.searchBuffer ? ` ${_theme.theme.muted}(Fuzzy: ${this.searchBuffer})${_ansi.ANSI.RESET}` : '';
|
|
100
|
+
output += `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}${searchStr}\n`;
|
|
90
101
|
if (choices.length === 0) {
|
|
91
|
-
output += ` ${
|
|
102
|
+
output += ` ${_theme.theme.muted}No results found${_ansi.ANSI.RESET}`;
|
|
92
103
|
this.renderFrame(output);
|
|
93
104
|
return;
|
|
94
105
|
}
|
|
@@ -98,8 +109,7 @@ class FuzzyMultiColumnPrompt extends multi_column_select_1.MultiColumnSelectProm
|
|
|
98
109
|
const currentRow = Math.floor(this.selectedIndex / this.cols);
|
|
99
110
|
if (currentRow < this.scrollTop) {
|
|
100
111
|
this.scrollTop = currentRow;
|
|
101
|
-
}
|
|
102
|
-
else if (currentRow >= this.scrollTop + this.pageSize) {
|
|
112
|
+
} else if (currentRow >= this.scrollTop + this.pageSize) {
|
|
103
113
|
this.scrollTop = currentRow - this.pageSize + 1;
|
|
104
114
|
}
|
|
105
115
|
// Edge case: if list shrinks
|
|
@@ -108,16 +118,15 @@ class FuzzyMultiColumnPrompt extends multi_column_select_1.MultiColumnSelectProm
|
|
|
108
118
|
}
|
|
109
119
|
const startRow = this.scrollTop;
|
|
110
120
|
const endRow = Math.min(totalRows, startRow + this.pageSize);
|
|
111
|
-
for
|
|
121
|
+
for(let r = startRow; r < endRow; r++){
|
|
112
122
|
let rowStr = '';
|
|
113
|
-
for
|
|
123
|
+
for(let c = 0; c < this.cols; c++){
|
|
114
124
|
const idx = r * this.cols + c;
|
|
115
|
-
if (idx >= choices.length)
|
|
116
|
-
break;
|
|
125
|
+
if (idx >= choices.length) break;
|
|
117
126
|
const choice = choices[idx];
|
|
118
127
|
// Truncate if needed
|
|
119
128
|
let title = choice.title || '';
|
|
120
|
-
if ((0,
|
|
129
|
+
if ((0, _utils.stringWidth)(title) > this.colWidth - 3) {
|
|
121
130
|
title = title.slice(0, this.colWidth - 4) + '…';
|
|
122
131
|
}
|
|
123
132
|
const match = choice._match;
|
|
@@ -127,13 +136,12 @@ class FuzzyMultiColumnPrompt extends multi_column_select_1.MultiColumnSelectProm
|
|
|
127
136
|
}
|
|
128
137
|
let cellContent = '';
|
|
129
138
|
if (isSelected) {
|
|
130
|
-
cellContent = `${
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
139
|
+
cellContent = `${_theme.theme.main}${_symbols.symbols.pointer} ${title}${_ansi.ANSI.RESET}`;
|
|
140
|
+
} else {
|
|
133
141
|
cellContent = ` ${title}`;
|
|
134
142
|
}
|
|
135
143
|
// Pad cell to colWidth
|
|
136
|
-
const currentWidth = (0,
|
|
144
|
+
const currentWidth = (0, _utils.stringWidth)(this.stripAnsi(cellContent));
|
|
137
145
|
const padding = Math.max(0, this.colWidth - currentWidth);
|
|
138
146
|
// Add cell to row
|
|
139
147
|
rowStr += cellContent + ' '.repeat(padding);
|
|
@@ -141,9 +149,13 @@ class FuzzyMultiColumnPrompt extends multi_column_select_1.MultiColumnSelectProm
|
|
|
141
149
|
output += rowStr + '\n';
|
|
142
150
|
}
|
|
143
151
|
// Remove trailing newline
|
|
144
|
-
if (output.endsWith('\n'))
|
|
145
|
-
output = output.slice(0, -1);
|
|
152
|
+
if (output.endsWith('\n')) output = output.slice(0, -1);
|
|
146
153
|
this.renderFrame(output);
|
|
147
154
|
}
|
|
148
|
-
|
|
149
|
-
|
|
155
|
+
constructor(options){
|
|
156
|
+
super(options), _define_property(this, "filteredResults", []), _define_property(this, "debounceTimer", void 0);
|
|
157
|
+
this.filteredResults = this.options.choices;
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
//# sourceMappingURL=fuzzy-multi-column.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/fuzzy-multi-column.ts"],"sourcesContent":["import { MultiColumnSelectPrompt } from './multi-column-select';\nimport { MultiColumnSelectOptions } from '../types';\nimport { theme } from '../theme';\nimport { ANSI } from '../ansi';\nimport { fuzzyMatch, stringWidth } from '../utils';\nimport { symbols } from '../symbols';\n\nexport class FuzzyMultiColumnPrompt<V> extends MultiColumnSelectPrompt<V> {\n private filteredResults: any[] = [];\n private debounceTimer: any;\n\n constructor(options: MultiColumnSelectOptions<V>) {\n super(options);\n this.filteredResults = this.options.choices;\n }\n\n protected getFilteredChoices() {\n return this.filteredResults || this.options.choices;\n }\n\n protected handleInput(char: string) {\n // Backspace\n if (char === '\\u0008' || char === '\\x7f') {\n if (this.searchBuffer.length > 0) {\n this.searchBuffer = this.searchBuffer.slice(0, -1);\n this.performSearch();\n }\n return;\n }\n\n // Intercept typing to add debounce\n if (char.length === 1 && !/^[\\x00-\\x1F]/.test(char) && !char.startsWith('\\x1b')) {\n this.searchBuffer += char;\n\n // Check if debounce is needed\n if (this.options.choices.length > 1000) {\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => {\n this.performSearch();\n }, 150); // 150ms debounce\n } else {\n this.performSearch();\n }\n return;\n }\n\n super.handleInput(char);\n }\n\n private performSearch() {\n if (!this.searchBuffer) {\n this.filteredResults = this.options.choices;\n } else {\n const results = this.options.choices.map(c => {\n if (this.isSeparator(c)) return null;\n const match = fuzzyMatch(this.searchBuffer, (c as any).title);\n return { choice: c, match };\n }).filter(item => item && item.match !== null)\n // Sort by score descending\n .sort((a, b) => b!.match!.score - a!.match!.score);\n\n this.filteredResults = results.map(r => {\n (r!.choice as any)._match = r!.match;\n return r!.choice;\n });\n }\n\n this.selectedIndex = 0;\n this.render(false);\n }\n\n private highlight(text: string, indices: number[], isSelected: boolean): string {\n let output = '';\n const indexSet = new Set(indices);\n for (let i = 0; i < text.length; i++) {\n if (indexSet.has(i)) {\n if (isSelected) {\n output += `${ANSI.BOLD}${ANSI.FG_WHITE}${text[i]}${theme.main}`; // Reset to main theme\n } else {\n output += `${ANSI.BOLD}${ANSI.FG_CYAN}${text[i]}${ANSI.RESET}`;\n }\n } else {\n output += text[i];\n }\n }\n return output;\n }\n\n protected render(_firstRender: boolean) {\n let output = '';\n const choices = this.getFilteredChoices();\n\n // Header\n const searchStr = this.searchBuffer ? ` ${theme.muted}(Fuzzy: ${this.searchBuffer})${ANSI.RESET}` : '';\n output += `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}${searchStr}\\n`;\n\n if (choices.length === 0) {\n output += ` ${theme.muted}No results found${ANSI.RESET}`;\n this.renderFrame(output);\n return;\n }\n\n // Grid Render\n const totalRows = Math.ceil(choices.length / this.cols);\n\n // Adjust Scroll\n const currentRow = Math.floor(this.selectedIndex / this.cols);\n if (currentRow < this.scrollTop) {\n this.scrollTop = currentRow;\n } else if (currentRow >= this.scrollTop + this.pageSize) {\n this.scrollTop = currentRow - this.pageSize + 1;\n }\n\n // Edge case: if list shrinks\n if (this.scrollTop > totalRows - 1) {\n this.scrollTop = Math.max(0, totalRows - this.pageSize);\n }\n\n const startRow = this.scrollTop;\n const endRow = Math.min(totalRows, startRow + this.pageSize);\n\n for (let r = startRow; r < endRow; r++) {\n let rowStr = '';\n for (let c = 0; c < this.cols; c++) {\n const idx = r * this.cols + c;\n if (idx >= choices.length) break;\n\n const choice = choices[idx];\n\n // Truncate if needed\n let title = (choice as any).title || '';\n if (stringWidth(title) > this.colWidth - 3) {\n title = title.slice(0, this.colWidth - 4) + '…';\n }\n\n const match = (choice as any)._match;\n const isSelected = idx === this.selectedIndex;\n\n if (match && this.searchBuffer) {\n title = this.highlight(title, match.indices, isSelected);\n }\n\n let cellContent = '';\n if (isSelected) {\n cellContent = `${theme.main}${symbols.pointer} ${title}${ANSI.RESET}`;\n } else {\n cellContent = ` ${title}`;\n }\n\n // Pad cell to colWidth\n const currentWidth = stringWidth(this.stripAnsi(cellContent));\n const padding = Math.max(0, this.colWidth - currentWidth);\n\n // Add cell to row\n rowStr += cellContent + ' '.repeat(padding);\n }\n output += rowStr + '\\n';\n }\n\n // Remove trailing newline\n if (output.endsWith('\\n')) output = output.slice(0, -1);\n\n this.renderFrame(output);\n }\n}\n"],"names":["FuzzyMultiColumnPrompt","MultiColumnSelectPrompt","getFilteredChoices","filteredResults","options","choices","handleInput","char","searchBuffer","length","slice","performSearch","test","startsWith","debounceTimer","clearTimeout","setTimeout","results","map","c","isSeparator","match","fuzzyMatch","title","choice","filter","item","sort","a","b","score","r","_match","selectedIndex","render","highlight","text","indices","isSelected","output","indexSet","Set","i","has","ANSI","BOLD","FG_WHITE","theme","main","FG_CYAN","RESET","_firstRender","searchStr","muted","success","message","renderFrame","totalRows","Math","ceil","cols","currentRow","floor","scrollTop","pageSize","max","startRow","endRow","min","rowStr","idx","stringWidth","colWidth","cellContent","symbols","pointer","currentWidth","stripAnsi","padding","repeat","endsWith"],"mappings":"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"}
|
|
@@ -1,17 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "FuzzySelectPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return FuzzySelectPrompt;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _select = require("./select");
|
|
12
|
+
const _theme = require("../theme");
|
|
13
|
+
const _ansi = require("../ansi");
|
|
14
|
+
const _utils = require("../utils");
|
|
15
|
+
const _symbols = require("../symbols");
|
|
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;
|
|
14
26
|
}
|
|
27
|
+
return obj;
|
|
28
|
+
}
|
|
29
|
+
let FuzzySelectPrompt = class FuzzySelectPrompt extends _select.SelectPrompt {
|
|
15
30
|
getFilteredChoices() {
|
|
16
31
|
// Safety check: this.filteredResults might be undefined if called from super() constructor
|
|
17
32
|
return this.filteredResults || this.options.choices;
|
|
@@ -30,13 +45,11 @@ class FuzzySelectPrompt extends select_1.SelectPrompt {
|
|
|
30
45
|
this.searchBuffer += char;
|
|
31
46
|
// Check if debounce is needed
|
|
32
47
|
if (this.options.choices.length > 1000) {
|
|
33
|
-
if (this.debounceTimer)
|
|
34
|
-
|
|
35
|
-
this.debounceTimer = setTimeout(() => {
|
|
48
|
+
if (this.debounceTimer) clearTimeout(this.debounceTimer);
|
|
49
|
+
this.debounceTimer = setTimeout(()=>{
|
|
36
50
|
this.performSearch();
|
|
37
51
|
}, 150); // 150ms debounce
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
52
|
+
} else {
|
|
40
53
|
this.performSearch();
|
|
41
54
|
}
|
|
42
55
|
return; // Skip super.handleInput for typing
|
|
@@ -46,17 +59,17 @@ class FuzzySelectPrompt extends select_1.SelectPrompt {
|
|
|
46
59
|
performSearch() {
|
|
47
60
|
if (!this.searchBuffer) {
|
|
48
61
|
this.filteredResults = this.options.choices;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
this.filteredResults = results.map(r
|
|
62
|
+
} else {
|
|
63
|
+
const results = this.options.choices.map((c)=>{
|
|
64
|
+
if (this.isSeparator(c)) return null;
|
|
65
|
+
const match = (0, _utils.fuzzyMatch)(this.searchBuffer, c.title);
|
|
66
|
+
return {
|
|
67
|
+
choice: c,
|
|
68
|
+
match
|
|
69
|
+
};
|
|
70
|
+
}).filter((item)=>item && item.match !== null)// Sort by score descending
|
|
71
|
+
.sort((a, b)=>b.match.score - a.match.score);
|
|
72
|
+
this.filteredResults = results.map((r)=>{
|
|
60
73
|
r.choice._match = r.match;
|
|
61
74
|
return r.choice;
|
|
62
75
|
});
|
|
@@ -67,16 +80,14 @@ class FuzzySelectPrompt extends select_1.SelectPrompt {
|
|
|
67
80
|
highlight(text, indices, isSelected) {
|
|
68
81
|
let output = '';
|
|
69
82
|
const indexSet = new Set(indices);
|
|
70
|
-
for
|
|
83
|
+
for(let i = 0; i < text.length; i++){
|
|
71
84
|
if (indexSet.has(i)) {
|
|
72
85
|
if (isSelected) {
|
|
73
|
-
output += `${
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
output += `${ansi_1.ANSI.BOLD}${ansi_1.ANSI.FG_CYAN}${text[i]}${ansi_1.ANSI.RESET}`;
|
|
86
|
+
output += `${_ansi.ANSI.BOLD}${_ansi.ANSI.FG_WHITE}${text[i]}${_theme.theme.main}`; // Reset to main theme
|
|
87
|
+
} else {
|
|
88
|
+
output += `${_ansi.ANSI.BOLD}${_ansi.ANSI.FG_CYAN}${text[i]}${_ansi.ANSI.RESET}`;
|
|
77
89
|
}
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
90
|
+
} else {
|
|
80
91
|
output += text[i];
|
|
81
92
|
}
|
|
82
93
|
}
|
|
@@ -88,29 +99,25 @@ class FuzzySelectPrompt extends select_1.SelectPrompt {
|
|
|
88
99
|
// Adjust Scroll Top
|
|
89
100
|
if (this.selectedIndex < this.scrollTop) {
|
|
90
101
|
this.scrollTop = this.selectedIndex;
|
|
91
|
-
}
|
|
92
|
-
else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
|
|
102
|
+
} else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
|
|
93
103
|
this.scrollTop = this.selectedIndex - this.pageSize + 1;
|
|
94
104
|
}
|
|
95
105
|
if (this.scrollTop > choices.length - 1) {
|
|
96
106
|
this.scrollTop = Math.max(0, choices.length - this.pageSize);
|
|
97
107
|
}
|
|
98
108
|
// Header
|
|
99
|
-
const searchStr = this.searchBuffer ? ` ${
|
|
100
|
-
output += `${
|
|
109
|
+
const searchStr = this.searchBuffer ? ` ${_theme.theme.muted}(Fuzzy: ${this.searchBuffer})${_ansi.ANSI.RESET}` : '';
|
|
110
|
+
output += `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}${searchStr}\n`;
|
|
101
111
|
if (choices.length === 0) {
|
|
102
|
-
output += ` ${
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
112
|
+
output += ` ${_theme.theme.muted}No results found${_ansi.ANSI.RESET}`;
|
|
113
|
+
} else {
|
|
105
114
|
const visibleChoices = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);
|
|
106
|
-
visibleChoices.forEach((choice, index)
|
|
115
|
+
visibleChoices.forEach((choice, index)=>{
|
|
107
116
|
const actualIndex = this.scrollTop + index;
|
|
108
|
-
if (index > 0)
|
|
109
|
-
output += '\n';
|
|
117
|
+
if (index > 0) output += '\n';
|
|
110
118
|
if (this.isSeparator(choice)) {
|
|
111
|
-
output += ` ${
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
119
|
+
output += ` ${_ansi.ANSI.DIM}${choice.text || _symbols.symbols.line.repeat(8)}${_ansi.ANSI.RESET}`;
|
|
120
|
+
} else {
|
|
114
121
|
let title = choice.title;
|
|
115
122
|
const match = choice._match;
|
|
116
123
|
const isSelected = actualIndex === this.selectedIndex;
|
|
@@ -118,13 +125,12 @@ class FuzzySelectPrompt extends select_1.SelectPrompt {
|
|
|
118
125
|
title = this.highlight(title, match.indices, isSelected);
|
|
119
126
|
}
|
|
120
127
|
if (isSelected) {
|
|
121
|
-
output += `${
|
|
128
|
+
output += `${_theme.theme.main}${_symbols.symbols.pointer} ${title}${_ansi.ANSI.RESET}`;
|
|
122
129
|
if (match && this.searchBuffer) {
|
|
123
|
-
|
|
124
|
-
|
|
130
|
+
// Show score
|
|
131
|
+
// output += ` ${theme.muted}(${Math.round(match.score)})${ANSI.RESET}`;
|
|
125
132
|
}
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
133
|
+
} else {
|
|
128
134
|
output += ` ${title}`;
|
|
129
135
|
}
|
|
130
136
|
}
|
|
@@ -132,5 +138,10 @@ class FuzzySelectPrompt extends select_1.SelectPrompt {
|
|
|
132
138
|
}
|
|
133
139
|
this.renderFrame(output);
|
|
134
140
|
}
|
|
135
|
-
|
|
136
|
-
|
|
141
|
+
constructor(options){
|
|
142
|
+
super(options), _define_property(this, "filteredResults", []), _define_property(this, "debounceTimer", void 0);
|
|
143
|
+
this.filteredResults = this.options.choices;
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
//# sourceMappingURL=fuzzy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/fuzzy.ts"],"sourcesContent":["import { SelectPrompt } from './select';\nimport { FuzzySelectOptions } from '../types';\nimport { theme } from '../theme';\nimport { ANSI } from '../ansi';\nimport { fuzzyMatch } from '../utils';\nimport { symbols } from '../symbols';\n\nexport class FuzzySelectPrompt<V> extends SelectPrompt<V, FuzzySelectOptions<V>> {\n private filteredResults: any[] = [];\n private debounceTimer: any;\n\n constructor(options: FuzzySelectOptions<V>) {\n super(options);\n this.filteredResults = this.options.choices;\n }\n\n protected getFilteredChoices() {\n // Safety check: this.filteredResults might be undefined if called from super() constructor\n return this.filteredResults || this.options.choices;\n }\n\n protected handleInput(char: string) {\n // Backspace\n if (char === '\\u0008' || char === '\\x7f') {\n if (this.searchBuffer.length > 0) {\n this.searchBuffer = this.searchBuffer.slice(0, -1);\n this.performSearch();\n }\n return;\n }\n\n // Intercept typing to add debounce\n if (char.length === 1 && !/^[\\x00-\\x1F]/.test(char) && !char.startsWith('\\x1b')) {\n this.searchBuffer += char;\n\n // Check if debounce is needed\n if (this.options.choices.length > 1000) {\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => {\n this.performSearch();\n }, 150); // 150ms debounce\n } else {\n this.performSearch();\n }\n return; // Skip super.handleInput for typing\n }\n\n super.handleInput(char);\n }\n\n private performSearch() {\n if (!this.searchBuffer) {\n this.filteredResults = this.options.choices;\n } else {\n const results = this.options.choices.map(c => {\n if (this.isSeparator(c)) return null;\n const match = fuzzyMatch(this.searchBuffer, (c as any).title);\n return { choice: c, match };\n }).filter(item => item && item.match !== null)\n // Sort by score descending\n .sort((a, b) => b!.match!.score - a!.match!.score);\n\n this.filteredResults = results.map(r => {\n (r!.choice as any)._match = r!.match;\n return r!.choice;\n });\n }\n\n this.selectedIndex = 0;\n this.render(false);\n }\n\n private highlight(text: string, indices: number[], isSelected: boolean): string {\n let output = '';\n const indexSet = new Set(indices);\n for (let i = 0; i < text.length; i++) {\n if (indexSet.has(i)) {\n if (isSelected) {\n output += `${ANSI.BOLD}${ANSI.FG_WHITE}${text[i]}${theme.main}`; // Reset to main theme\n } else {\n output += `${ANSI.BOLD}${ANSI.FG_CYAN}${text[i]}${ANSI.RESET}`;\n }\n } else {\n output += text[i];\n }\n }\n return output;\n }\n\n protected render(_firstRender: boolean) {\n let output = '';\n const choices = this.getFilteredChoices();\n\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 if (this.scrollTop > choices.length - 1) {\n this.scrollTop = Math.max(0, choices.length - this.pageSize);\n }\n\n // Header\n const searchStr = this.searchBuffer ? ` ${theme.muted}(Fuzzy: ${this.searchBuffer})${ANSI.RESET}` : '';\n output += `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}${searchStr}\\n`;\n\n if (choices.length === 0) {\n output += ` ${theme.muted}No results found${ANSI.RESET}`;\n } else {\n const visibleChoices = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);\n\n visibleChoices.forEach((choice, index) => {\n const actualIndex = this.scrollTop + index;\n if (index > 0) output += '\\n';\n\n if (this.isSeparator(choice)) {\n output += ` ${ANSI.DIM}${(choice as any).text || symbols.line.repeat(8)}${ANSI.RESET}`;\n } else {\n let title = (choice as any).title;\n const match = (choice as any)._match;\n const isSelected = actualIndex === this.selectedIndex;\n\n if (match && this.searchBuffer) {\n title = this.highlight(title, match.indices, isSelected);\n }\n\n if (isSelected) {\n output += `${theme.main}${symbols.pointer} ${title}${ANSI.RESET}`;\n if (match && this.searchBuffer) {\n // Show score\n // output += ` ${theme.muted}(${Math.round(match.score)})${ANSI.RESET}`;\n }\n } else {\n output += ` ${title}`;\n }\n }\n });\n }\n\n this.renderFrame(output);\n }\n}\n"],"names":["FuzzySelectPrompt","SelectPrompt","getFilteredChoices","filteredResults","options","choices","handleInput","char","searchBuffer","length","slice","performSearch","test","startsWith","debounceTimer","clearTimeout","setTimeout","results","map","c","isSeparator","match","fuzzyMatch","title","choice","filter","item","sort","a","b","score","r","_match","selectedIndex","render","highlight","text","indices","isSelected","output","indexSet","Set","i","has","ANSI","BOLD","FG_WHITE","theme","main","FG_CYAN","RESET","_firstRender","scrollTop","pageSize","Math","max","searchStr","muted","success","message","visibleChoices","forEach","index","actualIndex","DIM","symbols","line","repeat","pointer","renderFrame"],"mappings":";;;;+BAOaA;;;eAAAA;;;wBAPgB;uBAEP;sBACD;uBACM;yBACH;;;;;;;;;;;;;;AAEjB,IAAA,AAAMA,oBAAN,MAAMA,0BAA6BC,oBAAY;IASxCC,qBAAqB;QAC3B,2FAA2F;QAC3F,OAAO,IAAI,CAACC,eAAe,IAAI,IAAI,CAACC,OAAO,CAACC,OAAO;IACvD;IAEUC,YAAYC,IAAY,EAAE;QAChC,YAAY;QACZ,IAAIA,SAAS,YAAYA,SAAS,QAAQ;YACtC,IAAI,IAAI,CAACC,YAAY,CAACC,MAAM,GAAG,GAAG;gBAC9B,IAAI,CAACD,YAAY,GAAG,IAAI,CAACA,YAAY,CAACE,KAAK,CAAC,GAAG,CAAC;gBAChD,IAAI,CAACC,aAAa;YACtB;YACA;QACJ;QAEA,mCAAmC;QACnC,IAAIJ,KAAKE,MAAM,KAAK,KAAK,CAAC,eAAeG,IAAI,CAACL,SAAS,CAACA,KAAKM,UAAU,CAAC,SAAS;YAC7E,IAAI,CAACL,YAAY,IAAID;YAErB,8BAA8B;YAC9B,IAAI,IAAI,CAACH,OAAO,CAACC,OAAO,CAACI,MAAM,GAAG,MAAM;gBACpC,IAAI,IAAI,CAACK,aAAa,EAAEC,aAAa,IAAI,CAACD,aAAa;gBACvD,IAAI,CAACA,aAAa,GAAGE,WAAW;oBAC5B,IAAI,CAACL,aAAa;gBACtB,GAAG,MAAM,iBAAiB;YAC9B,OAAO;gBACH,IAAI,CAACA,aAAa;YACtB;YACA,QAAQ,oCAAoC;QAChD;QAEA,KAAK,CAACL,YAAYC;IACtB;IAEQI,gBAAgB;QACpB,IAAI,CAAC,IAAI,CAACH,YAAY,EAAE;YACpB,IAAI,CAACL,eAAe,GAAG,IAAI,CAACC,OAAO,CAACC,OAAO;QAC/C,OAAO;YACH,MAAMY,UAAU,IAAI,CAACb,OAAO,CAACC,OAAO,CAACa,GAAG,CAACC,CAAAA;gBACrC,IAAI,IAAI,CAACC,WAAW,CAACD,IAAI,OAAO;gBAChC,MAAME,QAAQC,IAAAA,iBAAU,EAAC,IAAI,CAACd,YAAY,EAAE,AAACW,EAAUI,KAAK;gBAC5D,OAAO;oBAAEC,QAAQL;oBAAGE;gBAAM;YAC9B,GAAGI,MAAM,CAACC,CAAAA,OAAQA,QAAQA,KAAKL,KAAK,KAAK,KACrC,2BAA2B;aAC1BM,IAAI,CAAC,CAACC,GAAGC,IAAMA,EAAGR,KAAK,CAAES,KAAK,GAAGF,EAAGP,KAAK,CAAES,KAAK;YAErD,IAAI,CAAC3B,eAAe,GAAGc,QAAQC,GAAG,CAACa,CAAAA;gBAC9BA,EAAGP,MAAM,CAASQ,MAAM,GAAGD,EAAGV,KAAK;gBACpC,OAAOU,EAAGP,MAAM;YACpB;QACJ;QAEA,IAAI,CAACS,aAAa,GAAG;QACrB,IAAI,CAACC,MAAM,CAAC;IAChB;IAEQC,UAAUC,IAAY,EAAEC,OAAiB,EAAEC,UAAmB,EAAU;QAC5E,IAAIC,SAAS;QACb,MAAMC,WAAW,IAAIC,IAAIJ;QACzB,IAAK,IAAIK,IAAI,GAAGA,IAAIN,KAAK3B,MAAM,EAAEiC,IAAK;YAClC,IAAIF,SAASG,GAAG,CAACD,IAAI;gBACjB,IAAIJ,YAAY;oBACZC,UAAU,GAAGK,UAAI,CAACC,IAAI,GAAGD,UAAI,CAACE,QAAQ,GAAGV,IAAI,CAACM,EAAE,GAAGK,YAAK,CAACC,IAAI,EAAE,EAAE,sBAAsB;gBAC3F,OAAO;oBACHT,UAAU,GAAGK,UAAI,CAACC,IAAI,GAAGD,UAAI,CAACK,OAAO,GAAGb,IAAI,CAACM,EAAE,GAAGE,UAAI,CAACM,KAAK,EAAE;gBAClE;YACJ,OAAO;gBACHX,UAAUH,IAAI,CAACM,EAAE;YACrB;QACJ;QACA,OAAOH;IACX;IAEUL,OAAOiB,YAAqB,EAAE;QACpC,IAAIZ,SAAS;QACb,MAAMlC,UAAU,IAAI,CAACH,kBAAkB;QAEvC,oBAAoB;QACpB,IAAI,IAAI,CAAC+B,aAAa,GAAG,IAAI,CAACmB,SAAS,EAAE;YACrC,IAAI,CAACA,SAAS,GAAG,IAAI,CAACnB,aAAa;QACvC,OAAO,IAAI,IAAI,CAACA,aAAa,IAAI,IAAI,CAACmB,SAAS,GAAG,IAAI,CAACC,QAAQ,EAAE;YAC7D,IAAI,CAACD,SAAS,GAAG,IAAI,CAACnB,aAAa,GAAG,IAAI,CAACoB,QAAQ,GAAG;QAC1D;QACA,IAAI,IAAI,CAACD,SAAS,GAAG/C,QAAQI,MAAM,GAAG,GAAG;YACrC,IAAI,CAAC2C,SAAS,GAAGE,KAAKC,GAAG,CAAC,GAAGlD,QAAQI,MAAM,GAAG,IAAI,CAAC4C,QAAQ;QAC/D;QAEA,SAAS;QACT,MAAMG,YAAY,IAAI,CAAChD,YAAY,GAAG,CAAC,CAAC,EAAEuC,YAAK,CAACU,KAAK,CAAC,QAAQ,EAAE,IAAI,CAACjD,YAAY,CAAC,CAAC,EAAEoC,UAAI,CAACM,KAAK,EAAE,GAAG;QACpGX,UAAU,GAAGQ,YAAK,CAACW,OAAO,CAAC,CAAC,EAAEd,UAAI,CAACM,KAAK,CAAC,CAAC,EAAEN,UAAI,CAACC,IAAI,GAAGE,YAAK,CAACxB,KAAK,GAAG,IAAI,CAACnB,OAAO,CAACuD,OAAO,GAAGf,UAAI,CAACM,KAAK,GAAGM,UAAU,EAAE,CAAC;QAEvH,IAAInD,QAAQI,MAAM,KAAK,GAAG;YACtB8B,UAAU,CAAC,EAAE,EAAEQ,YAAK,CAACU,KAAK,CAAC,gBAAgB,EAAEb,UAAI,CAACM,KAAK,EAAE;QAC7D,OAAO;YACH,MAAMU,iBAAiBvD,QAAQK,KAAK,CAAC,IAAI,CAAC0C,SAAS,EAAE,IAAI,CAACA,SAAS,GAAG,IAAI,CAACC,QAAQ;YAEnFO,eAAeC,OAAO,CAAC,CAACrC,QAAQsC;gBAC5B,MAAMC,cAAc,IAAI,CAACX,SAAS,GAAGU;gBACrC,IAAIA,QAAQ,GAAGvB,UAAU;gBAEzB,IAAI,IAAI,CAACnB,WAAW,CAACI,SAAS;oBAC1Be,UAAU,CAAC,EAAE,EAAEK,UAAI,CAACoB,GAAG,GAAG,AAACxC,OAAeY,IAAI,IAAI6B,gBAAO,CAACC,IAAI,CAACC,MAAM,CAAC,KAAKvB,UAAI,CAACM,KAAK,EAAE;gBAC3F,OAAO;oBACH,IAAI3B,QAAQ,AAACC,OAAeD,KAAK;oBACjC,MAAMF,QAAQ,AAACG,OAAeQ,MAAM;oBACpC,MAAMM,aAAayB,gBAAgB,IAAI,CAAC9B,aAAa;oBAErD,IAAIZ,SAAS,IAAI,CAACb,YAAY,EAAE;wBAC5Be,QAAQ,IAAI,CAACY,SAAS,CAACZ,OAAOF,MAAMgB,OAAO,EAAEC;oBACjD;oBAEA,IAAIA,YAAY;wBACZC,UAAU,GAAGQ,YAAK,CAACC,IAAI,GAAGiB,gBAAO,CAACG,OAAO,CAAC,CAAC,EAAE7C,QAAQqB,UAAI,CAACM,KAAK,EAAE;wBACjE,IAAI7B,SAAS,IAAI,CAACb,YAAY,EAAE;wBAC5B,aAAa;wBACb,wEAAwE;wBAC5E;oBACJ,OAAO;wBACH+B,UAAU,CAAC,EAAE,EAAEhB,OAAO;oBAC1B;gBACJ;YACJ;QACJ;QAEA,IAAI,CAAC8C,WAAW,CAAC9B;IACrB;IAlIA,YAAYnC,OAA8B,CAAE;QACxC,KAAK,CAACA,UAJV,uBAAQD,mBAAyB,EAAE,GACnC,uBAAQW,iBAAR,KAAA;QAII,IAAI,CAACX,eAAe,GAAG,IAAI,CAACC,OAAO,CAACC,OAAO;IAC/C;AAgIJ"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "GaugePrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return GaugePrompt;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _ansi = require("../ansi");
|
|
12
|
+
const _base = require("../base");
|
|
13
|
+
const _theme = require("../theme");
|
|
14
|
+
function _define_property(obj, key, value) {
|
|
15
|
+
if (key in obj) {
|
|
16
|
+
Object.defineProperty(obj, key, {
|
|
17
|
+
value: value,
|
|
18
|
+
enumerable: true,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true
|
|
21
|
+
});
|
|
22
|
+
} else {
|
|
23
|
+
obj[key] = value;
|
|
24
|
+
}
|
|
25
|
+
return obj;
|
|
26
|
+
}
|
|
27
|
+
let GaugePrompt = class GaugePrompt extends _base.Prompt {
|
|
28
|
+
run() {
|
|
29
|
+
// Start the loop when run is called (after initial render)
|
|
30
|
+
const p = super.run();
|
|
31
|
+
this.startLoop();
|
|
32
|
+
return p;
|
|
33
|
+
}
|
|
34
|
+
startLoop() {
|
|
35
|
+
if (!this.running) return;
|
|
36
|
+
this.timer = setTimeout(()=>{
|
|
37
|
+
this.tick();
|
|
38
|
+
this.startLoop();
|
|
39
|
+
}, 30); // ~33 FPS
|
|
40
|
+
}
|
|
41
|
+
tick() {
|
|
42
|
+
this.cursor += this.direction * 2; // Speed multiplier
|
|
43
|
+
if (this.cursor >= 100) {
|
|
44
|
+
this.cursor = 100;
|
|
45
|
+
this.direction = -1;
|
|
46
|
+
} else if (this.cursor <= 0) {
|
|
47
|
+
this.cursor = 0;
|
|
48
|
+
this.direction = 1;
|
|
49
|
+
}
|
|
50
|
+
this.render(false);
|
|
51
|
+
}
|
|
52
|
+
stop() {
|
|
53
|
+
this.running = false;
|
|
54
|
+
if (this.timer) clearTimeout(this.timer);
|
|
55
|
+
// Calculate score
|
|
56
|
+
const center = 50;
|
|
57
|
+
const distance = Math.abs(this.cursor - center);
|
|
58
|
+
if (distance <= this.safeZoneHalf) {
|
|
59
|
+
this.result = 'PERFECT!';
|
|
60
|
+
this.resultColor = _theme.theme.success;
|
|
61
|
+
} else if (distance <= this.warnZoneHalf) {
|
|
62
|
+
this.result = 'GOOD';
|
|
63
|
+
this.resultColor = _ansi.ANSI.FG_YELLOW;
|
|
64
|
+
} else {
|
|
65
|
+
this.result = 'MISS';
|
|
66
|
+
this.resultColor = _theme.theme.error;
|
|
67
|
+
}
|
|
68
|
+
this.render(false);
|
|
69
|
+
// Wait a moment to show result, then submit
|
|
70
|
+
setTimeout(()=>{
|
|
71
|
+
this.submit(this.result); // Force non-null
|
|
72
|
+
}, 800);
|
|
73
|
+
}
|
|
74
|
+
handleInput(char, _key) {
|
|
75
|
+
if (!this.running) return;
|
|
76
|
+
if (char === ' ') {
|
|
77
|
+
this.stop();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
render(_firstRender) {
|
|
81
|
+
let output = '';
|
|
82
|
+
// Header
|
|
83
|
+
output += `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}\n`;
|
|
84
|
+
// Draw Gauge Bar
|
|
85
|
+
let barStr = '';
|
|
86
|
+
const center = 50;
|
|
87
|
+
for(let i = 0; i < this.width; i++){
|
|
88
|
+
const pct = i / this.width * 100;
|
|
89
|
+
const dist = Math.abs(pct - center);
|
|
90
|
+
let charColor = _theme.theme.error; // Default Miss (Red)
|
|
91
|
+
if (dist <= this.safeZoneHalf) {
|
|
92
|
+
charColor = _theme.theme.success; // Perfect (Green)
|
|
93
|
+
} else if (dist <= this.warnZoneHalf) {
|
|
94
|
+
charColor = _ansi.ANSI.FG_YELLOW; // Good (Yellow)
|
|
95
|
+
}
|
|
96
|
+
// Using block characters for the bar
|
|
97
|
+
barStr += `${charColor}━${_ansi.ANSI.RESET}`;
|
|
98
|
+
}
|
|
99
|
+
output += ` ${barStr}\n`;
|
|
100
|
+
// Draw Cursor
|
|
101
|
+
// Position relative to width
|
|
102
|
+
const pos = Math.floor(this.cursor / 100 * (this.width - 1));
|
|
103
|
+
const padding = ' '.repeat(pos);
|
|
104
|
+
output += ` ${padding}${_theme.theme.main}▲${_ansi.ANSI.RESET}\n`;
|
|
105
|
+
// Instructions or Result
|
|
106
|
+
if (this.running) {
|
|
107
|
+
output += `${_theme.theme.muted}(Press Space to Stop)${_ansi.ANSI.RESET}`;
|
|
108
|
+
} else {
|
|
109
|
+
output += `${_ansi.ANSI.BOLD}${this.resultColor}${this.result}${_ansi.ANSI.RESET}`;
|
|
110
|
+
}
|
|
111
|
+
this.renderFrame(output);
|
|
112
|
+
}
|
|
113
|
+
cleanup() {
|
|
114
|
+
if (this.timer) clearTimeout(this.timer);
|
|
115
|
+
super.cleanup();
|
|
116
|
+
}
|
|
117
|
+
constructor(options){
|
|
118
|
+
super(options), _define_property(this, "cursor", 0) // 0 to 100
|
|
119
|
+
, _define_property(this, "direction", 1), _define_property(this, "running", true), _define_property(this, "timer", void 0), _define_property(this, "width", void 0), _define_property(this, "safeZoneHalf", void 0), _define_property(this, "warnZoneHalf", void 0), _define_property(this, "result", null), _define_property(this, "resultColor", '');
|
|
120
|
+
this.width = options.width || 40;
|
|
121
|
+
// Calculate safe zone logic (0-100 scale)
|
|
122
|
+
// Default safe width: 20% ( +/- 10%)
|
|
123
|
+
const safeParam = options.safeZone ?? 0.2;
|
|
124
|
+
// Convert to percentage (0-100)
|
|
125
|
+
let safeWidthPct;
|
|
126
|
+
if (safeParam <= 1) {
|
|
127
|
+
safeWidthPct = safeParam * 100;
|
|
128
|
+
} else {
|
|
129
|
+
safeWidthPct = safeParam / this.width * 100;
|
|
130
|
+
}
|
|
131
|
+
this.safeZoneHalf = safeWidthPct / 2;
|
|
132
|
+
// Arbitrary "Good" zone is 3x the safe zone (or until limits)
|
|
133
|
+
this.warnZoneHalf = Math.max(this.safeZoneHalf * 3, 30);
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
//# sourceMappingURL=gauge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/gauge.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { GaugeOptions } from '../types';\n\nexport class GaugePrompt extends Prompt<string, GaugeOptions> {\n private cursor: number = 0; // 0 to 100\n private direction: 1 | -1 = 1;\n private running: boolean = true;\n private timer?: NodeJS.Timeout;\n private readonly width: number;\n private readonly safeZoneHalf: number;\n private readonly warnZoneHalf: number;\n private result: string | null = null;\n private resultColor: string = '';\n\n constructor(options: GaugeOptions) {\n super(options);\n this.width = options.width || 40;\n\n // Calculate safe zone logic (0-100 scale)\n // Default safe width: 20% ( +/- 10%)\n const safeParam = options.safeZone ?? 0.2;\n\n // Convert to percentage (0-100)\n let safeWidthPct: number;\n if (safeParam <= 1) {\n safeWidthPct = safeParam * 100;\n } else {\n safeWidthPct = (safeParam / this.width) * 100;\n }\n\n this.safeZoneHalf = safeWidthPct / 2;\n // Arbitrary \"Good\" zone is 3x the safe zone (or until limits)\n this.warnZoneHalf = Math.max(this.safeZoneHalf * 3, 30);\n }\n\n public run(): Promise<string> {\n // Start the loop when run is called (after initial render)\n const p = super.run();\n this.startLoop();\n return p;\n }\n\n private startLoop() {\n if (!this.running) return;\n this.timer = setTimeout(() => {\n this.tick();\n this.startLoop();\n }, 30); // ~33 FPS\n }\n\n private tick() {\n this.cursor += this.direction * 2; // Speed multiplier\n if (this.cursor >= 100) {\n this.cursor = 100;\n this.direction = -1;\n } else if (this.cursor <= 0) {\n this.cursor = 0;\n this.direction = 1;\n }\n this.render(false);\n }\n\n private stop() {\n this.running = false;\n if (this.timer) clearTimeout(this.timer);\n\n // Calculate score\n const center = 50;\n const distance = Math.abs(this.cursor - center);\n\n if (distance <= this.safeZoneHalf) {\n this.result = 'PERFECT!';\n this.resultColor = theme.success;\n } else if (distance <= this.warnZoneHalf) {\n this.result = 'GOOD';\n this.resultColor = ANSI.FG_YELLOW;\n } else {\n this.result = 'MISS';\n this.resultColor = theme.error;\n }\n\n this.render(false);\n\n // Wait a moment to show result, then submit\n setTimeout(() => {\n this.submit(this.result!); // Force non-null\n }, 800);\n }\n\n protected handleInput(char: string, _key: Buffer) {\n if (!this.running) return;\n\n if (char === ' ') {\n this.stop();\n }\n }\n\n protected render(_firstRender: boolean) {\n let output = '';\n\n // Header\n output += `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}\\n`;\n\n // Draw Gauge Bar\n let barStr = '';\n const center = 50;\n\n for (let i = 0; i < this.width; i++) {\n const pct = (i / this.width) * 100;\n const dist = Math.abs(pct - center);\n\n let charColor = theme.error; // Default Miss (Red)\n\n if (dist <= this.safeZoneHalf) {\n charColor = theme.success; // Perfect (Green)\n } else if (dist <= this.warnZoneHalf) {\n charColor = ANSI.FG_YELLOW; // Good (Yellow)\n }\n\n // Using block characters for the bar\n barStr += `${charColor}━${ANSI.RESET}`;\n }\n\n output += ` ${barStr}\\n`;\n\n // Draw Cursor\n // Position relative to width\n const pos = Math.floor((this.cursor / 100) * (this.width - 1));\n const padding = ' '.repeat(pos);\n output += ` ${padding}${theme.main}▲${ANSI.RESET}\\n`;\n\n // Instructions or Result\n if (this.running) {\n output += `${theme.muted}(Press Space to Stop)${ANSI.RESET}`;\n } else {\n output += `${ANSI.BOLD}${this.resultColor}${this.result}${ANSI.RESET}`;\n }\n\n this.renderFrame(output);\n }\n\n protected cleanup() {\n if (this.timer) clearTimeout(this.timer);\n super.cleanup();\n }\n}\n"],"names":["GaugePrompt","Prompt","run","p","startLoop","running","timer","setTimeout","tick","cursor","direction","render","stop","clearTimeout","center","distance","Math","abs","safeZoneHalf","result","resultColor","theme","success","warnZoneHalf","ANSI","FG_YELLOW","error","submit","handleInput","char","_key","_firstRender","output","RESET","BOLD","title","options","message","barStr","i","width","pct","dist","charColor","pos","floor","padding","repeat","main","muted","renderFrame","cleanup","safeParam","safeZone","safeWidthPct","max"],"mappings":"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"}
|