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,28 +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
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "MultiSelectPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return MultiSelectPrompt;
|
|
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;
|
|
19
25
|
}
|
|
26
|
+
return obj;
|
|
27
|
+
}
|
|
28
|
+
let MultiSelectPrompt = class MultiSelectPrompt extends _base.Prompt {
|
|
20
29
|
getFilteredChoices() {
|
|
21
|
-
if (!this.searchBuffer)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
30
|
+
if (!this.searchBuffer) return this.options.choices.map((c, i)=>({
|
|
31
|
+
...c,
|
|
32
|
+
originalIndex: i
|
|
33
|
+
}));
|
|
34
|
+
return this.options.choices.map((c, i)=>({
|
|
35
|
+
...c,
|
|
36
|
+
originalIndex: i
|
|
37
|
+
})).filter((c)=>c.title.toLowerCase().includes(this.searchBuffer.toLowerCase()));
|
|
26
38
|
}
|
|
27
39
|
render(_firstRender) {
|
|
28
40
|
let output = '';
|
|
@@ -30,39 +42,34 @@ class MultiSelectPrompt extends base_1.Prompt {
|
|
|
30
42
|
// Adjust Scroll
|
|
31
43
|
if (this.selectedIndex < this.scrollTop) {
|
|
32
44
|
this.scrollTop = this.selectedIndex;
|
|
33
|
-
}
|
|
34
|
-
else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
|
|
45
|
+
} else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
|
|
35
46
|
this.scrollTop = this.selectedIndex - this.pageSize + 1;
|
|
36
47
|
}
|
|
37
48
|
if (this.scrollTop > choices.length - 1) {
|
|
38
49
|
this.scrollTop = Math.max(0, choices.length - this.pageSize);
|
|
39
50
|
}
|
|
40
|
-
const icon = this.errorMsg ? `${
|
|
41
|
-
const searchStr = this.searchBuffer ? ` ${
|
|
42
|
-
output += `${icon} ${
|
|
51
|
+
const icon = this.errorMsg ? `${_theme.theme.error}${_symbols.symbols.cross}` : `${_theme.theme.success}?`;
|
|
52
|
+
const searchStr = this.searchBuffer ? ` ${_theme.theme.muted}(Filter: ${this.searchBuffer})${_ansi.ANSI.RESET}` : '';
|
|
53
|
+
output += `${icon} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}${searchStr}\n`;
|
|
43
54
|
if (choices.length === 0) {
|
|
44
|
-
output += ` ${
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
55
|
+
output += ` ${_theme.theme.muted}No results found${_ansi.ANSI.RESET}`;
|
|
56
|
+
} else {
|
|
47
57
|
const visible = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);
|
|
48
|
-
visible.forEach((choice, index)
|
|
49
|
-
if (index > 0)
|
|
50
|
-
output += '\n';
|
|
58
|
+
visible.forEach((choice, index)=>{
|
|
59
|
+
if (index > 0) output += '\n';
|
|
51
60
|
const actualIndex = this.scrollTop + index;
|
|
52
|
-
const cursor = actualIndex === this.selectedIndex ? `${
|
|
61
|
+
const cursor = actualIndex === this.selectedIndex ? `${_theme.theme.main}${_symbols.symbols.pointer}${_ansi.ANSI.RESET}` : ' ';
|
|
53
62
|
const isChecked = this.checkedState[choice.originalIndex];
|
|
54
|
-
const checkbox = isChecked
|
|
55
|
-
? `${theme_1.theme.success}${symbols_1.symbols.checked}${ansi_1.ANSI.RESET}`
|
|
56
|
-
: `${theme_1.theme.muted}${symbols_1.symbols.unchecked}${ansi_1.ANSI.RESET}`;
|
|
63
|
+
const checkbox = isChecked ? `${_theme.theme.success}${_symbols.symbols.checked}${_ansi.ANSI.RESET}` : `${_theme.theme.muted}${_symbols.symbols.unchecked}${_ansi.ANSI.RESET}`;
|
|
57
64
|
output += `${cursor} ${checkbox} ${choice.title}`;
|
|
58
65
|
});
|
|
59
66
|
}
|
|
60
67
|
// Hints
|
|
61
68
|
if (!this.searchBuffer && !this.errorMsg) {
|
|
62
|
-
output += `\n${
|
|
69
|
+
output += `\n${_ansi.ANSI.DIM}(Ctrl+A: All, Ctrl+X: None)${_ansi.ANSI.RESET}`;
|
|
63
70
|
}
|
|
64
71
|
if (this.errorMsg) {
|
|
65
|
-
output += `\n${
|
|
72
|
+
output += `\n${_theme.theme.error}>> ${this.errorMsg}${_ansi.ANSI.RESET}`;
|
|
66
73
|
}
|
|
67
74
|
this.renderFrame(output);
|
|
68
75
|
}
|
|
@@ -82,28 +89,26 @@ class MultiSelectPrompt extends base_1.Prompt {
|
|
|
82
89
|
this.render(false);
|
|
83
90
|
return;
|
|
84
91
|
}
|
|
85
|
-
const results = this.options.choices
|
|
86
|
-
.filter((_, i) => this.checkedState[i])
|
|
87
|
-
.map(c => c.value);
|
|
92
|
+
const results = this.options.choices.filter((_, i)=>this.checkedState[i]).map((c)=>c.value);
|
|
88
93
|
this.submit(results);
|
|
89
94
|
return;
|
|
90
95
|
}
|
|
91
96
|
// --- Batch Shortcuts (Visible Items Only) ---
|
|
92
97
|
// Ctrl+A (\x01): Select All Visible
|
|
93
98
|
if (char === '\x01') {
|
|
94
|
-
const newCheckedState = [
|
|
99
|
+
const newCheckedState = [
|
|
100
|
+
...this.checkedState
|
|
101
|
+
];
|
|
95
102
|
let potentialAdd = 0;
|
|
96
103
|
// Calculate potential selections
|
|
97
|
-
choices.forEach(c
|
|
98
|
-
if (!newCheckedState[c.originalIndex])
|
|
99
|
-
potentialAdd++;
|
|
104
|
+
choices.forEach((c)=>{
|
|
105
|
+
if (!newCheckedState[c.originalIndex]) potentialAdd++;
|
|
100
106
|
});
|
|
101
107
|
const currentSelected = newCheckedState.filter(Boolean).length;
|
|
102
|
-
if (this.options.max &&
|
|
108
|
+
if (this.options.max && currentSelected + potentialAdd > this.options.max) {
|
|
103
109
|
this.errorMsg = `Max limit ${this.options.max} reached`;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
choices.forEach(c => newCheckedState[c.originalIndex] = true);
|
|
110
|
+
} else {
|
|
111
|
+
choices.forEach((c)=>newCheckedState[c.originalIndex] = true);
|
|
107
112
|
this.checkedState = newCheckedState;
|
|
108
113
|
this.errorMsg = '';
|
|
109
114
|
}
|
|
@@ -112,7 +117,7 @@ class MultiSelectPrompt extends base_1.Prompt {
|
|
|
112
117
|
}
|
|
113
118
|
// Ctrl+X (\x18): Deselect All Visible
|
|
114
119
|
if (char === '\x18') {
|
|
115
|
-
choices.forEach(c
|
|
120
|
+
choices.forEach((c)=>this.checkedState[c.originalIndex] = false);
|
|
116
121
|
this.errorMsg = '';
|
|
117
122
|
this.render(false);
|
|
118
123
|
return;
|
|
@@ -140,7 +145,7 @@ class MultiSelectPrompt extends base_1.Prompt {
|
|
|
140
145
|
}
|
|
141
146
|
return;
|
|
142
147
|
}
|
|
143
|
-
if (char === '\u0008' || char === '\x7f') {
|
|
148
|
+
if (char === '\u0008' || char === '\x7f') {
|
|
144
149
|
if (this.searchBuffer.length > 0) {
|
|
145
150
|
this.searchBuffer = this.searchBuffer.slice(0, -1);
|
|
146
151
|
this.selectedIndex = 0;
|
|
@@ -157,18 +162,22 @@ class MultiSelectPrompt extends base_1.Prompt {
|
|
|
157
162
|
}
|
|
158
163
|
handleMouse(event) {
|
|
159
164
|
const choices = this.getFilteredChoices();
|
|
160
|
-
if (choices.length === 0)
|
|
161
|
-
return;
|
|
165
|
+
if (choices.length === 0) return;
|
|
162
166
|
if (event.action === 'scroll') {
|
|
163
167
|
if (event.scroll === 'up') {
|
|
164
168
|
this.selectedIndex = (this.selectedIndex - 1 + choices.length) % choices.length;
|
|
165
169
|
this.render(false);
|
|
166
|
-
}
|
|
167
|
-
else if (event.scroll === 'down') {
|
|
170
|
+
} else if (event.scroll === 'down') {
|
|
168
171
|
this.selectedIndex = (this.selectedIndex + 1) % choices.length;
|
|
169
172
|
this.render(false);
|
|
170
173
|
}
|
|
171
174
|
}
|
|
172
175
|
}
|
|
173
|
-
|
|
174
|
-
|
|
176
|
+
constructor(options){
|
|
177
|
+
super(options), _define_property(this, "selectedIndex", 0), _define_property(this, "checkedState", void 0), _define_property(this, "searchBuffer", ''), _define_property(this, "scrollTop", 0), _define_property(this, "pageSize", 7), _define_property(this, "errorMsg", '');
|
|
178
|
+
this.checkedState = options.choices.map((c)=>!!c.selected);
|
|
179
|
+
this.selectedIndex = 0;
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
//# sourceMappingURL=multi-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/multi-select.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { MultiSelectOptions, MouseEvent } from '../types';\n\n// --- Implementation: MultiSelect Prompt ---\nexport class MultiSelectPrompt<V> extends Prompt<any[], MultiSelectOptions<V>> {\n private selectedIndex: number = 0;\n private checkedState: boolean[];\n private searchBuffer: string = '';\n private scrollTop: number = 0;\n private readonly pageSize: number = 7;\n private errorMsg: string = '';\n\n constructor(options: MultiSelectOptions<V>) {\n super(options);\n this.checkedState = options.choices.map(c => !!c.selected);\n this.selectedIndex = 0;\n }\n\n private getFilteredChoices() {\n if (!this.searchBuffer) return this.options.choices.map((c, i) => ({ ...c, originalIndex: i }));\n return this.options.choices\n .map((c, i) => ({ ...c, originalIndex: i }))\n .filter(c => c.title.toLowerCase().includes(this.searchBuffer.toLowerCase()));\n }\n\n protected render(_firstRender: boolean) {\n let output = '';\n const choices = this.getFilteredChoices();\n\n // Adjust Scroll\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 const icon = this.errorMsg ? `${theme.error}${symbols.cross}` : `${theme.success}?`;\n const searchStr = this.searchBuffer ? ` ${theme.muted}(Filter: ${this.searchBuffer})${ANSI.RESET}` : '';\n output += `${icon} ${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 visible = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);\n visible.forEach((choice, index) => {\n if (index > 0) output += '\\n';\n\n const actualIndex = this.scrollTop + index;\n const cursor = actualIndex === this.selectedIndex ? `${theme.main}${symbols.pointer}${ANSI.RESET}` : ' ';\n const isChecked = this.checkedState[choice.originalIndex];\n const checkbox = isChecked\n ? `${theme.success}${symbols.checked}${ANSI.RESET}`\n : `${theme.muted}${symbols.unchecked}${ANSI.RESET}`;\n\n output += `${cursor} ${checkbox} ${choice.title}`;\n });\n }\n\n // Hints\n if (!this.searchBuffer && !this.errorMsg) {\n output += `\\n${ANSI.DIM}(Ctrl+A: All, Ctrl+X: None)${ANSI.RESET}`;\n }\n\n if (this.errorMsg) {\n output += `\\n${theme.error}>> ${this.errorMsg}${ANSI.RESET}`;\n }\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string) {\n const choices = this.getFilteredChoices();\n\n // Enter\n if (char === '\\r' || char === '\\n') {\n const selectedCount = this.checkedState.filter(Boolean).length;\n const { min = 0, max } = this.options;\n if (selectedCount < min) {\n this.errorMsg = `Select at least ${min}.`;\n this.render(false);\n return;\n }\n if (max && selectedCount > max) {\n this.errorMsg = `Max ${max} allowed.`;\n this.render(false);\n return;\n }\n\n const results = this.options.choices\n .filter((_, i) => this.checkedState[i])\n .map(c => c.value);\n this.submit(results);\n return;\n }\n\n // --- Batch Shortcuts (Visible Items Only) ---\n\n // Ctrl+A (\\x01): Select All Visible\n if (char === '\\x01') {\n const newCheckedState = [...this.checkedState];\n let potentialAdd = 0;\n\n // Calculate potential selections\n choices.forEach(c => {\n if (!newCheckedState[c.originalIndex]) potentialAdd++;\n });\n\n const currentSelected = newCheckedState.filter(Boolean).length;\n if (this.options.max && (currentSelected + potentialAdd) > this.options.max) {\n this.errorMsg = `Max limit ${this.options.max} reached`;\n } else {\n choices.forEach(c => newCheckedState[c.originalIndex] = true);\n this.checkedState = newCheckedState;\n this.errorMsg = '';\n }\n this.render(false);\n return;\n }\n\n // Ctrl+X (\\x18): Deselect All Visible\n if (char === '\\x18') {\n choices.forEach(c => this.checkedState[c.originalIndex] = false);\n this.errorMsg = '';\n this.render(false);\n return;\n }\n\n if (char === ' ') {\n if (choices.length > 0) {\n const choice = choices[this.selectedIndex];\n const originalIndex = choice.originalIndex;\n this.checkedState[originalIndex] = !this.checkedState[originalIndex];\n this.render(false);\n }\n return;\n }\n\n if (this.isUp(char)) {\n if (choices.length > 0) {\n this.selectedIndex = (this.selectedIndex - 1 + choices.length) % choices.length;\n this.render(false);\n }\n return;\n }\n if (this.isDown(char)) {\n if (choices.length > 0) {\n this.selectedIndex = (this.selectedIndex + 1) % choices.length;\n this.render(false);\n }\n return;\n }\n\n if (char === '\\u0008' || char === '\\x7f') { // Backspace\n if (this.searchBuffer.length > 0) {\n this.searchBuffer = this.searchBuffer.slice(0, -1);\n this.selectedIndex = 0;\n this.render(false);\n }\n return;\n }\n\n // Typing search\n if (!/^[\\x00-\\x1F]/.test(char) && !char.startsWith('\\x1b')) {\n this.searchBuffer += char;\n this.selectedIndex = 0;\n this.render(false);\n }\n }\n\n protected handleMouse(event: MouseEvent) {\n const choices = this.getFilteredChoices();\n if (choices.length === 0) return;\n\n if (event.action === 'scroll') {\n if (event.scroll === 'up') {\n this.selectedIndex = (this.selectedIndex - 1 + choices.length) % choices.length;\n this.render(false);\n } else if (event.scroll === 'down') {\n this.selectedIndex = (this.selectedIndex + 1) % choices.length;\n this.render(false);\n }\n }\n }\n}\n"],"names":["MultiSelectPrompt","Prompt","getFilteredChoices","searchBuffer","options","choices","map","c","i","originalIndex","filter","title","toLowerCase","includes","render","_firstRender","output","selectedIndex","scrollTop","pageSize","length","Math","max","icon","errorMsg","theme","error","symbols","cross","success","searchStr","muted","ANSI","RESET","BOLD","message","visible","slice","forEach","choice","index","actualIndex","cursor","main","pointer","isChecked","checkedState","checkbox","checked","unchecked","DIM","renderFrame","handleInput","char","selectedCount","Boolean","min","results","_","value","submit","newCheckedState","potentialAdd","currentSelected","isUp","isDown","test","startsWith","handleMouse","event","action","scroll","selected"],"mappings":"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"}
|
|
@@ -1,44 +1,53 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class NumberPrompt extends base_1.Prompt {
|
|
10
|
-
constructor(options) {
|
|
11
|
-
super(options);
|
|
12
|
-
this.stringValue = '';
|
|
13
|
-
this.cursor = 0;
|
|
14
|
-
this.errorMsg = '';
|
|
15
|
-
// We work with string for editing, but value property stores the parsed number ultimately
|
|
16
|
-
// Initialize stringValue from initial
|
|
17
|
-
this.stringValue = options.initial !== undefined ? options.initial.toString() : '';
|
|
18
|
-
this.cursor = this.stringValue.length;
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "NumberPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return NumberPrompt;
|
|
19
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 NumberPrompt = class NumberPrompt extends _base.Prompt {
|
|
20
29
|
render(_firstRender) {
|
|
21
30
|
// Prepare content
|
|
22
|
-
const icon = this.errorMsg ? `${
|
|
31
|
+
const icon = this.errorMsg ? `${_theme.theme.error}${_symbols.symbols.cross}` : `${_theme.theme.success}?`;
|
|
23
32
|
// Prefix
|
|
24
|
-
let output = `${icon} ${
|
|
33
|
+
let output = `${icon} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} `;
|
|
25
34
|
// Value
|
|
26
|
-
output += `${
|
|
35
|
+
output += `${_theme.theme.main}${this.stringValue}${_ansi.ANSI.RESET}`;
|
|
27
36
|
if (this.errorMsg) {
|
|
28
|
-
output += `\n${
|
|
37
|
+
output += `\n${_theme.theme.error}>> ${this.errorMsg}${_ansi.ANSI.RESET}`;
|
|
29
38
|
}
|
|
30
39
|
this.renderFrame(output);
|
|
31
|
-
this.print(
|
|
40
|
+
this.print(_ansi.ANSI.SHOW_CURSOR);
|
|
32
41
|
// Restore cursor position
|
|
33
42
|
// If errorMsg, we are on the line below the input.
|
|
34
43
|
if (this.errorMsg) {
|
|
35
|
-
this.print(
|
|
44
|
+
this.print(_ansi.ANSI.UP);
|
|
36
45
|
}
|
|
37
46
|
// Calculate visual offset
|
|
38
|
-
const prefix = `${icon} ${
|
|
47
|
+
const prefix = `${icon} ${_theme.theme.title}${this.options.message} `;
|
|
39
48
|
const prefixLen = this.stripAnsi(prefix).length;
|
|
40
49
|
const targetCol = prefixLen + this.cursor;
|
|
41
|
-
this.print(
|
|
50
|
+
this.print(_ansi.ANSI.CURSOR_LEFT);
|
|
42
51
|
if (targetCol > 0) {
|
|
43
52
|
this.print(`\x1b[${targetCol}C`);
|
|
44
53
|
}
|
|
@@ -68,9 +77,8 @@ class NumberPrompt extends base_1.Prompt {
|
|
|
68
77
|
// Up Arrow (Increment)
|
|
69
78
|
if (this.isUp(char)) {
|
|
70
79
|
let num = parseFloat(this.stringValue) || 0;
|
|
71
|
-
num +=
|
|
72
|
-
if (this.options.max !== undefined && num > this.options.max)
|
|
73
|
-
num = this.options.max;
|
|
80
|
+
num += this.options.step ?? 1;
|
|
81
|
+
if (this.options.max !== undefined && num > this.options.max) num = this.options.max;
|
|
74
82
|
// Round to avoid float errors
|
|
75
83
|
num = Math.round(num * 10000) / 10000;
|
|
76
84
|
this.stringValue = num.toString();
|
|
@@ -82,9 +90,8 @@ class NumberPrompt extends base_1.Prompt {
|
|
|
82
90
|
// Down Arrow (Decrement)
|
|
83
91
|
if (this.isDown(char)) {
|
|
84
92
|
let num = parseFloat(this.stringValue) || 0;
|
|
85
|
-
num -=
|
|
86
|
-
if (this.options.min !== undefined && num < this.options.min)
|
|
87
|
-
num = this.options.min;
|
|
93
|
+
num -= this.options.step ?? 1;
|
|
94
|
+
if (this.options.min !== undefined && num < this.options.min) num = this.options.min;
|
|
88
95
|
// Round to avoid float errors
|
|
89
96
|
num = Math.round(num * 10000) / 10000;
|
|
90
97
|
this.stringValue = num.toString();
|
|
@@ -134,13 +141,10 @@ class NumberPrompt extends base_1.Prompt {
|
|
|
134
141
|
const step = this.options.step ?? 1;
|
|
135
142
|
if (event.scroll === 'up') {
|
|
136
143
|
num += step;
|
|
137
|
-
if (this.options.max !== undefined && num > this.options.max)
|
|
138
|
-
|
|
139
|
-
}
|
|
140
|
-
else if (event.scroll === 'down') {
|
|
144
|
+
if (this.options.max !== undefined && num > this.options.max) num = this.options.max;
|
|
145
|
+
} else if (event.scroll === 'down') {
|
|
141
146
|
num -= step;
|
|
142
|
-
if (this.options.min !== undefined && num < this.options.min)
|
|
143
|
-
num = this.options.min;
|
|
147
|
+
if (this.options.min !== undefined && num < this.options.min) num = this.options.min;
|
|
144
148
|
}
|
|
145
149
|
// Round to avoid float errors
|
|
146
150
|
num = Math.round(num * 10000) / 10000;
|
|
@@ -150,5 +154,13 @@ class NumberPrompt extends base_1.Prompt {
|
|
|
150
154
|
this.render(false);
|
|
151
155
|
}
|
|
152
156
|
}
|
|
153
|
-
|
|
154
|
-
|
|
157
|
+
constructor(options){
|
|
158
|
+
super(options), _define_property(this, "stringValue", ''), _define_property(this, "cursor", 0), _define_property(this, "errorMsg", '');
|
|
159
|
+
// We work with string for editing, but value property stores the parsed number ultimately
|
|
160
|
+
// Initialize stringValue from initial
|
|
161
|
+
this.stringValue = options.initial !== undefined ? options.initial.toString() : '';
|
|
162
|
+
this.cursor = this.stringValue.length;
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
//# sourceMappingURL=number.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/number.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { NumberOptions, MouseEvent } from '../types';\n\n// --- Implementation: Number Prompt ---\nexport class NumberPrompt extends Prompt<number, NumberOptions> {\n private stringValue: string = '';\n private cursor: number = 0;\n private errorMsg: string = '';\n\n constructor(options: NumberOptions) {\n super(options);\n // We work with string for editing, but value property stores the parsed number ultimately\n // Initialize stringValue from initial\n this.stringValue = options.initial !== undefined ? options.initial.toString() : '';\n this.cursor = this.stringValue.length;\n }\n\n protected render(_firstRender: boolean) {\n // Prepare content\n const icon = this.errorMsg ? `${theme.error}${symbols.cross}` : `${theme.success}?`;\n // Prefix\n let output = `${icon} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET} `;\n // Value\n output += `${theme.main}${this.stringValue}${ANSI.RESET}`;\n\n if (this.errorMsg) {\n output += `\\n${theme.error}>> ${this.errorMsg}${ANSI.RESET}`;\n }\n\n this.renderFrame(output);\n this.print(ANSI.SHOW_CURSOR);\n\n // Restore cursor position\n // If errorMsg, we are on the line below the input.\n if (this.errorMsg) {\n this.print(ANSI.UP);\n }\n\n // Calculate visual offset\n const prefix = `${icon} ${theme.title}${this.options.message} `;\n const prefixLen = this.stripAnsi(prefix).length;\n const targetCol = prefixLen + this.cursor;\n\n this.print(ANSI.CURSOR_LEFT);\n if (targetCol > 0) {\n this.print(`\\x1b[${targetCol}C`);\n }\n }\n\n protected handleInput(char: string) {\n // Enter\n if (char === '\\r' || char === '\\n') {\n const num = parseFloat(this.stringValue);\n if (this.stringValue.trim() === '' || isNaN(num)) {\n this.errorMsg = 'Please enter a valid number.';\n this.render(false);\n return;\n }\n if (this.options.min !== undefined && num < this.options.min) {\n this.errorMsg = `Minimum value is ${this.options.min}`;\n this.render(false);\n return;\n }\n if (this.options.max !== undefined && num > this.options.max) {\n this.errorMsg = `Maximum value is ${this.options.max}`;\n this.render(false);\n return;\n }\n\n this.submit(num);\n return;\n }\n\n // Up Arrow (Increment)\n if (this.isUp(char)) {\n let num = parseFloat(this.stringValue) || 0;\n num += (this.options.step ?? 1);\n if (this.options.max !== undefined && num > this.options.max) num = this.options.max;\n // Round to avoid float errors\n num = Math.round(num * 10000) / 10000;\n\n this.stringValue = num.toString();\n this.cursor = this.stringValue.length;\n this.errorMsg = '';\n this.render(false);\n return;\n }\n\n // Down Arrow (Decrement)\n if (this.isDown(char)) {\n let num = parseFloat(this.stringValue) || 0;\n num -= (this.options.step ?? 1);\n if (this.options.min !== undefined && num < this.options.min) num = this.options.min;\n // Round to avoid float errors\n num = Math.round(num * 10000) / 10000;\n\n this.stringValue = num.toString();\n this.cursor = this.stringValue.length;\n this.errorMsg = '';\n this.render(false);\n return;\n }\n\n // Backspace\n if (char === '\\u0008' || char === '\\x7f') {\n if (this.cursor > 0) {\n this.stringValue = this.stringValue.slice(0, this.cursor - 1) + this.stringValue.slice(this.cursor);\n this.cursor--;\n this.errorMsg = '';\n this.render(false);\n }\n return;\n }\n\n // Arrow Left\n if (this.isLeft(char)) {\n if (this.cursor > 0) {\n this.cursor--;\n this.render(false);\n }\n return;\n }\n\n // Arrow Right\n if (this.isRight(char)) {\n if (this.cursor < this.stringValue.length) {\n this.cursor++;\n this.render(false);\n }\n return;\n }\n\n // Numeric Input (and . and -)\n if (/^[0-9.-]+$/.test(char)) {\n // Allow if it looks like a number part\n this.stringValue = this.stringValue.slice(0, this.cursor) + char + this.stringValue.slice(this.cursor);\n this.cursor += char.length;\n this.errorMsg = '';\n this.render(false);\n }\n }\n\n protected handleMouse(event: MouseEvent) {\n if (event.action === 'scroll') {\n let num = parseFloat(this.stringValue) || 0;\n const step = this.options.step ?? 1;\n\n if (event.scroll === 'up') {\n num += step;\n if (this.options.max !== undefined && num > this.options.max) num = this.options.max;\n } else if (event.scroll === 'down') {\n num -= step;\n if (this.options.min !== undefined && num < this.options.min) num = this.options.min;\n }\n\n // Round to avoid float errors\n num = Math.round(num * 10000) / 10000;\n\n this.stringValue = num.toString();\n this.cursor = this.stringValue.length;\n this.errorMsg = '';\n this.render(false);\n }\n }\n}\n"],"names":["NumberPrompt","Prompt","render","_firstRender","icon","errorMsg","theme","error","symbols","cross","success","output","ANSI","BOLD","title","options","message","RESET","main","stringValue","renderFrame","print","SHOW_CURSOR","UP","prefix","prefixLen","stripAnsi","length","targetCol","cursor","CURSOR_LEFT","handleInput","char","num","parseFloat","trim","isNaN","min","undefined","max","submit","isUp","step","Math","round","toString","isDown","slice","isLeft","isRight","test","handleMouse","event","action","scroll","initial"],"mappings":"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"}
|
|
@@ -1,41 +1,52 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "OTPPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return OTPPrompt;
|
|
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;
|
|
13
24
|
}
|
|
25
|
+
return obj;
|
|
26
|
+
}
|
|
27
|
+
let OTPPrompt = class OTPPrompt extends _base.Prompt {
|
|
14
28
|
render(_firstRender) {
|
|
15
29
|
const mask = this.options.mask || '_';
|
|
16
|
-
let output = `${
|
|
30
|
+
let output = `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}\n`;
|
|
17
31
|
output += ' '; // Indent
|
|
18
|
-
for
|
|
32
|
+
for(let i = 0; i < this.length; i++){
|
|
19
33
|
const val = this.slots[i];
|
|
20
34
|
let charToDisplay = mask;
|
|
21
35
|
if (val) {
|
|
22
36
|
charToDisplay = this.options.secure ? '*' : val;
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
37
|
+
} else {
|
|
25
38
|
// Use placeholder char if available at this index
|
|
26
39
|
if (this.options.placeholder && i < this.options.placeholder.length) {
|
|
27
40
|
charToDisplay = this.options.placeholder[i];
|
|
28
41
|
}
|
|
29
42
|
}
|
|
30
43
|
if (i === this.cursor) {
|
|
31
|
-
output += `${
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
44
|
+
output += `${_ansi.ANSI.REVERSE}${charToDisplay}${_ansi.ANSI.RESET} `;
|
|
45
|
+
} else {
|
|
34
46
|
if (!val) {
|
|
35
|
-
output += `${
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
output += `${theme_1.theme.main}${charToDisplay}${ansi_1.ANSI.RESET} `;
|
|
47
|
+
output += `${_theme.theme.muted}${charToDisplay}${_ansi.ANSI.RESET} `;
|
|
48
|
+
} else {
|
|
49
|
+
output += `${_theme.theme.main}${charToDisplay}${_ansi.ANSI.RESET} `;
|
|
39
50
|
}
|
|
40
51
|
}
|
|
41
52
|
}
|
|
@@ -48,7 +59,7 @@ class OTPPrompt extends base_1.Prompt {
|
|
|
48
59
|
// If we are at the last slot
|
|
49
60
|
if (this.cursor === this.length - 1) {
|
|
50
61
|
// Only submit if all slots are filled
|
|
51
|
-
if (this.slots.every(s
|
|
62
|
+
if (this.slots.every((s)=>s !== '')) {
|
|
52
63
|
this.render(false); // Update view first
|
|
53
64
|
this.submit(this.slots.join(''));
|
|
54
65
|
return;
|
|
@@ -62,8 +73,7 @@ class OTPPrompt extends base_1.Prompt {
|
|
|
62
73
|
if (char === '\u0008' || char === '\x7f') {
|
|
63
74
|
if (this.slots[this.cursor] !== '') {
|
|
64
75
|
this.slots[this.cursor] = '';
|
|
65
|
-
}
|
|
66
|
-
else if (this.cursor > 0) {
|
|
76
|
+
} else if (this.cursor > 0) {
|
|
67
77
|
this.cursor--;
|
|
68
78
|
this.slots[this.cursor] = '';
|
|
69
79
|
}
|
|
@@ -87,5 +97,11 @@ class OTPPrompt extends base_1.Prompt {
|
|
|
87
97
|
return;
|
|
88
98
|
}
|
|
89
99
|
}
|
|
90
|
-
|
|
91
|
-
|
|
100
|
+
constructor(options){
|
|
101
|
+
super(options), _define_property(this, "slots", void 0), _define_property(this, "cursor", 0), _define_property(this, "length", void 0);
|
|
102
|
+
this.length = options.length || 6;
|
|
103
|
+
this.slots = new Array(this.length).fill('');
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
//# sourceMappingURL=otp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/otp.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { OTPOptions } from '../types';\n\nexport class OTPPrompt extends Prompt<string, OTPOptions> {\n private slots: string[];\n private cursor: number = 0;\n private readonly length: number;\n\n constructor(options: OTPOptions) {\n super(options);\n this.length = options.length || 6;\n this.slots = new Array(this.length).fill('');\n }\n\n protected render(_firstRender: boolean) {\n const mask = this.options.mask || '_';\n\n let output = `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}\\n`;\n output += ' '; // Indent\n\n for (let i = 0; i < this.length; i++) {\n const val = this.slots[i];\n let charToDisplay = mask;\n\n if (val) {\n charToDisplay = this.options.secure ? '*' : val;\n } else {\n // Use placeholder char if available at this index\n if (this.options.placeholder && i < this.options.placeholder.length) {\n charToDisplay = this.options.placeholder[i];\n }\n }\n\n if (i === this.cursor) {\n output += `${ANSI.REVERSE}${charToDisplay}${ANSI.RESET} `;\n } else {\n if (!val) {\n output += `${theme.muted}${charToDisplay}${ANSI.RESET} `;\n } else {\n output += `${theme.main}${charToDisplay}${ANSI.RESET} `;\n }\n }\n }\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string) {\n // Digits\n if (/^\\d$/.test(char)) {\n this.slots[this.cursor] = char;\n\n // If we are at the last slot\n if (this.cursor === this.length - 1) {\n // Only submit if all slots are filled\n if (this.slots.every(s => s !== '')) {\n this.render(false); // Update view first\n this.submit(this.slots.join(''));\n return;\n }\n }\n\n this.cursor++;\n this.render(false);\n return;\n }\n\n // Backspace\n if (char === '\\u0008' || char === '\\x7f') {\n if (this.slots[this.cursor] !== '') {\n this.slots[this.cursor] = '';\n } else if (this.cursor > 0) {\n this.cursor--;\n this.slots[this.cursor] = '';\n }\n this.render(false);\n return;\n }\n\n // Left Arrow\n if (this.isLeft(char)) {\n if (this.cursor > 0) {\n this.cursor--;\n this.render(false);\n }\n return;\n }\n\n // Right Arrow\n if (this.isRight(char)) {\n if (this.cursor < this.length - 1) {\n this.cursor++;\n this.render(false);\n }\n return;\n }\n }\n}\n"],"names":["OTPPrompt","Prompt","render","_firstRender","mask","options","output","theme","success","ANSI","RESET","BOLD","title","message","i","length","val","slots","charToDisplay","secure","placeholder","cursor","REVERSE","muted","main","renderFrame","handleInput","char","test","every","s","submit","join","isLeft","isRight","Array","fill"],"mappings":"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"}
|