mepcli 1.4.0 → 2.0.0-beta.2
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 +43 -12
- 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 -322
- 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/{pipeline.js → src/pipeline.js} +120 -93
- 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 +15 -16
- 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 -90
- 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,66 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class ScrollPrompt extends base_1.Prompt {
|
|
10
|
-
constructor(options) {
|
|
11
|
-
super(options);
|
|
12
|
-
this.scrollTop = 0;
|
|
13
|
-
this.hasReachedBottom = false;
|
|
14
|
-
this.showError = false;
|
|
15
|
-
// Normalize newlines and split content
|
|
16
|
-
this.lines = (options.content || '').replace(/\r\n/g, '\n').split('\n');
|
|
17
|
-
this.height = options.height || 15;
|
|
18
|
-
// Initial check if content fits without scrolling
|
|
19
|
-
if (this.lines.length <= this.height) {
|
|
20
|
-
this.hasReachedBottom = true;
|
|
21
|
-
}
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "ScrollPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return ScrollPrompt;
|
|
22
9
|
}
|
|
10
|
+
});
|
|
11
|
+
const _base = require("../base");
|
|
12
|
+
const _ansi = require("../ansi");
|
|
13
|
+
const _theme = require("../theme");
|
|
14
|
+
const _symbols = require("../symbols");
|
|
15
|
+
const _utils = require("../utils");
|
|
16
|
+
function _define_property(obj, key, value) {
|
|
17
|
+
if (key in obj) {
|
|
18
|
+
Object.defineProperty(obj, key, {
|
|
19
|
+
value: value,
|
|
20
|
+
enumerable: true,
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: true
|
|
23
|
+
});
|
|
24
|
+
} else {
|
|
25
|
+
obj[key] = value;
|
|
26
|
+
}
|
|
27
|
+
return obj;
|
|
28
|
+
}
|
|
29
|
+
let ScrollPrompt = class ScrollPrompt extends _base.Prompt {
|
|
23
30
|
render(_firstRender) {
|
|
24
31
|
const width = this.stdout.columns || 80;
|
|
25
32
|
const contentWidth = width - 4; // Border (2) + Padding (2)
|
|
26
33
|
// 1. Header & Progress
|
|
27
|
-
const percent = Math.min(100, Math.round((
|
|
28
|
-
const header = `${
|
|
34
|
+
const percent = Math.min(100, Math.round((this.scrollTop + this.height) / Math.max(this.height, this.lines.length) * 100));
|
|
35
|
+
const header = `${_theme.theme.title}${_symbols.symbols.pointer} ${_ansi.ANSI.BOLD}${this.options.message}${_ansi.ANSI.RESET} ${_theme.theme.muted}[${percent}%]${_ansi.ANSI.RESET}`;
|
|
29
36
|
// 2. Viewport
|
|
30
37
|
const visibleLines = this.lines.slice(this.scrollTop, this.scrollTop + this.height);
|
|
31
38
|
// Fill empty lines if content is shorter than height
|
|
32
|
-
while
|
|
39
|
+
while(visibleLines.length < this.height){
|
|
33
40
|
visibleLines.push('');
|
|
34
41
|
}
|
|
35
|
-
const borderTop = `${
|
|
36
|
-
const borderBottom = `${
|
|
37
|
-
const contentRows = visibleLines.map(line
|
|
42
|
+
const borderTop = `${_theme.theme.muted}${_symbols.symbols.topLeft}${_symbols.symbols.horizontal.repeat(width - 2)}${_symbols.symbols.topRight}${_ansi.ANSI.RESET}`;
|
|
43
|
+
const borderBottom = `${_theme.theme.muted}${_symbols.symbols.bottomLeft}${_symbols.symbols.horizontal.repeat(width - 2)}${_symbols.symbols.bottomRight}${_ansi.ANSI.RESET}`;
|
|
44
|
+
const contentRows = visibleLines.map((line)=>{
|
|
38
45
|
let displayLine = line;
|
|
39
|
-
const len = (0,
|
|
46
|
+
const len = (0, _utils.stringWidth)(displayLine);
|
|
40
47
|
if (len > contentWidth) {
|
|
41
48
|
// Truncate
|
|
42
49
|
displayLine = this.truncate(displayLine, contentWidth);
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
50
|
+
} else {
|
|
45
51
|
// Pad
|
|
46
52
|
displayLine += ' '.repeat(contentWidth - len);
|
|
47
53
|
}
|
|
48
|
-
return `${
|
|
54
|
+
return `${_theme.theme.muted}${_symbols.symbols.vertical}${_ansi.ANSI.RESET} ${displayLine} ${_theme.theme.muted}${_symbols.symbols.vertical}${_ansi.ANSI.RESET}`;
|
|
49
55
|
});
|
|
50
56
|
// 3. Footer / Status
|
|
51
57
|
let footer = '';
|
|
52
58
|
if (this.showError) {
|
|
53
|
-
footer = `${
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
else {
|
|
59
|
-
footer = `${theme_1.theme.success}>> Press Enter to accept${ansi_1.ANSI.RESET}`;
|
|
59
|
+
footer = `${_theme.theme.error}>> Please scroll to the bottom before proceeding.${_ansi.ANSI.RESET}`;
|
|
60
|
+
} else if (this.options.requireScrollToBottom && !this.hasReachedBottom) {
|
|
61
|
+
footer = `${_theme.theme.muted}(Scroll down to read more)${_ansi.ANSI.RESET}`;
|
|
62
|
+
} else {
|
|
63
|
+
footer = `${_theme.theme.success}>> Press Enter to accept${_ansi.ANSI.RESET}`;
|
|
60
64
|
}
|
|
61
65
|
const output = [
|
|
62
66
|
header,
|
|
@@ -85,33 +89,22 @@ class ScrollPrompt extends base_1.Prompt {
|
|
|
85
89
|
this.scrollTop--;
|
|
86
90
|
didScroll = true;
|
|
87
91
|
}
|
|
88
|
-
}
|
|
89
|
-
// Down / j
|
|
90
|
-
else if (this.isDown(char) || char === 'j') {
|
|
92
|
+
} else if (this.isDown(char) || char === 'j') {
|
|
91
93
|
if (this.scrollTop + this.height < this.lines.length) {
|
|
92
94
|
this.scrollTop++;
|
|
93
95
|
didScroll = true;
|
|
94
96
|
}
|
|
95
|
-
}
|
|
96
|
-
// PageUp
|
|
97
|
-
else if (key.toString('hex') === '1b5b357e') { // Standard PageUp sequence
|
|
97
|
+
} else if (key.toString('hex') === '1b5b357e') {
|
|
98
98
|
this.scrollTop = Math.max(0, this.scrollTop - this.height);
|
|
99
99
|
didScroll = true;
|
|
100
|
-
}
|
|
101
|
-
// PageDown / Space
|
|
102
|
-
else if (char === ' ' || key.toString('hex') === '1b5b367e') { // Standard PageDown sequence
|
|
100
|
+
} else if (char === ' ' || key.toString('hex') === '1b5b367e') {
|
|
103
101
|
this.scrollTop = Math.min(this.lines.length - this.height, this.scrollTop + this.height);
|
|
104
|
-
if (this.scrollTop < 0)
|
|
105
|
-
this.scrollTop = 0; // Fix if content < height
|
|
102
|
+
if (this.scrollTop < 0) this.scrollTop = 0; // Fix if content < height
|
|
106
103
|
didScroll = true;
|
|
107
|
-
}
|
|
108
|
-
// Home
|
|
109
|
-
else if (key.toString('hex') === '1b5b48') {
|
|
104
|
+
} else if (key.toString('hex') === '1b5b48') {
|
|
110
105
|
this.scrollTop = 0;
|
|
111
106
|
didScroll = true;
|
|
112
|
-
}
|
|
113
|
-
// End
|
|
114
|
-
else if (key.toString('hex') === '1b5b46') {
|
|
107
|
+
} else if (key.toString('hex') === '1b5b46') {
|
|
115
108
|
this.scrollTop = Math.max(0, this.lines.length - this.height);
|
|
116
109
|
didScroll = true;
|
|
117
110
|
}
|
|
@@ -132,8 +125,7 @@ class ScrollPrompt extends base_1.Prompt {
|
|
|
132
125
|
this.scrollTop--;
|
|
133
126
|
didScroll = true;
|
|
134
127
|
}
|
|
135
|
-
}
|
|
136
|
-
else if (event.scroll === 'down') {
|
|
128
|
+
} else if (event.scroll === 'down') {
|
|
137
129
|
if (this.scrollTop + this.height < this.lines.length) {
|
|
138
130
|
this.scrollTop++;
|
|
139
131
|
didScroll = true;
|
|
@@ -148,5 +140,16 @@ class ScrollPrompt extends base_1.Prompt {
|
|
|
148
140
|
}
|
|
149
141
|
}
|
|
150
142
|
}
|
|
151
|
-
|
|
152
|
-
|
|
143
|
+
constructor(options){
|
|
144
|
+
super(options), _define_property(this, "lines", void 0), _define_property(this, "scrollTop", 0), _define_property(this, "height", void 0), _define_property(this, "hasReachedBottom", false), _define_property(this, "showError", false);
|
|
145
|
+
// Normalize newlines and split content
|
|
146
|
+
this.lines = (options.content || '').replace(/\r\n/g, '\n').split('\n');
|
|
147
|
+
this.height = options.height || 15;
|
|
148
|
+
// Initial check if content fits without scrolling
|
|
149
|
+
if (this.lines.length <= this.height) {
|
|
150
|
+
this.hasReachedBottom = true;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
//# sourceMappingURL=scroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/scroll.ts"],"sourcesContent":["import { Prompt } from '../base';\nimport { ANSI } from '../ansi';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { ScrollOptions } from '../types';\nimport { stringWidth } from '../utils';\n\nexport class ScrollPrompt extends Prompt<boolean, ScrollOptions> {\n private lines: string[];\n private scrollTop: number = 0;\n private height: number;\n private hasReachedBottom: boolean = false;\n private showError: boolean = false;\n\n constructor(options: ScrollOptions) {\n super(options);\n // Normalize newlines and split content\n this.lines = (options.content || '').replace(/\\r\\n/g, '\\n').split('\\n');\n this.height = options.height || 15;\n\n // Initial check if content fits without scrolling\n if (this.lines.length <= this.height) {\n this.hasReachedBottom = true;\n }\n }\n\n protected render(_firstRender: boolean): void {\n const width = this.stdout.columns || 80;\n const contentWidth = width - 4; // Border (2) + Padding (2)\n\n // 1. Header & Progress\n const percent = Math.min(100, Math.round(((this.scrollTop + this.height) / Math.max(this.height, this.lines.length)) * 100));\n const header = `${theme.title}${symbols.pointer} ${ANSI.BOLD}${this.options.message}${ANSI.RESET} ${theme.muted}[${percent}%]${ANSI.RESET}`;\n\n // 2. Viewport\n const visibleLines = this.lines.slice(this.scrollTop, this.scrollTop + this.height);\n\n // Fill empty lines if content is shorter than height\n while (visibleLines.length < this.height) {\n visibleLines.push('');\n }\n\n const borderTop = `${theme.muted}${symbols.topLeft}${symbols.horizontal.repeat(width - 2)}${symbols.topRight}${ANSI.RESET}`;\n const borderBottom = `${theme.muted}${symbols.bottomLeft}${symbols.horizontal.repeat(width - 2)}${symbols.bottomRight}${ANSI.RESET}`;\n\n const contentRows = visibleLines.map(line => {\n let displayLine = line;\n const len = stringWidth(displayLine);\n if (len > contentWidth) {\n // Truncate\n displayLine = this.truncate(displayLine, contentWidth);\n } else {\n // Pad\n displayLine += ' '.repeat(contentWidth - len);\n }\n return `${theme.muted}${symbols.vertical}${ANSI.RESET} ${displayLine} ${theme.muted}${symbols.vertical}${ANSI.RESET}`;\n });\n\n // 3. Footer / Status\n let footer = '';\n if (this.showError) {\n footer = `${theme.error}>> Please scroll to the bottom before proceeding.${ANSI.RESET}`;\n } else if (this.options.requireScrollToBottom && !this.hasReachedBottom) {\n footer = `${theme.muted}(Scroll down to read more)${ANSI.RESET}`;\n } else {\n footer = `${theme.success}>> Press Enter to accept${ANSI.RESET}`;\n }\n\n const output = [\n header,\n borderTop,\n ...contentRows,\n borderBottom,\n footer\n ].join('\\n');\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string, key: Buffer): void {\n // Enter\n if (char === '\\r' || char === '\\n') {\n if (this.options.requireScrollToBottom && !this.hasReachedBottom) {\n this.showError = true;\n this.render(false);\n return;\n }\n this.submit(true);\n return;\n }\n\n let didScroll = false;\n\n // Up / k\n if (this.isUp(char) || char === 'k') {\n if (this.scrollTop > 0) {\n this.scrollTop--;\n didScroll = true;\n }\n }\n // Down / j\n else if (this.isDown(char) || char === 'j') {\n if (this.scrollTop + this.height < this.lines.length) {\n this.scrollTop++;\n didScroll = true;\n }\n }\n // PageUp\n else if (key.toString('hex') === '1b5b357e') { // Standard PageUp sequence\n this.scrollTop = Math.max(0, this.scrollTop - this.height);\n didScroll = true;\n }\n // PageDown / Space\n else if (char === ' ' || key.toString('hex') === '1b5b367e') { // Standard PageDown sequence\n this.scrollTop = Math.min(this.lines.length - this.height, this.scrollTop + this.height);\n if (this.scrollTop < 0) this.scrollTop = 0; // Fix if content < height\n didScroll = true;\n }\n // Home\n else if (key.toString('hex') === '1b5b48') {\n this.scrollTop = 0;\n didScroll = true;\n }\n // End\n else if (key.toString('hex') === '1b5b46') {\n this.scrollTop = Math.max(0, this.lines.length - this.height);\n didScroll = true;\n }\n\n if (didScroll) {\n this.showError = false;\n // Check if reached bottom\n if (this.scrollTop + this.height >= this.lines.length) {\n this.hasReachedBottom = true;\n }\n this.render(false);\n }\n }\n\n protected handleMouse(event: import('../types').MouseEvent): void {\n if (event.action === 'scroll') {\n let didScroll = false;\n if (event.scroll === 'up') {\n if (this.scrollTop > 0) {\n this.scrollTop--;\n didScroll = true;\n }\n } else if (event.scroll === 'down') {\n if (this.scrollTop + this.height < this.lines.length) {\n this.scrollTop++;\n didScroll = true;\n }\n }\n\n if (didScroll) {\n this.showError = false;\n if (this.scrollTop + this.height >= this.lines.length) {\n this.hasReachedBottom = true;\n }\n this.render(false);\n }\n }\n }\n}\n"],"names":["ScrollPrompt","Prompt","render","_firstRender","width","stdout","columns","contentWidth","percent","Math","min","round","scrollTop","height","max","lines","length","header","theme","title","symbols","pointer","ANSI","BOLD","options","message","RESET","muted","visibleLines","slice","push","borderTop","topLeft","horizontal","repeat","topRight","borderBottom","bottomLeft","bottomRight","contentRows","map","line","displayLine","len","stringWidth","truncate","vertical","footer","showError","error","requireScrollToBottom","hasReachedBottom","success","output","join","renderFrame","handleInput","char","key","submit","didScroll","isUp","isDown","toString","handleMouse","event","action","scroll","content","replace","split"],"mappings":"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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "SeatPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return SeatPrompt;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _base = require("../base");
|
|
12
|
+
const _ansi = require("../ansi");
|
|
13
|
+
const _theme = require("../theme");
|
|
14
|
+
function _define_property(obj, key, value) {
|
|
15
|
+
if (key in obj) {
|
|
16
|
+
Object.defineProperty(obj, key, {
|
|
17
|
+
value: value,
|
|
18
|
+
enumerable: true,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true
|
|
21
|
+
});
|
|
22
|
+
} else {
|
|
23
|
+
obj[key] = value;
|
|
24
|
+
}
|
|
25
|
+
return obj;
|
|
26
|
+
}
|
|
27
|
+
let SeatPrompt = class SeatPrompt extends _base.Prompt {
|
|
28
|
+
parseLayout() {
|
|
29
|
+
this.height = this.options.layout.length;
|
|
30
|
+
this.width = 0;
|
|
31
|
+
this.grid = this.options.layout.map((line, y)=>{
|
|
32
|
+
if (line.length > this.width) this.width = line.length;
|
|
33
|
+
return line.split('').map((char, x)=>{
|
|
34
|
+
const isGap = char === '_' || char === ' ';
|
|
35
|
+
// Convention: 'X' is occupied.
|
|
36
|
+
const isOccupied = char.toUpperCase() === 'X';
|
|
37
|
+
// Label generation: Rows (A, B...), Cols (1, 2...)
|
|
38
|
+
const rowLabel = this.options.rows ? this.options.rows[y] || String(y + 1) : String.fromCharCode(65 + y);
|
|
39
|
+
const colLabel = this.options.cols ? this.options.cols[x] || String(x + 1) : String(x + 1);
|
|
40
|
+
const label = `${rowLabel}${colLabel}`;
|
|
41
|
+
const selectable = !isGap;
|
|
42
|
+
let status = 'available';
|
|
43
|
+
if (isOccupied) status = 'occupied';
|
|
44
|
+
if (this.selected.has(label)) status = 'selected'; // Though this is dynamic state
|
|
45
|
+
// Initialize cursor to first available seat
|
|
46
|
+
if (selectable && status !== 'occupied' && !this.initializedCursor) {
|
|
47
|
+
this.cursorX = x;
|
|
48
|
+
this.cursorY = y;
|
|
49
|
+
this.initializedCursor = true;
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
x,
|
|
53
|
+
y,
|
|
54
|
+
char,
|
|
55
|
+
label,
|
|
56
|
+
selectable,
|
|
57
|
+
status
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
render(_firstRender) {
|
|
63
|
+
let output = `${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}\n`;
|
|
64
|
+
output += `${_theme.theme.muted}(Use arrows to move, Space to select, Enter to confirm)${_ansi.ANSI.RESET}\n\n`;
|
|
65
|
+
this.grid.forEach((row, y)=>{
|
|
66
|
+
let lineStr = '';
|
|
67
|
+
row.forEach((node, x)=>{
|
|
68
|
+
const isCursor = x === this.cursorX && y === this.cursorY;
|
|
69
|
+
const isSelected = this.selected.has(node.label);
|
|
70
|
+
const charDisplay = node.char;
|
|
71
|
+
// If occupied, maybe show a different char or color
|
|
72
|
+
let style = _ansi.ANSI.RESET;
|
|
73
|
+
if (node.status === 'occupied') {
|
|
74
|
+
style = _ansi.ANSI.FG_RED;
|
|
75
|
+
} else if (!node.selectable) {
|
|
76
|
+
style = _theme.theme.muted;
|
|
77
|
+
} else {
|
|
78
|
+
style = _theme.theme.main; // Available seats
|
|
79
|
+
}
|
|
80
|
+
if (isSelected) {
|
|
81
|
+
style = _ansi.ANSI.BG_GREEN + _ansi.ANSI.FG_BLACK;
|
|
82
|
+
}
|
|
83
|
+
if (isCursor) {
|
|
84
|
+
// Combine styles? Cursor overrides everything usually
|
|
85
|
+
style = _ansi.ANSI.BG_CYAN + _ansi.ANSI.FG_BLACK;
|
|
86
|
+
}
|
|
87
|
+
lineStr += style + charDisplay + _ansi.ANSI.RESET + ' ';
|
|
88
|
+
});
|
|
89
|
+
output += lineStr + '\n';
|
|
90
|
+
});
|
|
91
|
+
// Show Legend or Current Selection
|
|
92
|
+
if (this.selected.size > 0) {
|
|
93
|
+
output += `\n${_theme.theme.success}Selected: ${Array.from(this.selected).join(', ')}${_ansi.ANSI.RESET}`;
|
|
94
|
+
}
|
|
95
|
+
this.renderFrame(output);
|
|
96
|
+
}
|
|
97
|
+
handleInput(char) {
|
|
98
|
+
if (char === '\r' || char === '\n') {
|
|
99
|
+
this.submit(Array.from(this.selected));
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (char === ' ') {
|
|
103
|
+
const row = this.grid[this.cursorY];
|
|
104
|
+
if (!row) return;
|
|
105
|
+
const node = row[this.cursorX];
|
|
106
|
+
if (node && node.selectable && node.status !== 'occupied') {
|
|
107
|
+
if (this.selected.has(node.label)) {
|
|
108
|
+
this.selected.delete(node.label);
|
|
109
|
+
} else {
|
|
110
|
+
if (!this.options.multiple) this.selected.clear();
|
|
111
|
+
this.selected.add(node.label);
|
|
112
|
+
}
|
|
113
|
+
this.render(false);
|
|
114
|
+
}
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (this.isUp(char)) this.move(0, -1);
|
|
118
|
+
else if (this.isDown(char)) this.move(0, 1);
|
|
119
|
+
else if (this.isLeft(char)) this.move(-1, 0);
|
|
120
|
+
else if (this.isRight(char)) this.move(1, 0);
|
|
121
|
+
else if (char === '\t') this.move(1, 0);
|
|
122
|
+
else if (char === '\u001b[Z') this.move(-1, 0);
|
|
123
|
+
}
|
|
124
|
+
handleMouse(event) {
|
|
125
|
+
if (event.action === 'scroll') {
|
|
126
|
+
if (event.scroll === 'up') this.move(0, -1);
|
|
127
|
+
else if (event.scroll === 'down') this.move(0, 1);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
move(dx, dy) {
|
|
131
|
+
let nx = this.cursorX;
|
|
132
|
+
let ny = this.cursorY;
|
|
133
|
+
let limit = Math.max(this.width, this.height) + 10;
|
|
134
|
+
do {
|
|
135
|
+
nx += dx;
|
|
136
|
+
ny += dy;
|
|
137
|
+
limit--;
|
|
138
|
+
// Boundary Check
|
|
139
|
+
if (ny < 0 || ny >= this.height) return;
|
|
140
|
+
const row = this.grid[ny];
|
|
141
|
+
if (!row) return;
|
|
142
|
+
if (nx < 0 || nx >= row.length) return;
|
|
143
|
+
const node = row[nx];
|
|
144
|
+
// Stop if node is selectable (seat or occupied seat)
|
|
145
|
+
// Skip gaps ('_' or ' ')
|
|
146
|
+
if (node.selectable) {
|
|
147
|
+
this.cursorX = nx;
|
|
148
|
+
this.cursorY = ny;
|
|
149
|
+
this.render(false);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
}while (limit > 0)
|
|
153
|
+
}
|
|
154
|
+
constructor(options){
|
|
155
|
+
super(options), _define_property(this, "grid", []), _define_property(this, "cursorX", 0), _define_property(this, "cursorY", 0), _define_property(this, "selected", new Set()), _define_property(this, "height", 0), _define_property(this, "width", 0), _define_property(this, "initializedCursor", false);
|
|
156
|
+
this.parseLayout();
|
|
157
|
+
if (options.initial) {
|
|
158
|
+
options.initial.forEach((id)=>this.selected.add(id));
|
|
159
|
+
}
|
|
160
|
+
this.checkWindowsAttention();
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
//# sourceMappingURL=seat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/seat.ts"],"sourcesContent":["import { Prompt } from '../base';\nimport { SeatOptions, MouseEvent } from '../types';\nimport { ANSI } from '../ansi';\nimport { theme } from '../theme';\n\ninterface SeatNode {\n x: number;\n y: number;\n char: string;\n label: string;\n selectable: boolean; // Is it a seat (not a gap)?\n status: 'available' | 'occupied' | 'selected';\n}\n\nexport class SeatPrompt extends Prompt<string[], SeatOptions> {\n private grid: SeatNode[][] = [];\n private cursorX: number = 0;\n private cursorY: number = 0;\n private selected: Set<string> = new Set();\n\n private height: number = 0;\n private width: number = 0;\n private initializedCursor = false;\n\n constructor(options: SeatOptions) {\n super(options);\n this.parseLayout();\n if (options.initial) {\n options.initial.forEach(id => this.selected.add(id));\n }\n this.checkWindowsAttention();\n }\n\n private parseLayout() {\n this.height = this.options.layout.length;\n this.width = 0;\n\n this.grid = this.options.layout.map((line, y) => {\n if (line.length > this.width) this.width = line.length;\n\n return line.split('').map((char, x) => {\n const isGap = char === '_' || char === ' ';\n // Convention: 'X' is occupied.\n const isOccupied = char.toUpperCase() === 'X';\n\n // Label generation: Rows (A, B...), Cols (1, 2...)\n const rowLabel = this.options.rows ? (this.options.rows[y] || String(y + 1)) : String.fromCharCode(65 + y);\n const colLabel = this.options.cols ? (this.options.cols[x] || String(x + 1)) : String(x + 1);\n\n const label = `${rowLabel}${colLabel}`;\n\n const selectable = !isGap;\n let status: SeatNode['status'] = 'available';\n\n if (isOccupied) status = 'occupied';\n if (this.selected.has(label)) status = 'selected'; // Though this is dynamic state\n\n // Initialize cursor to first available seat\n if (selectable && status !== 'occupied' && !this.initializedCursor) {\n this.cursorX = x;\n this.cursorY = y;\n this.initializedCursor = true;\n }\n\n return {\n x, y, char, label, selectable, status\n };\n });\n });\n }\n\n protected render(_firstRender: boolean) {\n let output = `${theme.title}${this.options.message}${ANSI.RESET}\\n`;\n output += `${theme.muted}(Use arrows to move, Space to select, Enter to confirm)${ANSI.RESET}\\n\\n`;\n\n this.grid.forEach((row, y) => {\n let lineStr = '';\n row.forEach((node, x) => {\n const isCursor = x === this.cursorX && y === this.cursorY;\n const isSelected = this.selected.has(node.label);\n\n const charDisplay = node.char;\n // If occupied, maybe show a different char or color\n\n let style = ANSI.RESET;\n\n if (node.status === 'occupied') {\n style = ANSI.FG_RED;\n } else if (!node.selectable) {\n style = theme.muted;\n } else {\n style = theme.main; // Available seats\n }\n\n if (isSelected) {\n style = ANSI.BG_GREEN + ANSI.FG_BLACK;\n }\n\n if (isCursor) {\n // Combine styles? Cursor overrides everything usually\n style = ANSI.BG_CYAN + ANSI.FG_BLACK;\n }\n\n lineStr += style + charDisplay + ANSI.RESET + ' ';\n });\n output += lineStr + '\\n';\n });\n\n // Show Legend or Current Selection\n if (this.selected.size > 0) {\n output += `\\n${theme.success}Selected: ${Array.from(this.selected).join(', ')}${ANSI.RESET}`;\n }\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string) {\n if (char === '\\r' || char === '\\n') {\n this.submit(Array.from(this.selected));\n return;\n }\n\n if (char === ' ') {\n const row = this.grid[this.cursorY];\n if (!row) return;\n const node = row[this.cursorX];\n\n if (node && node.selectable && node.status !== 'occupied') {\n if (this.selected.has(node.label)) {\n this.selected.delete(node.label);\n } else {\n if (!this.options.multiple) this.selected.clear();\n this.selected.add(node.label);\n }\n this.render(false);\n }\n return;\n }\n\n if (this.isUp(char)) this.move(0, -1);\n else if (this.isDown(char)) this.move(0, 1);\n else if (this.isLeft(char)) this.move(-1, 0);\n else if (this.isRight(char)) this.move(1, 0);\n\n // Tab / Shift+Tab\n else if (char === '\\t') this.move(1, 0);\n else if (char === '\\u001b[Z') this.move(-1, 0);\n }\n\n protected handleMouse(event: MouseEvent) {\n if (event.action === 'scroll') {\n if (event.scroll === 'up') this.move(0, -1);\n else if (event.scroll === 'down') this.move(0, 1);\n }\n }\n\n private move(dx: number, dy: number) {\n let nx = this.cursorX;\n let ny = this.cursorY;\n let limit = Math.max(this.width, this.height) + 10;\n\n do {\n nx += dx;\n ny += dy;\n limit--;\n\n // Boundary Check\n if (ny < 0 || ny >= this.height) return;\n const row = this.grid[ny];\n if (!row) return;\n if (nx < 0 || nx >= row.length) return;\n\n const node = row[nx];\n // Stop if node is selectable (seat or occupied seat)\n // Skip gaps ('_' or ' ')\n if (node.selectable) {\n this.cursorX = nx;\n this.cursorY = ny;\n this.render(false);\n return;\n }\n\n } while (limit > 0);\n }\n}\n"],"names":["SeatPrompt","Prompt","parseLayout","height","options","layout","length","width","grid","map","line","y","split","char","x","isGap","isOccupied","toUpperCase","rowLabel","rows","String","fromCharCode","colLabel","cols","label","selectable","status","selected","has","initializedCursor","cursorX","cursorY","render","_firstRender","output","theme","title","message","ANSI","RESET","muted","forEach","row","lineStr","node","isCursor","isSelected","charDisplay","style","FG_RED","main","BG_GREEN","FG_BLACK","BG_CYAN","size","success","Array","from","join","renderFrame","handleInput","submit","delete","multiple","clear","add","isUp","move","isDown","isLeft","isRight","handleMouse","event","action","scroll","dx","dy","nx","ny","limit","Math","max","Set","initial","id","checkWindowsAttention"],"mappings":"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"}
|
|
@@ -1,28 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
constructor(options) {
|
|
10
|
-
super(options);
|
|
11
|
-
this.anchorIndex = null;
|
|
12
|
-
if (options.initial) {
|
|
13
|
-
const maxIdx = Math.max(0, options.choices.length - 1);
|
|
14
|
-
this.anchorIndex = Math.min(Math.max(0, options.initial[0]), maxIdx);
|
|
15
|
-
this.selectedIndex = Math.min(Math.max(0, options.initial[1]), maxIdx);
|
|
16
|
-
}
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "SelectRangePrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return SelectRangePrompt;
|
|
17
9
|
}
|
|
10
|
+
});
|
|
11
|
+
const _ansi = require("../ansi");
|
|
12
|
+
const _theme = require("../theme");
|
|
13
|
+
const _symbols = require("../symbols");
|
|
14
|
+
const _select = require("./select");
|
|
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 SelectRangePrompt = class SelectRangePrompt extends _select.SelectPrompt {
|
|
18
29
|
handleInput(char, _key) {
|
|
19
30
|
// Handle Enter (Submit)
|
|
20
31
|
if (char === '\r' || char === '\n') {
|
|
21
32
|
const choices = this.getFilteredChoices();
|
|
22
|
-
if (choices.length === 0)
|
|
23
|
-
|
|
24
|
-
if (this.isSeparator(choices[this.selectedIndex]))
|
|
25
|
-
return;
|
|
33
|
+
if (choices.length === 0) return;
|
|
34
|
+
if (this.isSeparator(choices[this.selectedIndex])) return;
|
|
26
35
|
let start = this.selectedIndex;
|
|
27
36
|
let end = this.selectedIndex;
|
|
28
37
|
if (this.anchorIndex !== null) {
|
|
@@ -30,7 +39,7 @@ class SelectRangePrompt extends select_1.SelectPrompt {
|
|
|
30
39
|
end = Math.max(this.anchorIndex, this.selectedIndex);
|
|
31
40
|
}
|
|
32
41
|
const selectedItems = [];
|
|
33
|
-
for
|
|
42
|
+
for(let i = start; i <= end; i++){
|
|
34
43
|
const choice = choices[i];
|
|
35
44
|
if (!this.isSeparator(choice)) {
|
|
36
45
|
selectedItems.push(choice.value);
|
|
@@ -43,8 +52,7 @@ class SelectRangePrompt extends select_1.SelectPrompt {
|
|
|
43
52
|
if (char === ' ') {
|
|
44
53
|
if (this.anchorIndex === null) {
|
|
45
54
|
this.anchorIndex = this.selectedIndex;
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
55
|
+
} else {
|
|
48
56
|
this.anchorIndex = null;
|
|
49
57
|
}
|
|
50
58
|
this.render(false);
|
|
@@ -64,25 +72,22 @@ class SelectRangePrompt extends select_1.SelectPrompt {
|
|
|
64
72
|
// Scroll Logic
|
|
65
73
|
if (this.selectedIndex < this.scrollTop) {
|
|
66
74
|
this.scrollTop = this.selectedIndex;
|
|
67
|
-
}
|
|
68
|
-
else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
|
|
75
|
+
} else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
|
|
69
76
|
this.scrollTop = this.selectedIndex - this.pageSize + 1;
|
|
70
77
|
}
|
|
71
78
|
if (this.scrollTop > choices.length - 1) {
|
|
72
79
|
this.scrollTop = Math.max(0, choices.length - this.pageSize);
|
|
73
80
|
}
|
|
74
81
|
// Header
|
|
75
|
-
const searchStr = this.searchBuffer ? ` ${
|
|
76
|
-
output += `${
|
|
82
|
+
const searchStr = this.searchBuffer ? ` ${_theme.theme.muted}(Filter: ${this.searchBuffer})${_ansi.ANSI.RESET}` : '';
|
|
83
|
+
output += `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}${searchStr}\n`;
|
|
77
84
|
if (choices.length === 0) {
|
|
78
|
-
output += ` ${
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
85
|
+
output += ` ${_theme.theme.muted}No results found${_ansi.ANSI.RESET}`;
|
|
86
|
+
} else {
|
|
81
87
|
const visibleChoices = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);
|
|
82
|
-
visibleChoices.forEach((choice, index)
|
|
88
|
+
visibleChoices.forEach((choice, index)=>{
|
|
83
89
|
const actualIndex = this.scrollTop + index;
|
|
84
|
-
if (index > 0)
|
|
85
|
-
output += '\n';
|
|
90
|
+
if (index > 0) output += '\n';
|
|
86
91
|
let isSelected = false;
|
|
87
92
|
if (this.anchorIndex !== null) {
|
|
88
93
|
const min = Math.min(this.anchorIndex, this.selectedIndex);
|
|
@@ -90,47 +95,54 @@ class SelectRangePrompt extends select_1.SelectPrompt {
|
|
|
90
95
|
if (actualIndex >= min && actualIndex <= max) {
|
|
91
96
|
isSelected = true;
|
|
92
97
|
}
|
|
93
|
-
}
|
|
94
|
-
else if (actualIndex === this.selectedIndex) {
|
|
98
|
+
} else if (actualIndex === this.selectedIndex) {
|
|
95
99
|
isSelected = true;
|
|
96
100
|
}
|
|
97
101
|
if (this.isSeparator(choice)) {
|
|
98
|
-
output += ` ${
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
102
|
+
output += ` ${_ansi.ANSI.DIM}${choice.text || _symbols.symbols.line.repeat(8)}${_ansi.ANSI.RESET}`;
|
|
103
|
+
} else {
|
|
101
104
|
let prefix = ' ';
|
|
102
105
|
const title = choice.title;
|
|
103
106
|
let content = title;
|
|
104
107
|
// Anchor Marker
|
|
105
108
|
if (actualIndex === this.anchorIndex) {
|
|
106
|
-
prefix = `${
|
|
109
|
+
prefix = `${_theme.theme.muted}> ${_ansi.ANSI.RESET}`;
|
|
107
110
|
}
|
|
108
111
|
// Cursor Marker
|
|
109
112
|
if (actualIndex === this.selectedIndex) {
|
|
110
|
-
prefix = `${
|
|
113
|
+
prefix = `${_theme.theme.main}${_symbols.symbols.pointer} `;
|
|
111
114
|
}
|
|
112
115
|
// Combined Marker
|
|
113
116
|
if (actualIndex === this.selectedIndex && actualIndex === this.anchorIndex) {
|
|
114
|
-
prefix = `${
|
|
117
|
+
prefix = `${_theme.theme.main}${_symbols.symbols.pointer}>`;
|
|
115
118
|
}
|
|
116
119
|
// Highlighting
|
|
117
120
|
if (isSelected) {
|
|
118
121
|
// Inside the range (and not cursor/anchor which have their own prefixes)
|
|
119
122
|
if (actualIndex !== this.selectedIndex && actualIndex !== this.anchorIndex) {
|
|
120
|
-
prefix = `${
|
|
123
|
+
prefix = `${_theme.theme.success}* ${_ansi.ANSI.RESET}`;
|
|
121
124
|
}
|
|
122
|
-
content = `${
|
|
125
|
+
content = `${_theme.theme.success}${title}${_ansi.ANSI.RESET}`;
|
|
123
126
|
}
|
|
124
127
|
// Underline Cursor
|
|
125
128
|
if (actualIndex === this.selectedIndex) {
|
|
126
|
-
content = `${
|
|
129
|
+
content = `${_ansi.ANSI.UNDERLINE}${content}${_ansi.ANSI.RESET}`;
|
|
127
130
|
}
|
|
128
131
|
output += `${prefix}${content}`;
|
|
129
132
|
}
|
|
130
133
|
});
|
|
131
134
|
}
|
|
132
|
-
output += `\n${
|
|
135
|
+
output += `\n${_theme.theme.muted}(Space to anchor, Enter to submit)${_ansi.ANSI.RESET}`;
|
|
133
136
|
this.renderFrame(output);
|
|
134
137
|
}
|
|
135
|
-
|
|
136
|
-
|
|
138
|
+
constructor(options){
|
|
139
|
+
super(options), _define_property(this, "anchorIndex", null);
|
|
140
|
+
if (options.initial) {
|
|
141
|
+
const maxIdx = Math.max(0, options.choices.length - 1);
|
|
142
|
+
this.anchorIndex = Math.min(Math.max(0, options.initial[0]), maxIdx);
|
|
143
|
+
this.selectedIndex = Math.min(Math.max(0, options.initial[1]), maxIdx);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
//# sourceMappingURL=select-range.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/select-range.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { SelectRangeOptions } from '../types';\nimport { SelectPrompt } from './select';\n\nexport class SelectRangePrompt<V> extends SelectPrompt<V, SelectRangeOptions<V>> {\n protected anchorIndex: number | null = null;\n\n constructor(options: SelectRangeOptions<V>) {\n super(options);\n if (options.initial) {\n const maxIdx = Math.max(0, options.choices.length - 1);\n this.anchorIndex = Math.min(Math.max(0, options.initial[0]), maxIdx);\n this.selectedIndex = Math.min(Math.max(0, options.initial[1]), maxIdx);\n }\n }\n\n protected handleInput(char: string, _key?: Buffer) {\n // Handle Enter (Submit)\n if (char === '\\r' || char === '\\n') {\n const choices = this.getFilteredChoices();\n if (choices.length === 0) return;\n if (this.isSeparator(choices[this.selectedIndex])) return;\n\n let start = this.selectedIndex;\n let end = this.selectedIndex;\n\n if (this.anchorIndex !== null) {\n start = Math.min(this.anchorIndex, this.selectedIndex);\n end = Math.max(this.anchorIndex, this.selectedIndex);\n }\n\n const selectedItems: V[] = [];\n for (let i = start; i <= end; i++) {\n const choice = choices[i];\n if (!this.isSeparator(choice)) {\n selectedItems.push(choice.value);\n }\n }\n\n this.submit(selectedItems);\n return;\n }\n\n // Handle Space (Anchor)\n if (char === ' ') {\n if (this.anchorIndex === null) {\n this.anchorIndex = this.selectedIndex;\n } else {\n this.anchorIndex = null;\n }\n this.render(false);\n return;\n }\n\n // Delegate navigation and search to SelectPrompt\n super.handleInput(char);\n\n // Check bounds after navigation/filtering\n const choices = this.getFilteredChoices();\n if (this.anchorIndex !== null && this.anchorIndex >= choices.length) {\n this.anchorIndex = null;\n }\n }\n\n protected render(_firstRender: boolean) {\n let output = '';\n const choices = this.getFilteredChoices();\n\n // Scroll Logic\n if (this.selectedIndex < this.scrollTop) {\n this.scrollTop = this.selectedIndex;\n } else if (this.selectedIndex >= this.scrollTop + this.pageSize) {\n this.scrollTop = this.selectedIndex - this.pageSize + 1;\n }\n if (this.scrollTop > choices.length - 1) {\n this.scrollTop = Math.max(0, choices.length - this.pageSize);\n }\n\n // Header\n const searchStr = this.searchBuffer ? ` ${theme.muted}(Filter: ${this.searchBuffer})${ANSI.RESET}` : '';\n output += `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}${searchStr}\\n`;\n\n if (choices.length === 0) {\n output += ` ${theme.muted}No results found${ANSI.RESET}`;\n } else {\n const visibleChoices = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);\n\n visibleChoices.forEach((choice, index) => {\n const actualIndex = this.scrollTop + index;\n if (index > 0) output += '\\n';\n\n let isSelected = false;\n if (this.anchorIndex !== null) {\n const min = Math.min(this.anchorIndex, this.selectedIndex);\n const max = Math.max(this.anchorIndex, this.selectedIndex);\n if (actualIndex >= min && actualIndex <= max) {\n isSelected = true;\n }\n } else if (actualIndex === this.selectedIndex) {\n isSelected = true;\n }\n\n if (this.isSeparator(choice)) {\n output += ` ${ANSI.DIM}${choice.text || symbols.line.repeat(8)}${ANSI.RESET}`;\n } else {\n let prefix = ' ';\n const title = choice.title;\n let content = title;\n\n // Anchor Marker\n if (actualIndex === this.anchorIndex) {\n prefix = `${theme.muted}> ${ANSI.RESET}`;\n }\n\n // Cursor Marker\n if (actualIndex === this.selectedIndex) {\n prefix = `${theme.main}${symbols.pointer} `;\n }\n\n // Combined Marker\n if (actualIndex === this.selectedIndex && actualIndex === this.anchorIndex) {\n prefix = `${theme.main}${symbols.pointer}>`;\n }\n\n // Highlighting\n if (isSelected) {\n // Inside the range (and not cursor/anchor which have their own prefixes)\n if (actualIndex !== this.selectedIndex && actualIndex !== this.anchorIndex) {\n prefix = `${theme.success}* ${ANSI.RESET}`;\n }\n\n content = `${theme.success}${title}${ANSI.RESET}`;\n }\n\n // Underline Cursor\n if (actualIndex === this.selectedIndex) {\n content = `${ANSI.UNDERLINE}${content}${ANSI.RESET}`;\n }\n\n output += `${prefix}${content}`;\n }\n });\n }\n\n output += `\\n${theme.muted}(Space to anchor, Enter to submit)${ANSI.RESET}`;\n\n this.renderFrame(output);\n }\n}\n"],"names":["SelectRangePrompt","SelectPrompt","handleInput","char","_key","choices","getFilteredChoices","length","isSeparator","selectedIndex","start","end","anchorIndex","Math","min","max","selectedItems","i","choice","push","value","submit","render","_firstRender","output","scrollTop","pageSize","searchStr","searchBuffer","theme","muted","ANSI","RESET","success","BOLD","title","options","message","visibleChoices","slice","forEach","index","actualIndex","isSelected","DIM","text","symbols","line","repeat","prefix","content","main","pointer","UNDERLINE","renderFrame","initial","maxIdx"],"mappings":"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"}
|