mepcli 1.3.2 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -2
- package/dist/{ansi.js → src/ansi.js} +17 -9
- package/dist/src/ansi.js.map +1 -0
- package/dist/{base.js → src/base.js} +82 -70
- package/dist/src/base.js.map +1 -0
- package/dist/{core.js → src/core.js} +266 -320
- package/dist/src/core.js.map +1 -0
- package/dist/src/data/countries.js +569 -0
- package/dist/src/data/countries.js.map +1 -0
- package/dist/src/data/licenses.js +480 -0
- package/dist/src/data/licenses.js.map +1 -0
- package/dist/{highlight.js → src/highlight.js} +77 -69
- package/dist/src/highlight.js.map +1 -0
- package/dist/src/index.js +66 -0
- package/dist/src/index.js.map +1 -0
- package/dist/{input.js → src/input.js} +47 -41
- package/dist/src/input.js.map +1 -0
- package/dist/src/pipeline.js +273 -0
- package/dist/src/pipeline.js.map +1 -0
- package/dist/{prompts → src/prompts}/autocomplete.js +58 -57
- package/dist/src/prompts/autocomplete.js.map +1 -0
- package/dist/{prompts → src/prompts}/box.js +86 -53
- package/dist/src/prompts/box.js.map +1 -0
- package/dist/{prompts → src/prompts}/breadcrumb-search.js +110 -98
- package/dist/src/prompts/breadcrumb-search.js.map +1 -0
- package/dist/{prompts → src/prompts}/breadcrumb.js +126 -121
- package/dist/src/prompts/breadcrumb.js.map +1 -0
- package/dist/{prompts → src/prompts}/byte.js +69 -52
- package/dist/src/prompts/byte.js.map +1 -0
- package/dist/{prompts → src/prompts}/calculator.js +79 -56
- package/dist/src/prompts/calculator.js.map +1 -0
- package/dist/{prompts → src/prompts}/calendar.js +167 -127
- package/dist/src/prompts/calendar.js.map +1 -0
- package/dist/{prompts → src/prompts}/checkbox.js +53 -49
- package/dist/src/prompts/checkbox.js.map +1 -0
- package/dist/{prompts → src/prompts}/code.js +88 -76
- package/dist/src/prompts/code.js.map +1 -0
- package/dist/{prompts → src/prompts}/color.js +68 -50
- package/dist/src/prompts/color.js.map +1 -0
- package/dist/{prompts → src/prompts}/confirm.js +22 -15
- package/dist/src/prompts/confirm.js.map +1 -0
- package/dist/{prompts → src/prompts}/connection-string.js +59 -36
- package/dist/src/prompts/connection-string.js.map +1 -0
- package/dist/{prompts → src/prompts}/cron.js +90 -59
- package/dist/src/prompts/cron.js.map +1 -0
- package/dist/src/prompts/curl-utils.js +71 -0
- package/dist/src/prompts/curl-utils.js.map +1 -0
- package/dist/{prompts → src/prompts}/curl.js +153 -132
- package/dist/src/prompts/curl.js.map +1 -0
- package/dist/{prompts → src/prompts}/data-inspector.js +96 -91
- package/dist/src/prompts/data-inspector.js.map +1 -0
- package/dist/{prompts → src/prompts}/date.js +64 -57
- package/dist/src/prompts/date.js.map +1 -0
- package/dist/{prompts → src/prompts}/dependency.js +84 -80
- package/dist/src/prompts/dependency.js.map +1 -0
- package/dist/{prompts → src/prompts}/dial.js +49 -35
- package/dist/src/prompts/dial.js.map +1 -0
- package/dist/src/prompts/diff.js +118 -0
- package/dist/src/prompts/diff.js.map +1 -0
- package/dist/{prompts → src/prompts}/draw.js +83 -80
- package/dist/src/prompts/draw.js.map +1 -0
- package/dist/src/prompts/editor.js +234 -0
- package/dist/src/prompts/editor.js.map +1 -0
- package/dist/{prompts → src/prompts}/emoji.js +80 -82
- package/dist/src/prompts/emoji.js.map +1 -0
- package/dist/{prompts → src/prompts}/exec.js +60 -46
- package/dist/src/prompts/exec.js.map +1 -0
- package/dist/src/prompts/file.js +217 -0
- package/dist/src/prompts/file.js.map +1 -0
- package/dist/{prompts → src/prompts}/form.js +63 -54
- package/dist/src/prompts/form.js.map +1 -0
- package/dist/{prompts → src/prompts}/fuzzy-multi-column.js +65 -53
- package/dist/src/prompts/fuzzy-multi-column.js.map +1 -0
- package/dist/{prompts → src/prompts}/fuzzy.js +66 -55
- package/dist/src/prompts/fuzzy.js.map +1 -0
- package/dist/src/prompts/gauge.js +137 -0
- package/dist/src/prompts/gauge.js.map +1 -0
- package/dist/{prompts → src/prompts}/grid.js +70 -57
- package/dist/src/prompts/grid.js.map +1 -0
- package/dist/{prompts → src/prompts}/heatmap.js +70 -64
- package/dist/src/prompts/heatmap.js.map +1 -0
- package/dist/{prompts → src/prompts}/ip.js +56 -36
- package/dist/src/prompts/ip.js.map +1 -0
- package/dist/{prompts → src/prompts}/kanban.js +63 -58
- package/dist/src/prompts/kanban.js.map +1 -0
- package/dist/src/prompts/keypress.js +54 -0
- package/dist/src/prompts/keypress.js.map +1 -0
- package/dist/src/prompts/license.js +144 -0
- package/dist/src/prompts/license.js.map +1 -0
- package/dist/{prompts → src/prompts}/list.js +46 -31
- package/dist/src/prompts/list.js.map +1 -0
- package/dist/{prompts → src/prompts}/map.js +93 -77
- package/dist/src/prompts/map.js.map +1 -0
- package/dist/{prompts → src/prompts}/match.js +91 -95
- package/dist/src/prompts/match.js.map +1 -0
- package/dist/{prompts → src/prompts}/miller.js +74 -67
- package/dist/src/prompts/miller.js.map +1 -0
- package/dist/{prompts → src/prompts}/multi-column-select.js +54 -44
- package/dist/src/prompts/multi-column-select.js.map +1 -0
- package/dist/{prompts → src/prompts}/multi-range.js +70 -52
- package/dist/src/prompts/multi-range.js.map +1 -0
- package/dist/{prompts → src/prompts}/multi-select.js +67 -58
- package/dist/src/prompts/multi-select.js.map +1 -0
- package/dist/{prompts → src/prompts}/number.js +51 -39
- package/dist/src/prompts/number.js.map +1 -0
- package/dist/{prompts → src/prompts}/otp.js +43 -27
- package/dist/src/prompts/otp.js.map +1 -0
- package/dist/{prompts → src/prompts}/pattern.js +74 -71
- package/dist/src/prompts/pattern.js.map +1 -0
- package/dist/{prompts → src/prompts}/phone.js +107 -118
- package/dist/src/prompts/phone.js.map +1 -0
- package/dist/src/prompts/quiz-select.js +114 -0
- package/dist/src/prompts/quiz-select.js.map +1 -0
- package/dist/src/prompts/quiz-text.js +98 -0
- package/dist/src/prompts/quiz-text.js.map +1 -0
- package/dist/{prompts → src/prompts}/range.js +85 -61
- package/dist/src/prompts/range.js.map +1 -0
- package/dist/{prompts → src/prompts}/rating.js +29 -24
- package/dist/src/prompts/rating.js.map +1 -0
- package/dist/{prompts → src/prompts}/regex.js +50 -36
- package/dist/src/prompts/regex.js.map +1 -0
- package/dist/{prompts → src/prompts}/region.js +62 -56
- package/dist/src/prompts/region.js.map +1 -0
- package/dist/{prompts → src/prompts}/schedule.js +82 -75
- package/dist/src/prompts/schedule.js.map +1 -0
- package/dist/{prompts → src/prompts}/scroll.js +61 -58
- package/dist/src/prompts/scroll.js.map +1 -0
- package/dist/src/prompts/seat.js +164 -0
- package/dist/src/prompts/seat.js.map +1 -0
- package/dist/{prompts → src/prompts}/select-range.js +58 -46
- package/dist/src/prompts/select-range.js.map +1 -0
- package/dist/{prompts → src/prompts}/select.js +65 -66
- package/dist/src/prompts/select.js.map +1 -0
- package/dist/{prompts → src/prompts}/semver.js +24 -13
- package/dist/src/prompts/semver.js.map +1 -0
- package/dist/src/prompts/shortcut.js +133 -0
- package/dist/src/prompts/shortcut.js.map +1 -0
- package/dist/{prompts → src/prompts}/slider.js +28 -23
- package/dist/src/prompts/slider.js.map +1 -0
- package/dist/src/prompts/slot.js +117 -0
- package/dist/src/prompts/slot.js.map +1 -0
- package/dist/{prompts → src/prompts}/snippet.js +82 -61
- package/dist/src/prompts/snippet.js.map +1 -0
- package/dist/{prompts → src/prompts}/sort-grid.js +64 -59
- package/dist/src/prompts/sort-grid.js.map +1 -0
- package/dist/{prompts → src/prompts}/sort.js +59 -49
- package/dist/src/prompts/sort.js.map +1 -0
- package/dist/src/prompts/spam.js +80 -0
- package/dist/src/prompts/spam.js.map +1 -0
- package/dist/{prompts → src/prompts}/spreadsheet.js +71 -70
- package/dist/src/prompts/spreadsheet.js.map +1 -0
- package/dist/{prompts → src/prompts}/table.js +52 -38
- package/dist/src/prompts/table.js.map +1 -0
- package/dist/{prompts → src/prompts}/text.js +74 -70
- package/dist/src/prompts/text.js.map +1 -0
- package/dist/{prompts → src/prompts}/time.js +105 -96
- package/dist/src/prompts/time.js.map +1 -0
- package/dist/src/prompts/toggle.js +53 -0
- package/dist/src/prompts/toggle.js.map +1 -0
- package/dist/{prompts → src/prompts}/transfer.js +71 -67
- package/dist/src/prompts/transfer.js.map +1 -0
- package/dist/{prompts → src/prompts}/tree-select.js +83 -86
- package/dist/src/prompts/tree-select.js.map +1 -0
- package/dist/{prompts → src/prompts}/tree.js +69 -67
- package/dist/src/prompts/tree.js.map +1 -0
- package/dist/src/prompts/wait.js +79 -0
- package/dist/src/prompts/wait.js.map +1 -0
- package/dist/src/spinner.js +105 -0
- package/dist/src/spinner.js.map +1 -0
- package/dist/{symbols.js → src/symbols.js} +32 -7
- package/dist/src/symbols.js.map +1 -0
- package/dist/{tasks.js → src/tasks.js} +104 -79
- package/dist/src/tasks.js.map +1 -0
- package/dist/src/theme.js +29 -0
- package/dist/src/theme.js.map +1 -0
- package/dist/src/types.js +8 -0
- package/dist/src/types.js.map +1 -0
- package/dist/{utils.js → src/utils.js} +196 -152
- package/dist/src/utils.js.map +1 -0
- package/package.json +16 -13
- package/dist/ansi.d.ts +0 -36
- package/dist/base.d.ts +0 -60
- package/dist/core.d.ts +0 -1072
- package/dist/data/countries.d.ts +0 -2
- package/dist/data/countries.js +0 -105
- package/dist/data/licenses.d.ts +0 -2
- package/dist/data/licenses.js +0 -109
- package/dist/highlight.d.ts +0 -7
- package/dist/index.d.ts +0 -48
- package/dist/index.js +0 -64
- package/dist/input.d.ts +0 -14
- package/dist/pipeline.d.ts +0 -39
- package/dist/pipeline.js +0 -54
- package/dist/prompts/autocomplete.d.ts +0 -22
- package/dist/prompts/box.d.ts +0 -21
- package/dist/prompts/breadcrumb-search.d.ts +0 -14
- package/dist/prompts/breadcrumb.d.ts +0 -32
- package/dist/prompts/byte.d.ts +0 -13
- package/dist/prompts/calculator.d.ts +0 -17
- package/dist/prompts/calendar.d.ts +0 -33
- package/dist/prompts/checkbox.d.ts +0 -13
- package/dist/prompts/code.d.ts +0 -19
- package/dist/prompts/color.d.ts +0 -14
- package/dist/prompts/confirm.d.ts +0 -8
- package/dist/prompts/connection-string.d.ts +0 -18
- package/dist/prompts/cron.d.ts +0 -13
- package/dist/prompts/curl-utils.d.ts +0 -25
- package/dist/prompts/curl-utils.js +0 -41
- package/dist/prompts/curl.d.ts +0 -41
- package/dist/prompts/data-inspector.d.ts +0 -22
- package/dist/prompts/date.d.ts +0 -12
- package/dist/prompts/dependency.d.ts +0 -16
- package/dist/prompts/dial.d.ts +0 -10
- package/dist/prompts/diff.d.ts +0 -10
- package/dist/prompts/diff.js +0 -101
- package/dist/prompts/draw.d.ts +0 -20
- package/dist/prompts/editor.d.ts +0 -14
- package/dist/prompts/editor.js +0 -203
- package/dist/prompts/emoji.d.ts +0 -18
- package/dist/prompts/exec.d.ts +0 -17
- package/dist/prompts/file.d.ts +0 -21
- package/dist/prompts/file.js +0 -210
- package/dist/prompts/form.d.ts +0 -18
- package/dist/prompts/fuzzy-multi-column.d.ts +0 -12
- package/dist/prompts/fuzzy.d.ts +0 -12
- package/dist/prompts/gauge.d.ts +0 -21
- package/dist/prompts/gauge.js +0 -130
- package/dist/prompts/grid.d.ts +0 -14
- package/dist/prompts/heatmap.d.ts +0 -13
- package/dist/prompts/ip.d.ts +0 -11
- package/dist/prompts/kanban.d.ts +0 -17
- package/dist/prompts/keypress.d.ts +0 -7
- package/dist/prompts/keypress.js +0 -55
- package/dist/prompts/license.d.ts +0 -9
- package/dist/prompts/license.js +0 -105
- package/dist/prompts/list.d.ts +0 -9
- package/dist/prompts/map.d.ts +0 -17
- package/dist/prompts/match.d.ts +0 -19
- package/dist/prompts/miller.d.ts +0 -15
- package/dist/prompts/multi-column-select.d.ts +0 -10
- package/dist/prompts/multi-range.d.ts +0 -9
- package/dist/prompts/multi-select.d.ts +0 -15
- package/dist/prompts/number.d.ts +0 -11
- package/dist/prompts/otp.d.ts +0 -10
- package/dist/prompts/pattern.d.ts +0 -22
- package/dist/prompts/phone.d.ts +0 -41
- package/dist/prompts/quiz-select.d.ts +0 -10
- package/dist/prompts/quiz-select.js +0 -104
- package/dist/prompts/quiz-text.d.ts +0 -11
- package/dist/prompts/quiz-text.js +0 -82
- package/dist/prompts/range.d.ts +0 -9
- package/dist/prompts/rating.d.ts +0 -8
- package/dist/prompts/regex.d.ts +0 -13
- package/dist/prompts/region.d.ts +0 -11
- package/dist/prompts/schedule.d.ts +0 -20
- package/dist/prompts/scroll.d.ts +0 -13
- package/dist/prompts/seat.d.ts +0 -17
- package/dist/prompts/seat.js +0 -165
- package/dist/prompts/select-range.d.ts +0 -8
- package/dist/prompts/select.d.ts +0 -15
- package/dist/prompts/semver.d.ts +0 -6
- package/dist/prompts/shortcut.d.ts +0 -9
- package/dist/prompts/shortcut.js +0 -135
- package/dist/prompts/slider.d.ts +0 -8
- package/dist/prompts/slot.d.ts +0 -16
- package/dist/prompts/slot.js +0 -107
- package/dist/prompts/snippet.d.ts +0 -19
- package/dist/prompts/sort-grid.d.ts +0 -16
- package/dist/prompts/sort.d.ts +0 -14
- package/dist/prompts/spam.d.ts +0 -17
- package/dist/prompts/spam.js +0 -62
- package/dist/prompts/spreadsheet.d.ts +0 -21
- package/dist/prompts/table.d.ts +0 -14
- package/dist/prompts/text.d.ts +0 -17
- package/dist/prompts/time.d.ts +0 -12
- package/dist/prompts/toggle.d.ts +0 -8
- package/dist/prompts/toggle.js +0 -47
- package/dist/prompts/transfer.d.ts +0 -18
- package/dist/prompts/tree-select.d.ts +0 -31
- package/dist/prompts/tree.d.ts +0 -20
- package/dist/prompts/wait.d.ts +0 -18
- package/dist/prompts/wait.js +0 -62
- package/dist/spinner.d.ts +0 -33
- package/dist/spinner.js +0 -89
- package/dist/symbols.d.ts +0 -33
- package/dist/tasks.d.ts +0 -57
- package/dist/theme.d.ts +0 -2
- package/dist/theme.js +0 -20
- package/dist/types.d.ts +0 -503
- package/dist/types.js +0 -5
- package/dist/utils.d.ts +0 -81
|
@@ -1,62 +1,67 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "GridPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return GridPrompt;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _ansi = require("../ansi");
|
|
12
|
+
const _base = require("../base");
|
|
13
|
+
const _theme = require("../theme");
|
|
14
|
+
const _utils = require("../utils");
|
|
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;
|
|
23
25
|
}
|
|
26
|
+
return obj;
|
|
27
|
+
}
|
|
28
|
+
let GridPrompt = class GridPrompt extends _base.Prompt {
|
|
24
29
|
calculateLayout() {
|
|
25
30
|
// Calculate max width for row labels
|
|
26
31
|
this.rowLabelWidth = 0;
|
|
27
|
-
for (const row of this.options.rows)
|
|
28
|
-
this.rowLabelWidth = Math.max(this.rowLabelWidth, (0,
|
|
32
|
+
for (const row of this.options.rows){
|
|
33
|
+
this.rowLabelWidth = Math.max(this.rowLabelWidth, (0, _utils.stringWidth)(row));
|
|
29
34
|
}
|
|
30
35
|
// Calculate width for each column
|
|
31
|
-
this.columnWidths = this.options.columns.map(col
|
|
36
|
+
this.columnWidths = this.options.columns.map((col)=>{
|
|
32
37
|
// Header width vs Cell width (3 chars for "[ ]")
|
|
33
|
-
return Math.max((0,
|
|
38
|
+
return Math.max((0, _utils.stringWidth)(col), 3);
|
|
34
39
|
});
|
|
35
40
|
}
|
|
36
41
|
render(_firstRender) {
|
|
37
42
|
const { rows, columns } = this.options;
|
|
38
|
-
let output = `${
|
|
43
|
+
let output = `${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}\n`;
|
|
39
44
|
// Render Header
|
|
40
45
|
// Padding for the row label column
|
|
41
46
|
output += ' '.repeat(this.rowLabelWidth + 2); // +2 for spacing/border
|
|
42
|
-
output += columns.map((col, i)
|
|
47
|
+
output += columns.map((col, i)=>{
|
|
43
48
|
const width = this.columnWidths[i];
|
|
44
|
-
const padding = width - (0,
|
|
49
|
+
const padding = width - (0, _utils.stringWidth)(col);
|
|
45
50
|
const leftPad = Math.floor(padding / 2);
|
|
46
51
|
const rightPad = padding - leftPad;
|
|
47
|
-
return `${
|
|
52
|
+
return `${_theme.theme.muted}${' '.repeat(leftPad)}${col}${' '.repeat(rightPad)}${_ansi.ANSI.RESET}`;
|
|
48
53
|
}).join(' ') + '\n';
|
|
49
54
|
// Render Rows
|
|
50
|
-
for
|
|
55
|
+
for(let r = 0; r < rows.length; r++){
|
|
51
56
|
const rowLabel = rows[r];
|
|
52
|
-
const labelPadding = this.rowLabelWidth - (0,
|
|
57
|
+
const labelPadding = this.rowLabelWidth - (0, _utils.stringWidth)(rowLabel);
|
|
53
58
|
// Row Label
|
|
54
|
-
output += `${
|
|
59
|
+
output += `${_theme.theme.muted}${rowLabel}${' '.repeat(labelPadding)}${_ansi.ANSI.RESET} `;
|
|
55
60
|
// Cells
|
|
56
|
-
const cells = this.selected[r].map((isChecked, c)
|
|
57
|
-
const isFocused =
|
|
61
|
+
const cells = this.selected[r].map((isChecked, c)=>{
|
|
62
|
+
const isFocused = r === this.cursorRow && c === this.cursorCol;
|
|
58
63
|
const width = this.columnWidths[c];
|
|
59
|
-
const content = isChecked ? `[${
|
|
64
|
+
const content = isChecked ? `[${_theme.theme.success}x${_ansi.ANSI.RESET}]` : '[ ]';
|
|
60
65
|
// content string width is 3 (ignoring ansi)
|
|
61
66
|
const padding = width - 3;
|
|
62
67
|
const leftPad = Math.floor(padding / 2);
|
|
@@ -65,13 +70,13 @@ class GridPrompt extends base_1.Prompt {
|
|
|
65
70
|
if (isFocused) {
|
|
66
71
|
// Highlight the focused cell
|
|
67
72
|
// If we use ANSI.REVERSE on the whole cell including padding:
|
|
68
|
-
cellStr = `${
|
|
73
|
+
cellStr = `${_ansi.ANSI.REVERSE}${cellStr}${_ansi.ANSI.RESET}`;
|
|
69
74
|
}
|
|
70
75
|
return cellStr;
|
|
71
76
|
});
|
|
72
77
|
output += cells.join(' ') + '\n';
|
|
73
78
|
}
|
|
74
|
-
output += `${
|
|
79
|
+
output += `${_theme.theme.muted}Arrows to move, Space to toggle, Enter to submit${_ansi.ANSI.RESET}`;
|
|
75
80
|
this.renderFrame(output);
|
|
76
81
|
}
|
|
77
82
|
handleInput(char, _key) {
|
|
@@ -80,14 +85,10 @@ class GridPrompt extends base_1.Prompt {
|
|
|
80
85
|
const isLeft = this.isLeft(char);
|
|
81
86
|
const isRight = this.isRight(char);
|
|
82
87
|
if (isUp || isDown || isLeft || isRight) {
|
|
83
|
-
if (isUp)
|
|
84
|
-
|
|
85
|
-
if (
|
|
86
|
-
|
|
87
|
-
if (isLeft)
|
|
88
|
-
this.cursorCol = Math.max(0, this.cursorCol - 1);
|
|
89
|
-
if (isRight)
|
|
90
|
-
this.cursorCol = Math.min(this.options.columns.length - 1, this.cursorCol + 1);
|
|
88
|
+
if (isUp) this.cursorRow = Math.max(0, this.cursorRow - 1);
|
|
89
|
+
if (isDown) this.cursorRow = Math.min(this.options.rows.length - 1, this.cursorRow + 1);
|
|
90
|
+
if (isLeft) this.cursorCol = Math.max(0, this.cursorCol - 1);
|
|
91
|
+
if (isRight) this.cursorCol = Math.min(this.options.columns.length - 1, this.cursorCol + 1);
|
|
91
92
|
this.render(false);
|
|
92
93
|
return;
|
|
93
94
|
}
|
|
@@ -127,35 +128,35 @@ class GridPrompt extends base_1.Prompt {
|
|
|
127
128
|
// r: Toggle Row
|
|
128
129
|
if (char === 'r') {
|
|
129
130
|
const row = this.selected[this.cursorRow];
|
|
130
|
-
const allSelected = row.every(c
|
|
131
|
-
this.selected[this.cursorRow] = row.map(()
|
|
131
|
+
const allSelected = row.every((c)=>c);
|
|
132
|
+
this.selected[this.cursorRow] = row.map(()=>!allSelected);
|
|
132
133
|
this.render(false);
|
|
133
134
|
return;
|
|
134
135
|
}
|
|
135
136
|
// c: Toggle Column
|
|
136
137
|
if (char === 'c') {
|
|
137
138
|
const colIdx = this.cursorCol;
|
|
138
|
-
const colValues = this.selected.map(row
|
|
139
|
-
const allSelected = colValues.every(c
|
|
140
|
-
this.selected.forEach(row
|
|
139
|
+
const colValues = this.selected.map((row)=>row[colIdx]);
|
|
140
|
+
const allSelected = colValues.every((c)=>c);
|
|
141
|
+
this.selected.forEach((row)=>row[colIdx] = !allSelected);
|
|
141
142
|
this.render(false);
|
|
142
143
|
return;
|
|
143
144
|
}
|
|
144
145
|
// a: Select All
|
|
145
146
|
if (char === 'a') {
|
|
146
|
-
this.selected = this.selected.map(row
|
|
147
|
+
this.selected = this.selected.map((row)=>row.map(()=>true));
|
|
147
148
|
this.render(false);
|
|
148
149
|
return;
|
|
149
150
|
}
|
|
150
151
|
// x: Deselect All
|
|
151
152
|
if (char === 'x') {
|
|
152
|
-
this.selected = this.selected.map(row
|
|
153
|
+
this.selected = this.selected.map((row)=>row.map(()=>false));
|
|
153
154
|
this.render(false);
|
|
154
155
|
return;
|
|
155
156
|
}
|
|
156
157
|
// i: Invert
|
|
157
158
|
if (char === 'i') {
|
|
158
|
-
this.selected = this.selected.map(row
|
|
159
|
+
this.selected = this.selected.map((row)=>row.map((v)=>!v));
|
|
159
160
|
this.render(false);
|
|
160
161
|
return;
|
|
161
162
|
}
|
|
@@ -166,13 +167,25 @@ class GridPrompt extends base_1.Prompt {
|
|
|
166
167
|
if (event.shift) {
|
|
167
168
|
// Horizontal (Column)
|
|
168
169
|
this.cursorCol = Math.max(0, Math.min(this.options.columns.length - 1, this.cursorCol + direction));
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
170
|
+
} else {
|
|
171
171
|
// Vertical (Row)
|
|
172
172
|
this.cursorRow = Math.max(0, Math.min(this.options.rows.length - 1, this.cursorRow + direction));
|
|
173
173
|
}
|
|
174
174
|
this.render(false);
|
|
175
175
|
}
|
|
176
176
|
}
|
|
177
|
-
|
|
178
|
-
|
|
177
|
+
constructor(options){
|
|
178
|
+
super(options), _define_property(this, "cursorRow", 0), _define_property(this, "cursorCol", 0), _define_property(this, "selected", void 0), _define_property(this, "columnWidths", []), _define_property(this, "rowLabelWidth", 0);
|
|
179
|
+
// Initialize selection matrix
|
|
180
|
+
if (options.initial) {
|
|
181
|
+
this.selected = options.initial.map((row)=>[
|
|
182
|
+
...row
|
|
183
|
+
]);
|
|
184
|
+
} else {
|
|
185
|
+
this.selected = options.rows.map(()=>new Array(options.columns.length).fill(false));
|
|
186
|
+
}
|
|
187
|
+
this.calculateLayout();
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
//# sourceMappingURL=grid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/grid.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { GridOptions, MouseEvent } from '../types';\nimport { stringWidth } from '../utils';\n\nexport class GridPrompt extends Prompt<boolean[][], GridOptions> {\n private cursorRow: number = 0;\n private cursorCol: number = 0;\n private selected: boolean[][];\n private columnWidths: number[] = [];\n private rowLabelWidth: number = 0;\n\n constructor(options: GridOptions) {\n super(options);\n // Initialize selection matrix\n if (options.initial) {\n this.selected = options.initial.map(row => [...row]);\n } else {\n this.selected = options.rows.map(() =>\n new Array(options.columns.length).fill(false)\n );\n }\n\n this.calculateLayout();\n }\n\n private calculateLayout() {\n // Calculate max width for row labels\n this.rowLabelWidth = 0;\n for (const row of this.options.rows) {\n this.rowLabelWidth = Math.max(this.rowLabelWidth, stringWidth(row));\n }\n\n // Calculate width for each column\n this.columnWidths = this.options.columns.map(col => {\n // Header width vs Cell width (3 chars for \"[ ]\")\n return Math.max(stringWidth(col), 3);\n });\n }\n\n protected render(_firstRender: boolean): void {\n const { rows, columns } = this.options;\n\n let output = `${theme.title}${this.options.message}${ANSI.RESET}\\n`;\n\n // Render Header\n // Padding for the row label column\n output += ' '.repeat(this.rowLabelWidth + 2); // +2 for spacing/border\n\n output += columns.map((col, i) => {\n const width = this.columnWidths[i];\n const padding = width - stringWidth(col);\n const leftPad = Math.floor(padding / 2);\n const rightPad = padding - leftPad;\n return `${theme.muted}${' '.repeat(leftPad)}${col}${' '.repeat(rightPad)}${ANSI.RESET}`;\n }).join(' ') + '\\n';\n\n // Render Rows\n for (let r = 0; r < rows.length; r++) {\n const rowLabel = rows[r];\n const labelPadding = this.rowLabelWidth - stringWidth(rowLabel);\n\n // Row Label\n output += `${theme.muted}${rowLabel}${' '.repeat(labelPadding)}${ANSI.RESET} `;\n\n // Cells\n const cells = this.selected[r].map((isChecked, c) => {\n const isFocused = (r === this.cursorRow && c === this.cursorCol);\n const width = this.columnWidths[c];\n const content = isChecked ? `[${theme.success}x${ANSI.RESET}]` : '[ ]';\n // content string width is 3 (ignoring ansi)\n const padding = width - 3;\n const leftPad = Math.floor(padding / 2);\n const rightPad = padding - leftPad;\n\n let cellStr = `${' '.repeat(leftPad)}${content}${' '.repeat(rightPad)}`;\n\n if (isFocused) {\n // Highlight the focused cell\n // If we use ANSI.REVERSE on the whole cell including padding:\n cellStr = `${ANSI.REVERSE}${cellStr}${ANSI.RESET}`;\n }\n\n return cellStr;\n });\n\n output += cells.join(' ') + '\\n';\n }\n\n output += `${theme.muted}Arrows to move, Space to toggle, Enter to submit${ANSI.RESET}`;\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string, _key: Buffer): void {\n const isUp = this.isUp(char);\n const isDown = this.isDown(char);\n const isLeft = this.isLeft(char);\n const isRight = this.isRight(char);\n\n if (isUp || isDown || isLeft || isRight) {\n if (isUp) this.cursorRow = Math.max(0, this.cursorRow - 1);\n if (isDown) this.cursorRow = Math.min(this.options.rows.length - 1, this.cursorRow + 1);\n if (isLeft) this.cursorCol = Math.max(0, this.cursorCol - 1);\n if (isRight) this.cursorCol = Math.min(this.options.columns.length - 1, this.cursorCol + 1);\n\n this.render(false);\n return;\n }\n\n if (char === ' ') {\n this.selected[this.cursorRow][this.cursorCol] = !this.selected[this.cursorRow][this.cursorCol];\n this.render(false);\n return;\n }\n\n if (char === '\\r' || char === '\\n') {\n this.submit(this.selected);\n return;\n }\n\n // PageUp (First Row)\n if (char === '\\x1b[5~') {\n this.cursorRow = 0;\n this.render(false);\n return;\n }\n // PageDown (Last Row)\n if (char === '\\x1b[6~') {\n this.cursorRow = this.options.rows.length - 1;\n this.render(false);\n return;\n }\n // Home (First Column)\n if (char === '\\x1b[H' || char === '\\x1b[1~') {\n this.cursorCol = 0;\n this.render(false);\n return;\n }\n // End (Last Column)\n if (char === '\\x1b[F' || char === '\\x1b[4~') {\n this.cursorCol = this.options.columns.length - 1;\n this.render(false);\n return;\n }\n\n // r: Toggle Row\n if (char === 'r') {\n const row = this.selected[this.cursorRow];\n const allSelected = row.every(c => c);\n this.selected[this.cursorRow] = row.map(() => !allSelected);\n this.render(false);\n return;\n }\n\n // c: Toggle Column\n if (char === 'c') {\n const colIdx = this.cursorCol;\n const colValues = this.selected.map(row => row[colIdx]);\n const allSelected = colValues.every(c => c);\n this.selected.forEach(row => row[colIdx] = !allSelected);\n this.render(false);\n return;\n }\n\n // a: Select All\n if (char === 'a') {\n this.selected = this.selected.map(row => row.map(() => true));\n this.render(false);\n return;\n }\n\n // x: Deselect All\n if (char === 'x') {\n this.selected = this.selected.map(row => row.map(() => false));\n this.render(false);\n return;\n }\n\n // i: Invert\n if (char === 'i') {\n this.selected = this.selected.map(row => row.map(v => !v));\n this.render(false);\n return;\n }\n }\n\n protected handleMouse(event: MouseEvent): void {\n if (event.action === 'scroll') {\n const direction = event.scroll === 'up' ? -1 : 1;\n\n if (event.shift) {\n // Horizontal (Column)\n this.cursorCol = Math.max(0, Math.min(this.options.columns.length - 1, this.cursorCol + direction));\n } else {\n // Vertical (Row)\n this.cursorRow = Math.max(0, Math.min(this.options.rows.length - 1, this.cursorRow + direction));\n }\n this.render(false);\n }\n }\n}\n"],"names":["GridPrompt","Prompt","calculateLayout","rowLabelWidth","row","options","rows","Math","max","stringWidth","columnWidths","columns","map","col","render","_firstRender","output","theme","title","message","ANSI","RESET","repeat","i","width","padding","leftPad","floor","rightPad","muted","join","r","length","rowLabel","labelPadding","cells","selected","isChecked","c","isFocused","cursorRow","cursorCol","content","success","cellStr","REVERSE","renderFrame","handleInput","char","_key","isUp","isDown","isLeft","isRight","min","submit","allSelected","every","colIdx","colValues","forEach","v","handleMouse","event","action","direction","scroll","shift","initial","Array","fill"],"mappings":"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"}
|
|
@@ -1,50 +1,53 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
this.cursorRow = 0;
|
|
10
|
-
this.cursorCol = 0;
|
|
11
|
-
// Initialize grid
|
|
12
|
-
const rows = options.rows.length;
|
|
13
|
-
const cols = options.columns.length;
|
|
14
|
-
if (options.initial) {
|
|
15
|
-
this.grid = options.initial.map(row => [...row]);
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
this.grid = Array.from({ length: rows }, () => Array(cols).fill(0));
|
|
19
|
-
}
|
|
20
|
-
// Get sorted valid values for cycling
|
|
21
|
-
this.validValues = options.legend.map(l => l.value).sort((a, b) => a - b);
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "HeatmapPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return HeatmapPrompt;
|
|
22
9
|
}
|
|
10
|
+
});
|
|
11
|
+
const _base = require("../base");
|
|
12
|
+
const _ansi = require("../ansi");
|
|
13
|
+
function _define_property(obj, key, value) {
|
|
14
|
+
if (key in obj) {
|
|
15
|
+
Object.defineProperty(obj, key, {
|
|
16
|
+
value: value,
|
|
17
|
+
enumerable: true,
|
|
18
|
+
configurable: true,
|
|
19
|
+
writable: true
|
|
20
|
+
});
|
|
21
|
+
} else {
|
|
22
|
+
obj[key] = value;
|
|
23
|
+
}
|
|
24
|
+
return obj;
|
|
25
|
+
}
|
|
26
|
+
let HeatmapPrompt = class HeatmapPrompt extends _base.Prompt {
|
|
23
27
|
render(_firstRender) {
|
|
24
|
-
let output = `${
|
|
28
|
+
let output = `${_ansi.ANSI.FG_CYAN}? ${this.options.message}${_ansi.ANSI.RESET}\n`;
|
|
25
29
|
// Render Column Headers
|
|
26
30
|
output += ' '; // Offset for row labels
|
|
27
|
-
this.options.columns.forEach(col
|
|
31
|
+
this.options.columns.forEach((col)=>{
|
|
28
32
|
// Show first 2 chars
|
|
29
33
|
const label = col.substring(0, 2).padEnd(2);
|
|
30
34
|
output += ` ${label} `;
|
|
31
35
|
});
|
|
32
36
|
output += '\n';
|
|
33
37
|
// Grid
|
|
34
|
-
for
|
|
38
|
+
for(let r = 0; r < this.options.rows.length; r++){
|
|
35
39
|
const rowLabel = this.options.rows[r].substring(0, 4).padStart(4);
|
|
36
|
-
output += `${
|
|
37
|
-
for
|
|
40
|
+
output += `${_ansi.ANSI.FG_GRAY}${rowLabel} ${_ansi.ANSI.RESET}`;
|
|
41
|
+
for(let c = 0; c < this.options.columns.length; c++){
|
|
38
42
|
const val = this.grid[r][c];
|
|
39
43
|
const legend = this.getLegend(val);
|
|
40
44
|
const char = legend?.char || '?';
|
|
41
|
-
const color = legend?.color || ((s)
|
|
45
|
+
const color = legend?.color || ((s)=>s);
|
|
42
46
|
const isCursor = r === this.cursorRow && c === this.cursorCol;
|
|
43
47
|
const cellContent = color(char);
|
|
44
48
|
if (isCursor) {
|
|
45
49
|
output += `[${cellContent}]`; // Brackets around
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
50
|
+
} else {
|
|
48
51
|
output += ` ${cellContent} `;
|
|
49
52
|
}
|
|
50
53
|
}
|
|
@@ -52,50 +55,39 @@ class HeatmapPrompt extends base_1.Prompt {
|
|
|
52
55
|
}
|
|
53
56
|
// Legend
|
|
54
57
|
output += '\nLegend: ';
|
|
55
|
-
this.options.legend.forEach(l
|
|
58
|
+
this.options.legend.forEach((l)=>{
|
|
56
59
|
output += `${l.value}:${l.color(l.char)} `;
|
|
57
60
|
});
|
|
58
|
-
output += '\n' +
|
|
61
|
+
output += '\n' + _ansi.ANSI.FG_GRAY + "(Arrows to move, Space to cycle, 0-9 to set)" + _ansi.ANSI.RESET;
|
|
59
62
|
this.renderFrame(output);
|
|
60
63
|
}
|
|
61
64
|
getLegend(val) {
|
|
62
|
-
return this.options.legend.find(l
|
|
65
|
+
return this.options.legend.find((l)=>l.value === val);
|
|
63
66
|
}
|
|
64
67
|
handleMouse(event) {
|
|
65
68
|
if (event.action === 'scroll') {
|
|
66
69
|
if (event.scroll === 'up') {
|
|
67
|
-
if (this.cursorRow > 0)
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
else if (event.scroll === 'down') {
|
|
71
|
-
if (this.cursorRow < this.options.rows.length - 1)
|
|
72
|
-
this.cursorRow++;
|
|
70
|
+
if (this.cursorRow > 0) this.cursorRow--;
|
|
71
|
+
} else if (event.scroll === 'down') {
|
|
72
|
+
if (this.cursorRow < this.options.rows.length - 1) this.cursorRow++;
|
|
73
73
|
}
|
|
74
74
|
this.render(false);
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
handleInput(char, _key) {
|
|
78
|
-
if (char === '\r' || char === '\n') {
|
|
78
|
+
if (char === '\r' || char === '\n') {
|
|
79
79
|
this.submit(this.grid);
|
|
80
80
|
return;
|
|
81
81
|
}
|
|
82
82
|
if (this.isUp(char)) {
|
|
83
|
-
if (this.cursorRow > 0)
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
else if (this.
|
|
87
|
-
if (this.
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
else if (
|
|
91
|
-
if (this.cursorCol > 0)
|
|
92
|
-
this.cursorCol--;
|
|
93
|
-
}
|
|
94
|
-
else if (this.isRight(char)) {
|
|
95
|
-
if (this.cursorCol < this.options.columns.length - 1)
|
|
96
|
-
this.cursorCol++;
|
|
97
|
-
}
|
|
98
|
-
else if (char === '\t') { // Tab -> Right (Cycle)
|
|
83
|
+
if (this.cursorRow > 0) this.cursorRow--;
|
|
84
|
+
} else if (this.isDown(char)) {
|
|
85
|
+
if (this.cursorRow < this.options.rows.length - 1) this.cursorRow++;
|
|
86
|
+
} else if (this.isLeft(char)) {
|
|
87
|
+
if (this.cursorCol > 0) this.cursorCol--;
|
|
88
|
+
} else if (this.isRight(char)) {
|
|
89
|
+
if (this.cursorCol < this.options.columns.length - 1) this.cursorCol++;
|
|
90
|
+
} else if (char === '\t') {
|
|
99
91
|
this.cursorCol++;
|
|
100
92
|
if (this.cursorCol >= this.options.columns.length) {
|
|
101
93
|
this.cursorCol = 0;
|
|
@@ -104,8 +96,7 @@ class HeatmapPrompt extends base_1.Prompt {
|
|
|
104
96
|
this.cursorRow = 0;
|
|
105
97
|
}
|
|
106
98
|
}
|
|
107
|
-
}
|
|
108
|
-
else if (char === '\u001b[Z') { // Shift+Tab -> Left (Cycle)
|
|
99
|
+
} else if (char === '\u001b[Z') {
|
|
109
100
|
this.cursorCol--;
|
|
110
101
|
if (this.cursorCol < 0) {
|
|
111
102
|
this.cursorCol = this.options.columns.length - 1;
|
|
@@ -114,21 +105,18 @@ class HeatmapPrompt extends base_1.Prompt {
|
|
|
114
105
|
this.cursorRow = this.options.rows.length - 1;
|
|
115
106
|
}
|
|
116
107
|
}
|
|
117
|
-
}
|
|
118
|
-
else if (char === ' ') {
|
|
108
|
+
} else if (char === ' ') {
|
|
119
109
|
const val = this.grid[this.cursorRow][this.cursorCol];
|
|
120
110
|
const idx = this.validValues.indexOf(val);
|
|
121
111
|
let nextVal;
|
|
122
112
|
if (idx === -1) {
|
|
123
113
|
// If current val not in legend (maybe init with invalid), reset to first
|
|
124
114
|
nextVal = this.validValues[0];
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
115
|
+
} else {
|
|
127
116
|
nextVal = this.validValues[(idx + 1) % this.validValues.length];
|
|
128
117
|
}
|
|
129
118
|
this.grid[this.cursorRow][this.cursorCol] = nextVal;
|
|
130
|
-
}
|
|
131
|
-
else if (/[0-9]/.test(char)) {
|
|
119
|
+
} else if (/[0-9]/.test(char)) {
|
|
132
120
|
const num = parseInt(char, 10);
|
|
133
121
|
// Only set if valid in legend
|
|
134
122
|
if (this.validValues.includes(num)) {
|
|
@@ -137,5 +125,23 @@ class HeatmapPrompt extends base_1.Prompt {
|
|
|
137
125
|
}
|
|
138
126
|
this.render(false);
|
|
139
127
|
}
|
|
140
|
-
|
|
141
|
-
|
|
128
|
+
constructor(options){
|
|
129
|
+
super(options), _define_property(this, "grid", void 0), _define_property(this, "cursorRow", 0), _define_property(this, "cursorCol", 0), _define_property(this, "validValues", void 0);
|
|
130
|
+
// Initialize grid
|
|
131
|
+
const rows = options.rows.length;
|
|
132
|
+
const cols = options.columns.length;
|
|
133
|
+
if (options.initial) {
|
|
134
|
+
this.grid = options.initial.map((row)=>[
|
|
135
|
+
...row
|
|
136
|
+
]);
|
|
137
|
+
} else {
|
|
138
|
+
this.grid = Array.from({
|
|
139
|
+
length: rows
|
|
140
|
+
}, ()=>Array(cols).fill(0));
|
|
141
|
+
}
|
|
142
|
+
// Get sorted valid values for cycling
|
|
143
|
+
this.validValues = options.legend.map((l)=>l.value).sort((a, b)=>a - b);
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
//# sourceMappingURL=heatmap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/heatmap.ts"],"sourcesContent":["import { Prompt } from '../base';\nimport { HeatmapOptions, HeatmapLegend, MouseEvent } from '../types';\nimport { ANSI } from '../ansi';\n\nexport class HeatmapPrompt extends Prompt<number[][], HeatmapOptions> {\n private grid: number[][];\n private cursorRow: number = 0;\n private cursorCol: number = 0;\n private validValues: number[];\n\n constructor(options: HeatmapOptions) {\n super(options);\n // Initialize grid\n const rows = options.rows.length;\n const cols = options.columns.length;\n if (options.initial) {\n this.grid = options.initial.map(row => [...row]);\n } else {\n this.grid = Array.from({ length: rows }, () => Array(cols).fill(0));\n }\n\n // Get sorted valid values for cycling\n this.validValues = options.legend.map(l => l.value).sort((a, b) => a - b);\n }\n\n protected render(_firstRender: boolean): void {\n let output = `${ANSI.FG_CYAN}? ${this.options.message}${ANSI.RESET}\\n`;\n\n // Render Column Headers\n output += ' '; // Offset for row labels\n this.options.columns.forEach(col => {\n // Show first 2 chars\n const label = col.substring(0, 2).padEnd(2);\n output += ` ${label} `;\n });\n output += '\\n';\n\n // Grid\n for (let r = 0; r < this.options.rows.length; r++) {\n const rowLabel = this.options.rows[r].substring(0, 4).padStart(4);\n output += `${ANSI.FG_GRAY}${rowLabel} ${ANSI.RESET}`;\n\n for (let c = 0; c < this.options.columns.length; c++) {\n const val = this.grid[r][c];\n const legend = this.getLegend(val);\n const char = legend?.char || '?';\n const color = legend?.color || ((s: string) => s);\n\n const isCursor = r === this.cursorRow && c === this.cursorCol;\n\n const cellContent = color(char);\n if (isCursor) {\n output += `[${cellContent}]`; // Brackets around\n } else {\n output += ` ${cellContent} `;\n }\n }\n output += '\\n';\n }\n\n // Legend\n output += '\\nLegend: ';\n this.options.legend.forEach(l => {\n output += `${l.value}:${l.color(l.char)} `;\n });\n output += '\\n' + ANSI.FG_GRAY + \"(Arrows to move, Space to cycle, 0-9 to set)\" + ANSI.RESET;\n\n this.renderFrame(output);\n }\n\n private getLegend(val: number): HeatmapLegend | undefined {\n return this.options.legend.find(l => l.value === val);\n }\n\n protected handleMouse(event: MouseEvent): void {\n if (event.action === 'scroll') {\n if (event.scroll === 'up') {\n if (this.cursorRow > 0) this.cursorRow--;\n } else if (event.scroll === 'down') {\n if (this.cursorRow < this.options.rows.length - 1) this.cursorRow++;\n }\n this.render(false);\n }\n }\n\n protected handleInput(char: string, _key: Buffer): void {\n if (char === '\\r' || char === '\\n') { // Enter\n this.submit(this.grid);\n return;\n }\n\n if (this.isUp(char)) {\n if (this.cursorRow > 0) this.cursorRow--;\n } else if (this.isDown(char)) {\n if (this.cursorRow < this.options.rows.length - 1) this.cursorRow++;\n } else if (this.isLeft(char)) {\n if (this.cursorCol > 0) this.cursorCol--;\n } else if (this.isRight(char)) {\n if (this.cursorCol < this.options.columns.length - 1) this.cursorCol++;\n } else if (char === '\\t') { // Tab -> Right (Cycle)\n this.cursorCol++;\n if (this.cursorCol >= this.options.columns.length) {\n this.cursorCol = 0;\n this.cursorRow++;\n if (this.cursorRow >= this.options.rows.length) {\n this.cursorRow = 0;\n }\n }\n } else if (char === '\\u001b[Z') { // Shift+Tab -> Left (Cycle)\n this.cursorCol--;\n if (this.cursorCol < 0) {\n this.cursorCol = this.options.columns.length - 1;\n this.cursorRow--;\n if (this.cursorRow < 0) {\n this.cursorRow = this.options.rows.length - 1;\n }\n }\n } else if (char === ' ') {\n const val = this.grid[this.cursorRow][this.cursorCol];\n const idx = this.validValues.indexOf(val);\n let nextVal;\n if (idx === -1) {\n // If current val not in legend (maybe init with invalid), reset to first\n nextVal = this.validValues[0];\n } else {\n nextVal = this.validValues[(idx + 1) % this.validValues.length];\n }\n this.grid[this.cursorRow][this.cursorCol] = nextVal;\n } else if (/[0-9]/.test(char)) {\n const num = parseInt(char, 10);\n // Only set if valid in legend\n if (this.validValues.includes(num)) {\n this.grid[this.cursorRow][this.cursorCol] = num;\n }\n }\n\n this.render(false);\n }\n}\n"],"names":["HeatmapPrompt","Prompt","render","_firstRender","output","ANSI","FG_CYAN","options","message","RESET","columns","forEach","col","label","substring","padEnd","r","rows","length","rowLabel","padStart","FG_GRAY","c","val","grid","legend","getLegend","char","color","s","isCursor","cursorRow","cursorCol","cellContent","l","value","renderFrame","find","handleMouse","event","action","scroll","handleInput","_key","submit","isUp","isDown","isLeft","isRight","idx","validValues","indexOf","nextVal","test","num","parseInt","includes","cols","initial","map","row","Array","from","fill","sort","a","b"],"mappings":"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"}
|
|
@@ -1,65 +1,68 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "IPPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return IPPrompt;
|
|
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;
|
|
23
25
|
}
|
|
26
|
+
return obj;
|
|
27
|
+
}
|
|
28
|
+
let IPPrompt = class IPPrompt extends _base.Prompt {
|
|
24
29
|
render(_firstRender) {
|
|
25
30
|
let output = '';
|
|
26
31
|
// Title
|
|
27
|
-
const icon = this.errorMsg ? `${
|
|
28
|
-
output += `${icon} ${
|
|
32
|
+
const icon = this.errorMsg ? `${_theme.theme.error}${_symbols.symbols.cross}` : `${_theme.theme.success}?`;
|
|
33
|
+
output += `${icon} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}\n`;
|
|
29
34
|
// IP Render
|
|
30
|
-
const partsDisplay = this.octets.map((octet, index)
|
|
35
|
+
const partsDisplay = this.octets.map((octet, index)=>{
|
|
31
36
|
const isEmpty = octet.length === 0;
|
|
32
37
|
let displayVal = isEmpty ? '_' : octet;
|
|
33
38
|
if (index === this.activeOctet) {
|
|
34
39
|
// Highlight active
|
|
35
|
-
displayVal = `${
|
|
40
|
+
displayVal = `${_theme.theme.main}${_ansi.ANSI.UNDERLINE}${displayVal}${_ansi.ANSI.RESET}`;
|
|
36
41
|
}
|
|
37
42
|
return displayVal;
|
|
38
43
|
});
|
|
39
44
|
output += ` ${partsDisplay.join('.')}`;
|
|
40
45
|
if (this.errorMsg) {
|
|
41
|
-
output += `\n${
|
|
46
|
+
output += `\n${_theme.theme.error}>> ${this.errorMsg}${_ansi.ANSI.RESET}`;
|
|
42
47
|
}
|
|
43
48
|
this.renderFrame(output);
|
|
44
49
|
}
|
|
45
50
|
handleInput(char) {
|
|
46
51
|
this.errorMsg = '';
|
|
47
52
|
if (char === '\r' || char === '\n') {
|
|
48
|
-
if (this.octets.every(o
|
|
53
|
+
if (this.octets.every((o)=>o.length > 0)) {
|
|
49
54
|
this.submit(this.octets.join('.'));
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
55
|
+
} else {
|
|
52
56
|
this.errorMsg = 'Invalid IP address';
|
|
53
57
|
this.render(false);
|
|
54
58
|
}
|
|
55
59
|
return;
|
|
56
60
|
}
|
|
57
|
-
if (char === '\u0008' || char === '\x7f') {
|
|
61
|
+
if (char === '\u0008' || char === '\x7f') {
|
|
58
62
|
const current = this.octets[this.activeOctet];
|
|
59
63
|
if (current.length > 0) {
|
|
60
64
|
this.octets[this.activeOctet] = current.slice(0, -1);
|
|
61
|
-
}
|
|
62
|
-
else if (this.activeOctet > 0) {
|
|
65
|
+
} else if (this.activeOctet > 0) {
|
|
63
66
|
this.activeOctet--;
|
|
64
67
|
}
|
|
65
68
|
this.render(false);
|
|
@@ -105,8 +108,7 @@ class IPPrompt extends base_1.Prompt {
|
|
|
105
108
|
this.activeOctet--;
|
|
106
109
|
this.render(false);
|
|
107
110
|
}
|
|
108
|
-
}
|
|
109
|
-
else if (event.scroll === 'down') {
|
|
111
|
+
} else if (event.scroll === 'down') {
|
|
110
112
|
if (this.activeOctet < 3) {
|
|
111
113
|
this.activeOctet++;
|
|
112
114
|
this.render(false);
|
|
@@ -114,5 +116,23 @@ class IPPrompt extends base_1.Prompt {
|
|
|
114
116
|
}
|
|
115
117
|
}
|
|
116
118
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
+
constructor(options){
|
|
120
|
+
super(options), _define_property(this, "octets", [
|
|
121
|
+
'',
|
|
122
|
+
'',
|
|
123
|
+
'',
|
|
124
|
+
''
|
|
125
|
+
]), _define_property(this, "activeOctet", 0), _define_property(this, "errorMsg", '');
|
|
126
|
+
if (options.initial) {
|
|
127
|
+
const parts = options.initial.split('.');
|
|
128
|
+
if (parts.length === 4) {
|
|
129
|
+
this.octets = parts.map((p)=>{
|
|
130
|
+
const num = parseInt(p, 10);
|
|
131
|
+
return !isNaN(num) && num >= 0 && num <= 255 ? p : '';
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
//# sourceMappingURL=ip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/ip.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { IPOptions, MouseEvent } from '../types';\n\nexport class IPPrompt extends Prompt<string, IPOptions> {\n private octets: string[] = ['', '', '', ''];\n private activeOctet: number = 0;\n private errorMsg: string = '';\n\n constructor(options: IPOptions) {\n super(options);\n if (options.initial) {\n const parts = options.initial.split('.');\n if (parts.length === 4) {\n this.octets = parts.map(p => {\n const num = parseInt(p, 10);\n return !isNaN(num) && num >= 0 && num <= 255 ? p : '';\n });\n }\n }\n }\n\n protected render(_firstRender: boolean) {\n let output = '';\n\n // Title\n const icon = this.errorMsg ? `${theme.error}${symbols.cross}` : `${theme.success}?`;\n output += `${icon} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}\\n`;\n\n // IP Render\n const partsDisplay = this.octets.map((octet, index) => {\n const isEmpty = octet.length === 0;\n let displayVal = isEmpty ? '_' : octet;\n\n if (index === this.activeOctet) {\n // Highlight active\n displayVal = `${theme.main}${ANSI.UNDERLINE}${displayVal}${ANSI.RESET}`;\n }\n return displayVal;\n });\n\n output += ` ${partsDisplay.join('.')}`;\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 this.errorMsg = '';\n\n if (char === '\\r' || char === '\\n') {\n if (this.octets.every(o => o.length > 0)) {\n this.submit(this.octets.join('.'));\n } else {\n this.errorMsg = 'Invalid IP address';\n this.render(false);\n }\n return;\n }\n\n if (char === '\\u0008' || char === '\\x7f') { // Backspace\n const current = this.octets[this.activeOctet];\n if (current.length > 0) {\n this.octets[this.activeOctet] = current.slice(0, -1);\n } else if (this.activeOctet > 0) {\n this.activeOctet--;\n }\n this.render(false);\n return;\n }\n\n // Navigation\n if (this.isLeft(char) && this.activeOctet > 0) {\n this.activeOctet--;\n this.render(false);\n return;\n }\n if (this.isRight(char) && this.activeOctet < 3) {\n this.activeOctet++;\n this.render(false);\n return;\n }\n\n // Dot navigation\n if (char === '.') {\n if (this.activeOctet < 3) {\n this.activeOctet++;\n this.render(false);\n }\n return;\n }\n\n // Numbers\n if (/^\\d$/.test(char)) {\n const current = this.octets[this.activeOctet];\n const newValue = current + char;\n\n if (parseInt(newValue, 10) <= 255) {\n this.octets[this.activeOctet] = newValue;\n\n // Auto-jump if 3 digits\n if (newValue.length === 3 && this.activeOctet < 3) {\n this.activeOctet++;\n }\n this.render(false);\n }\n }\n }\n\n protected handleMouse(event: MouseEvent) {\n if (event.action === 'scroll') {\n if (event.scroll === 'up') {\n if (this.activeOctet > 0) {\n this.activeOctet--;\n this.render(false);\n }\n } else if (event.scroll === 'down') {\n if (this.activeOctet < 3) {\n this.activeOctet++;\n this.render(false);\n }\n }\n }\n }\n}\n"],"names":["IPPrompt","Prompt","render","_firstRender","output","icon","errorMsg","theme","error","symbols","cross","success","ANSI","BOLD","title","options","message","RESET","partsDisplay","octets","map","octet","index","isEmpty","length","displayVal","activeOctet","main","UNDERLINE","join","renderFrame","handleInput","char","every","o","submit","current","slice","isLeft","isRight","test","newValue","parseInt","handleMouse","event","action","scroll","initial","parts","split","p","num","isNaN"],"mappings":"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"}
|