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,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
constructor(options) {
|
|
10
|
-
super(options);
|
|
11
|
-
this.search = '';
|
|
12
|
-
this.cursor = 0; // Index in the filtered list
|
|
13
|
-
this.filtered = [];
|
|
14
|
-
this.sortedEmojis = [];
|
|
15
|
-
this.cols = 0;
|
|
16
|
-
this.scrollTop = 0;
|
|
17
|
-
this.pageSize = 8; // Number of rows to display
|
|
18
|
-
// Sort emojis by recent
|
|
19
|
-
this.sortedEmojis = [...options.emojis];
|
|
20
|
-
if (options.recent && options.recent.length > 0) {
|
|
21
|
-
const recentSet = new Set(options.recent);
|
|
22
|
-
this.sortedEmojis.sort((a, b) => {
|
|
23
|
-
const aRecent = recentSet.has(a.name);
|
|
24
|
-
const bRecent = recentSet.has(b.name);
|
|
25
|
-
if (aRecent && !bRecent)
|
|
26
|
-
return -1;
|
|
27
|
-
if (!aRecent && bRecent)
|
|
28
|
-
return 1;
|
|
29
|
-
return 0;
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
this.checkWindowsAttention();
|
|
33
|
-
// Initial filter
|
|
34
|
-
this.filtered = this.sortedEmojis;
|
|
35
|
-
// Calculate layout
|
|
36
|
-
this.calculateLayout();
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "EmojiPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return EmojiPrompt;
|
|
37
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;
|
|
25
|
+
}
|
|
26
|
+
return obj;
|
|
27
|
+
}
|
|
28
|
+
let EmojiPrompt = class EmojiPrompt extends _base.Prompt {
|
|
38
29
|
calculateLayout() {
|
|
39
30
|
if (this.options.cols) {
|
|
40
31
|
this.cols = this.options.cols;
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
32
|
+
} else {
|
|
43
33
|
// Auto-detect based on terminal width
|
|
44
34
|
// Assume each emoji cell takes ~4 chars (2 char emoji + 2 padding)
|
|
45
35
|
const termWidth = process.stdout.columns || 80;
|
|
46
36
|
this.cols = Math.floor((termWidth - 4) / 4); // -4 for margin
|
|
47
|
-
if (this.cols < 1)
|
|
48
|
-
this.cols = 1;
|
|
37
|
+
if (this.cols < 1) this.cols = 1;
|
|
49
38
|
}
|
|
50
39
|
}
|
|
51
40
|
updateFilter() {
|
|
52
41
|
if (!this.search) {
|
|
53
42
|
this.filtered = this.sortedEmojis;
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
43
|
+
} else {
|
|
56
44
|
const lowerSearch = this.search.toLowerCase();
|
|
57
|
-
this.filtered = this.sortedEmojis.filter(e
|
|
58
|
-
(e.description && e.description.toLowerCase().includes(lowerSearch)) ||
|
|
59
|
-
e.char === this.search // Allow searching by exact char
|
|
45
|
+
this.filtered = this.sortedEmojis.filter((e)=>e.name.toLowerCase().includes(lowerSearch) || e.description && e.description.toLowerCase().includes(lowerSearch) || e.char === this.search // Allow searching by exact char
|
|
60
46
|
);
|
|
61
47
|
}
|
|
62
48
|
this.cursor = 0;
|
|
@@ -64,37 +50,35 @@ class EmojiPrompt extends base_1.Prompt {
|
|
|
64
50
|
}
|
|
65
51
|
render(_firstRender) {
|
|
66
52
|
// Prepare header (Search bar)
|
|
67
|
-
const icon = `${
|
|
68
|
-
const title = `${
|
|
69
|
-
const searchDisplay = this.search ? `${
|
|
53
|
+
const icon = `${_theme.theme.success}?`;
|
|
54
|
+
const title = `${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}`;
|
|
55
|
+
const searchDisplay = this.search ? `${_theme.theme.main}${this.search}${_ansi.ANSI.RESET}` : `${_theme.theme.muted}Type to search...${_ansi.ANSI.RESET}`;
|
|
70
56
|
let output = `${icon} ${title} ${searchDisplay}\n`;
|
|
71
57
|
// Render Grid
|
|
72
58
|
if (this.filtered.length === 0) {
|
|
73
|
-
output += `\n${
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
59
|
+
output += `\n${_theme.theme.error}No results found.${_ansi.ANSI.RESET}\n`;
|
|
60
|
+
} else {
|
|
76
61
|
const totalRows = Math.ceil(this.filtered.length / this.cols);
|
|
77
62
|
const startRow = this.scrollTop;
|
|
78
63
|
const endRow = Math.min(totalRows, startRow + this.pageSize);
|
|
79
|
-
for
|
|
64
|
+
for(let r = startRow; r < endRow; r++){
|
|
80
65
|
let rowStr = ' '; // Left margin
|
|
81
|
-
for
|
|
66
|
+
for(let c = 0; c < this.cols; c++){
|
|
82
67
|
const idx = r * this.cols + c;
|
|
83
|
-
if (idx >= this.filtered.length)
|
|
84
|
-
break;
|
|
68
|
+
if (idx >= this.filtered.length) break;
|
|
85
69
|
const item = this.filtered[idx];
|
|
86
70
|
const isSelected = idx === this.cursor;
|
|
87
71
|
// Render Emoji
|
|
88
72
|
// Align center in 4 chars
|
|
89
73
|
// Emoji width is typically 2.
|
|
90
74
|
const emoji = item.char;
|
|
91
|
-
const width = (0,
|
|
75
|
+
const width = (0, _utils.stringWidth)(emoji);
|
|
92
76
|
const padding = 4 - width;
|
|
93
77
|
const leftPad = Math.floor(padding / 2);
|
|
94
78
|
const rightPad = padding - leftPad;
|
|
95
79
|
let cell = `${' '.repeat(leftPad)}${emoji}${' '.repeat(rightPad)}`;
|
|
96
80
|
if (isSelected) {
|
|
97
|
-
cell = `${
|
|
81
|
+
cell = `${_ansi.ANSI.REVERSE}${cell}${_ansi.ANSI.RESET}`;
|
|
98
82
|
}
|
|
99
83
|
rowStr += cell;
|
|
100
84
|
}
|
|
@@ -103,12 +87,11 @@ class EmojiPrompt extends base_1.Prompt {
|
|
|
103
87
|
// Footer (Preview of selected)
|
|
104
88
|
if (this.filtered.length > 0) {
|
|
105
89
|
const selectedItem = this.filtered[this.cursor];
|
|
106
|
-
output += `\n${
|
|
90
|
+
output += `\n${_ansi.ANSI.BOLD}${selectedItem.char} ${selectedItem.name}${_ansi.ANSI.RESET}`;
|
|
107
91
|
if (selectedItem.description) {
|
|
108
|
-
output += ` - ${
|
|
92
|
+
output += ` - ${_theme.theme.muted}${selectedItem.description}${_ansi.ANSI.RESET}`;
|
|
109
93
|
}
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
94
|
+
} else {
|
|
112
95
|
output += '\n'; // Spacer
|
|
113
96
|
}
|
|
114
97
|
}
|
|
@@ -119,8 +102,7 @@ class EmojiPrompt extends base_1.Prompt {
|
|
|
119
102
|
handleInput(char) {
|
|
120
103
|
// Navigation
|
|
121
104
|
if (this.isUp(char)) {
|
|
122
|
-
if (this.filtered.length === 0)
|
|
123
|
-
return;
|
|
105
|
+
if (this.filtered.length === 0) return;
|
|
124
106
|
const newCursor = this.cursor - this.cols;
|
|
125
107
|
if (newCursor >= 0) {
|
|
126
108
|
this.cursor = newCursor;
|
|
@@ -130,8 +112,7 @@ class EmojiPrompt extends base_1.Prompt {
|
|
|
130
112
|
return;
|
|
131
113
|
}
|
|
132
114
|
if (this.isDown(char)) {
|
|
133
|
-
if (this.filtered.length === 0)
|
|
134
|
-
return;
|
|
115
|
+
if (this.filtered.length === 0) return;
|
|
135
116
|
const newCursor = this.cursor + this.cols;
|
|
136
117
|
if (newCursor < this.filtered.length) {
|
|
137
118
|
this.cursor = newCursor;
|
|
@@ -141,12 +122,10 @@ class EmojiPrompt extends base_1.Prompt {
|
|
|
141
122
|
return;
|
|
142
123
|
}
|
|
143
124
|
if (this.isLeft(char)) {
|
|
144
|
-
if (this.filtered.length === 0)
|
|
145
|
-
return;
|
|
125
|
+
if (this.filtered.length === 0) return;
|
|
146
126
|
if (this.cursor > 0) {
|
|
147
127
|
this.cursor--;
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
128
|
+
} else {
|
|
150
129
|
// Wrap to end?
|
|
151
130
|
this.cursor = this.filtered.length - 1;
|
|
152
131
|
}
|
|
@@ -155,12 +134,10 @@ class EmojiPrompt extends base_1.Prompt {
|
|
|
155
134
|
return;
|
|
156
135
|
}
|
|
157
136
|
if (this.isRight(char)) {
|
|
158
|
-
if (this.filtered.length === 0)
|
|
159
|
-
return;
|
|
137
|
+
if (this.filtered.length === 0) return;
|
|
160
138
|
if (this.cursor < this.filtered.length - 1) {
|
|
161
139
|
this.cursor++;
|
|
162
|
-
}
|
|
163
|
-
else {
|
|
140
|
+
} else {
|
|
164
141
|
// Wrap to start?
|
|
165
142
|
this.cursor = 0;
|
|
166
143
|
}
|
|
@@ -197,17 +174,14 @@ class EmojiPrompt extends base_1.Prompt {
|
|
|
197
174
|
// Left / Previous
|
|
198
175
|
if (this.cursor > 0) {
|
|
199
176
|
this.cursor--;
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
177
|
+
} else {
|
|
202
178
|
this.cursor = this.filtered.length - 1;
|
|
203
179
|
}
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
180
|
+
} else {
|
|
206
181
|
// Right / Next
|
|
207
182
|
if (this.cursor < this.filtered.length - 1) {
|
|
208
183
|
this.cursor++;
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
184
|
+
} else {
|
|
211
185
|
this.cursor = 0;
|
|
212
186
|
}
|
|
213
187
|
}
|
|
@@ -219,10 +193,34 @@ class EmojiPrompt extends base_1.Prompt {
|
|
|
219
193
|
const cursorRow = Math.floor(this.cursor / this.cols);
|
|
220
194
|
if (cursorRow < this.scrollTop) {
|
|
221
195
|
this.scrollTop = cursorRow;
|
|
222
|
-
}
|
|
223
|
-
else if (cursorRow >= this.scrollTop + this.pageSize) {
|
|
196
|
+
} else if (cursorRow >= this.scrollTop + this.pageSize) {
|
|
224
197
|
this.scrollTop = cursorRow - this.pageSize + 1;
|
|
225
198
|
}
|
|
226
199
|
}
|
|
227
|
-
|
|
228
|
-
|
|
200
|
+
constructor(options){
|
|
201
|
+
super(options), _define_property(this, "search", ''), _define_property(this, "cursor", 0) // Index in the filtered list
|
|
202
|
+
, _define_property(this, "filtered", []), _define_property(this, "sortedEmojis", []), _define_property(this, "cols", 0), _define_property(this, "scrollTop", 0), _define_property(this, "pageSize", 8) // Number of rows to display
|
|
203
|
+
;
|
|
204
|
+
// Sort emojis by recent
|
|
205
|
+
this.sortedEmojis = [
|
|
206
|
+
...options.emojis
|
|
207
|
+
];
|
|
208
|
+
if (options.recent && options.recent.length > 0) {
|
|
209
|
+
const recentSet = new Set(options.recent);
|
|
210
|
+
this.sortedEmojis.sort((a, b)=>{
|
|
211
|
+
const aRecent = recentSet.has(a.name);
|
|
212
|
+
const bRecent = recentSet.has(b.name);
|
|
213
|
+
if (aRecent && !bRecent) return -1;
|
|
214
|
+
if (!aRecent && bRecent) return 1;
|
|
215
|
+
return 0;
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
this.checkWindowsAttention();
|
|
219
|
+
// Initial filter
|
|
220
|
+
this.filtered = this.sortedEmojis;
|
|
221
|
+
// Calculate layout
|
|
222
|
+
this.calculateLayout();
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
//# sourceMappingURL=emoji.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/emoji.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { EmojiOptions, EmojiItem, MouseEvent } from '../types';\nimport { stringWidth } from '../utils';\n\nexport class EmojiPrompt extends Prompt<string, EmojiOptions> {\n private search: string = '';\n private cursor: number = 0; // Index in the filtered list\n private filtered: EmojiItem[] = [];\n private sortedEmojis: EmojiItem[] = [];\n private cols: number = 0;\n private scrollTop: number = 0;\n private pageSize: number = 8; // Number of rows to display\n\n constructor(options: EmojiOptions) {\n super(options);\n\n // Sort emojis by recent\n this.sortedEmojis = [...options.emojis];\n if (options.recent && options.recent.length > 0) {\n const recentSet = new Set(options.recent);\n this.sortedEmojis.sort((a, b) => {\n const aRecent = recentSet.has(a.name);\n const bRecent = recentSet.has(b.name);\n if (aRecent && !bRecent) return -1;\n if (!aRecent && bRecent) return 1;\n return 0;\n });\n }\n\n this.checkWindowsAttention();\n\n // Initial filter\n this.filtered = this.sortedEmojis;\n\n // Calculate layout\n this.calculateLayout();\n }\n\n private calculateLayout() {\n if (this.options.cols) {\n this.cols = this.options.cols;\n } else {\n // Auto-detect based on terminal width\n // Assume each emoji cell takes ~4 chars (2 char emoji + 2 padding)\n const termWidth = process.stdout.columns || 80;\n this.cols = Math.floor((termWidth - 4) / 4); // -4 for margin\n if (this.cols < 1) this.cols = 1;\n }\n }\n\n private updateFilter() {\n if (!this.search) {\n this.filtered = this.sortedEmojis;\n } else {\n const lowerSearch = this.search.toLowerCase();\n this.filtered = this.sortedEmojis.filter(e =>\n e.name.toLowerCase().includes(lowerSearch) ||\n (e.description && e.description.toLowerCase().includes(lowerSearch)) ||\n e.char === this.search // Allow searching by exact char\n );\n }\n this.cursor = 0;\n this.scrollTop = 0;\n }\n\n protected render(_firstRender: boolean): void {\n // Prepare header (Search bar)\n const icon = `${theme.success}?`;\n const title = `${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}`;\n const searchDisplay = this.search ? `${theme.main}${this.search}${ANSI.RESET}` : `${theme.muted}Type to search...${ANSI.RESET}`;\n\n let output = `${icon} ${title} ${searchDisplay}\\n`;\n\n // Render Grid\n if (this.filtered.length === 0) {\n output += `\\n${theme.error}No results found.${ANSI.RESET}\\n`;\n } else {\n const totalRows = Math.ceil(this.filtered.length / this.cols);\n const startRow = this.scrollTop;\n const endRow = Math.min(totalRows, startRow + this.pageSize);\n\n for (let r = startRow; r < endRow; r++) {\n let rowStr = ' '; // Left margin\n for (let c = 0; c < this.cols; c++) {\n const idx = r * this.cols + c;\n if (idx >= this.filtered.length) break;\n\n const item = this.filtered[idx];\n const isSelected = idx === this.cursor;\n\n // Render Emoji\n // Align center in 4 chars\n // Emoji width is typically 2.\n const emoji = item.char;\n const width = stringWidth(emoji);\n const padding = 4 - width;\n const leftPad = Math.floor(padding / 2);\n const rightPad = padding - leftPad;\n\n let cell = `${' '.repeat(leftPad)}${emoji}${' '.repeat(rightPad)}`;\n\n if (isSelected) {\n cell = `${ANSI.REVERSE}${cell}${ANSI.RESET}`;\n }\n\n rowStr += cell;\n }\n output += rowStr + '\\n';\n }\n\n // Footer (Preview of selected)\n if (this.filtered.length > 0) {\n const selectedItem = this.filtered[this.cursor];\n output += `\\n${ANSI.BOLD}${selectedItem.char} ${selectedItem.name}${ANSI.RESET}`;\n if (selectedItem.description) {\n output += ` - ${theme.muted}${selectedItem.description}${ANSI.RESET}`;\n }\n } else {\n output += '\\n'; // Spacer\n }\n }\n\n // Navigation hints\n // output += `\\n${theme.muted}Arrows to navigate, Enter to select${ANSI.RESET}`;\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string): void {\n // Navigation\n if (this.isUp(char)) {\n if (this.filtered.length === 0) return;\n const newCursor = this.cursor - this.cols;\n if (newCursor >= 0) {\n this.cursor = newCursor;\n }\n this.adjustScroll();\n this.render(false);\n return;\n }\n\n if (this.isDown(char)) {\n if (this.filtered.length === 0) return;\n const newCursor = this.cursor + this.cols;\n if (newCursor < this.filtered.length) {\n this.cursor = newCursor;\n }\n this.adjustScroll();\n this.render(false);\n return;\n }\n\n if (this.isLeft(char)) {\n if (this.filtered.length === 0) return;\n if (this.cursor > 0) {\n this.cursor--;\n } else {\n // Wrap to end?\n this.cursor = this.filtered.length - 1;\n }\n this.adjustScroll();\n this.render(false);\n return;\n }\n\n if (this.isRight(char)) {\n if (this.filtered.length === 0) return;\n if (this.cursor < this.filtered.length - 1) {\n this.cursor++;\n } else {\n // Wrap to start?\n this.cursor = 0;\n }\n this.adjustScroll();\n this.render(false);\n return;\n }\n\n // Enter\n if (char === '\\r' || char === '\\n') {\n if (this.filtered.length > 0) {\n this.submit(this.filtered[this.cursor].char);\n }\n return;\n }\n\n // Backspace\n if (char === '\\u0008' || char === '\\x7f') {\n if (this.search.length > 0) {\n this.search = this.search.slice(0, -1);\n this.updateFilter();\n this.render(false);\n }\n return;\n }\n\n // Typing\n if (!/^[\\x00-\\x1F]/.test(char) && !char.startsWith('\\x1b')) {\n this.search += char;\n this.updateFilter();\n this.render(false);\n }\n }\n\n protected handleMouse(event: MouseEvent): void {\n if (event.action === 'scroll' && this.filtered.length > 0) {\n if (event.scroll === 'up') {\n // Left / Previous\n if (this.cursor > 0) {\n this.cursor--;\n } else {\n this.cursor = this.filtered.length - 1;\n }\n } else {\n // Right / Next\n if (this.cursor < this.filtered.length - 1) {\n this.cursor++;\n } else {\n this.cursor = 0;\n }\n }\n this.adjustScroll();\n this.render(false);\n }\n }\n\n private adjustScroll() {\n const cursorRow = Math.floor(this.cursor / this.cols);\n\n if (cursorRow < this.scrollTop) {\n this.scrollTop = cursorRow;\n } else if (cursorRow >= this.scrollTop + this.pageSize) {\n this.scrollTop = cursorRow - this.pageSize + 1;\n }\n }\n}\n"],"names":["EmojiPrompt","Prompt","calculateLayout","options","cols","termWidth","process","stdout","columns","Math","floor","updateFilter","search","filtered","sortedEmojis","lowerSearch","toLowerCase","filter","e","name","includes","description","char","cursor","scrollTop","render","_firstRender","icon","theme","success","title","ANSI","BOLD","message","RESET","searchDisplay","main","muted","output","length","error","totalRows","ceil","startRow","endRow","min","pageSize","r","rowStr","c","idx","item","isSelected","emoji","width","stringWidth","padding","leftPad","rightPad","cell","repeat","REVERSE","selectedItem","renderFrame","handleInput","isUp","newCursor","adjustScroll","isDown","isLeft","isRight","submit","slice","test","startsWith","handleMouse","event","action","scroll","cursorRow","emojis","recent","recentSet","Set","sort","a","b","aRecent","has","bRecent","checkWindowsAttention"],"mappings":"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"}
|
|
@@ -1,31 +1,47 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class ExecPrompt extends base_1.Prompt {
|
|
10
|
-
constructor(options) {
|
|
11
|
-
super(options);
|
|
12
|
-
this.status = 'running';
|
|
13
|
-
this.stdoutBuffer = '';
|
|
14
|
-
this.stderrBuffer = '';
|
|
15
|
-
this.lastLogLine = '';
|
|
16
|
-
// Experimental warning removed
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "ExecPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return ExecPrompt;
|
|
17
9
|
}
|
|
10
|
+
});
|
|
11
|
+
const _child_process = require("child_process");
|
|
12
|
+
const _base = require("../base");
|
|
13
|
+
const _theme = require("../theme");
|
|
14
|
+
const _symbols = require("../symbols");
|
|
15
|
+
const _ansi = require("../ansi");
|
|
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 ExecPrompt = class ExecPrompt extends _base.Prompt {
|
|
18
30
|
run() {
|
|
19
|
-
this.child = (0,
|
|
31
|
+
this.child = (0, _child_process.spawn)(this.options.command, [], {
|
|
20
32
|
cwd: this.options.cwd || process.cwd(),
|
|
21
33
|
shell: true,
|
|
22
34
|
// Use 'ignore' for stdin so parent keeps control (and raw mode).
|
|
23
35
|
// Use 'pipe' for stdout/stderr to capture output.
|
|
24
|
-
stdio: [
|
|
36
|
+
stdio: [
|
|
37
|
+
'ignore',
|
|
38
|
+
'pipe',
|
|
39
|
+
'pipe'
|
|
40
|
+
]
|
|
25
41
|
});
|
|
26
42
|
// Capture stdout
|
|
27
43
|
if (this.child.stdout) {
|
|
28
|
-
this.child.stdout.on('data', (data)
|
|
44
|
+
this.child.stdout.on('data', (data)=>{
|
|
29
45
|
const chunk = data.toString();
|
|
30
46
|
this.stdoutBuffer += chunk;
|
|
31
47
|
this.updateLastLogLine(chunk);
|
|
@@ -33,31 +49,28 @@ class ExecPrompt extends base_1.Prompt {
|
|
|
33
49
|
}
|
|
34
50
|
// Capture stderr
|
|
35
51
|
if (this.child.stderr) {
|
|
36
|
-
this.child.stderr.on('data', (data)
|
|
52
|
+
this.child.stderr.on('data', (data)=>{
|
|
37
53
|
const chunk = data.toString();
|
|
38
54
|
this.stderrBuffer += chunk;
|
|
39
55
|
this.updateLastLogLine(chunk);
|
|
40
56
|
});
|
|
41
57
|
}
|
|
42
58
|
if (this.options.timeout && this.options.timeout > 0) {
|
|
43
|
-
this.timer = setTimeout(()
|
|
44
|
-
if (this.status !== 'running')
|
|
45
|
-
return;
|
|
59
|
+
this.timer = setTimeout(()=>{
|
|
60
|
+
if (this.status !== 'running') return;
|
|
46
61
|
this.status = 'error';
|
|
47
62
|
this.render(false);
|
|
48
63
|
this.killChild();
|
|
49
64
|
this.cancel(new Error(`Timeout after ${this.options.timeout}ms`));
|
|
50
65
|
}, this.options.timeout);
|
|
51
66
|
}
|
|
52
|
-
this.child.on('exit', (code)
|
|
53
|
-
if (this.status !== 'running')
|
|
54
|
-
return;
|
|
67
|
+
this.child.on('exit', (code)=>{
|
|
68
|
+
if (this.status !== 'running') return;
|
|
55
69
|
if (code === 0) {
|
|
56
70
|
this.status = 'done';
|
|
57
71
|
this.render(false);
|
|
58
72
|
this.submit();
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
73
|
+
} else {
|
|
61
74
|
this.status = 'error';
|
|
62
75
|
this.render(false);
|
|
63
76
|
const errorMessage = this.stderrBuffer.trim() || `Command failed with exit code ${code}`;
|
|
@@ -71,9 +84,8 @@ class ExecPrompt extends base_1.Prompt {
|
|
|
71
84
|
this.cancel(err);
|
|
72
85
|
}
|
|
73
86
|
});
|
|
74
|
-
this.child.on('error', (err)
|
|
75
|
-
if (this.status !== 'running')
|
|
76
|
-
return;
|
|
87
|
+
this.child.on('error', (err)=>{
|
|
88
|
+
if (this.status !== 'running') return;
|
|
77
89
|
this.status = 'error';
|
|
78
90
|
this.render(false);
|
|
79
91
|
this.cancel(err);
|
|
@@ -84,7 +96,7 @@ class ExecPrompt extends base_1.Prompt {
|
|
|
84
96
|
// We only want the last non-empty line
|
|
85
97
|
const lines = chunk.split('\n');
|
|
86
98
|
// Iterate backwards
|
|
87
|
-
for
|
|
99
|
+
for(let i = lines.length - 1; i >= 0; i--){
|
|
88
100
|
const line = lines[i].trim();
|
|
89
101
|
if (line) {
|
|
90
102
|
this.lastLogLine = line;
|
|
@@ -100,21 +112,18 @@ class ExecPrompt extends base_1.Prompt {
|
|
|
100
112
|
}
|
|
101
113
|
cleanup() {
|
|
102
114
|
this.status = 'done';
|
|
103
|
-
if (this.timer)
|
|
104
|
-
clearTimeout(this.timer);
|
|
115
|
+
if (this.timer) clearTimeout(this.timer);
|
|
105
116
|
this.killChild();
|
|
106
117
|
super.cleanup();
|
|
107
118
|
}
|
|
108
119
|
render(_firstRender) {
|
|
109
120
|
let symbol = '';
|
|
110
121
|
if (this.status === 'running') {
|
|
111
|
-
symbol =
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
else if (this.status === 'error') {
|
|
117
|
-
symbol = theme_1.theme.error + symbols_1.symbols.cross + ansi_1.ANSI.RESET;
|
|
122
|
+
symbol = _theme.theme.muted + '...' + _ansi.ANSI.RESET;
|
|
123
|
+
} else if (this.status === 'done') {
|
|
124
|
+
symbol = _theme.theme.success + _symbols.symbols.tick + _ansi.ANSI.RESET;
|
|
125
|
+
} else if (this.status === 'error') {
|
|
126
|
+
symbol = _theme.theme.error + _symbols.symbols.cross + _ansi.ANSI.RESET;
|
|
118
127
|
}
|
|
119
128
|
let details = '';
|
|
120
129
|
if (this.status === 'running' && this.lastLogLine) {
|
|
@@ -124,14 +133,19 @@ class ExecPrompt extends base_1.Prompt {
|
|
|
124
133
|
if (line.length > maxLen) {
|
|
125
134
|
line = line.substring(0, maxLen - 3) + '...';
|
|
126
135
|
}
|
|
127
|
-
details = ` ${
|
|
136
|
+
details = ` ${_theme.theme.muted}${line}${_ansi.ANSI.RESET}`;
|
|
128
137
|
}
|
|
129
|
-
const output = `${
|
|
138
|
+
const output = `${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} ${symbol}${details}`;
|
|
130
139
|
this.renderFrame(output);
|
|
131
140
|
}
|
|
132
141
|
handleInput(_char, _key) {
|
|
133
|
-
|
|
134
|
-
|
|
142
|
+
// Prompt base class handles Ctrl+C (SIGINT) in _onKeyHandler
|
|
143
|
+
// which calls cleanup() -> killChild().
|
|
135
144
|
}
|
|
136
|
-
|
|
137
|
-
|
|
145
|
+
constructor(options){
|
|
146
|
+
super(options), _define_property(this, "child", void 0), _define_property(this, "status", 'running'), _define_property(this, "timer", void 0), _define_property(this, "stdoutBuffer", ''), _define_property(this, "stderrBuffer", ''), _define_property(this, "lastLogLine", '');
|
|
147
|
+
// Experimental warning removed
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
//# sourceMappingURL=exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/exec.ts"],"sourcesContent":["import { spawn, ChildProcess } from 'child_process';\nimport { Prompt } from '../base';\nimport { ExecOptions } from '../types';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { ANSI } from '../ansi';\n\nexport class ExecPrompt extends Prompt<void, ExecOptions> {\n private child?: ChildProcess;\n private status: 'running' | 'done' | 'error' = 'running';\n private timer?: NodeJS.Timeout;\n private stdoutBuffer: string = '';\n private stderrBuffer: string = '';\n private lastLogLine: string = '';\n\n constructor(options: ExecOptions) {\n super(options);\n // Experimental warning removed\n }\n\n public run(): Promise<void> {\n this.child = spawn(this.options.command, [], {\n cwd: this.options.cwd || process.cwd(),\n shell: true,\n // Use 'ignore' for stdin so parent keeps control (and raw mode).\n // Use 'pipe' for stdout/stderr to capture output.\n stdio: ['ignore', 'pipe', 'pipe']\n });\n\n // Capture stdout\n if (this.child.stdout) {\n this.child.stdout.on('data', (data: Buffer) => {\n const chunk = data.toString();\n this.stdoutBuffer += chunk;\n this.updateLastLogLine(chunk);\n });\n }\n\n // Capture stderr\n if (this.child.stderr) {\n this.child.stderr.on('data', (data: Buffer) => {\n const chunk = data.toString();\n this.stderrBuffer += chunk;\n this.updateLastLogLine(chunk);\n });\n }\n\n if (this.options.timeout && this.options.timeout > 0) {\n this.timer = setTimeout(() => {\n if (this.status !== 'running') return;\n this.status = 'error';\n this.render(false);\n this.killChild();\n this.cancel(new Error(`Timeout after ${this.options.timeout}ms`));\n }, this.options.timeout);\n }\n\n this.child.on('exit', (code) => {\n if (this.status !== 'running') return;\n \n if (code === 0) {\n this.status = 'done';\n this.render(false);\n this.submit();\n } else {\n this.status = 'error';\n this.render(false);\n \n const errorMessage = this.stderrBuffer.trim() || `Command failed with exit code ${code}`;\n const err = new Error(errorMessage);\n // Attach details\n Object.assign(err, {\n code,\n stdout: this.stdoutBuffer,\n stderr: this.stderrBuffer\n });\n \n this.cancel(err);\n }\n });\n\n this.child.on('error', (err) => {\n if (this.status !== 'running') return;\n this.status = 'error';\n this.render(false);\n this.cancel(err);\n });\n\n return super.run();\n }\n\n private updateLastLogLine(chunk: string) {\n // We only want the last non-empty line\n const lines = chunk.split('\\n');\n // Iterate backwards\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i].trim();\n if (line) {\n this.lastLogLine = line;\n this.render(false);\n break;\n }\n }\n }\n\n private killChild() {\n if (this.child && !this.child.killed) {\n this.child.kill();\n }\n }\n\n protected cleanup() {\n this.status = 'done';\n if (this.timer) clearTimeout(this.timer);\n this.killChild();\n super.cleanup();\n }\n\n protected render(_firstRender: boolean) {\n let symbol = '';\n\n if (this.status === 'running') {\n symbol = theme.muted + '...' + ANSI.RESET;\n } else if (this.status === 'done') {\n symbol = theme.success + symbols.tick + ANSI.RESET;\n } else if (this.status === 'error') {\n symbol = theme.error + symbols.cross + ANSI.RESET;\n }\n\n let details = '';\n if (this.status === 'running' && this.lastLogLine) {\n // Truncate for display\n const maxLen = 50;\n let line = this.stripAnsi(this.lastLogLine);\n if (line.length > maxLen) {\n line = line.substring(0, maxLen - 3) + '...';\n }\n details = ` ${theme.muted}${line}${ANSI.RESET}`;\n }\n\n const output = `${theme.title}${this.options.message}${ANSI.RESET} ${symbol}${details}`;\n this.renderFrame(output);\n }\n\n protected handleInput(_char: string, _key: Buffer) {\n // Prompt base class handles Ctrl+C (SIGINT) in _onKeyHandler\n // which calls cleanup() -> killChild().\n }\n}\n"],"names":["ExecPrompt","Prompt","run","child","spawn","options","command","cwd","process","shell","stdio","stdout","on","data","chunk","toString","stdoutBuffer","updateLastLogLine","stderr","stderrBuffer","timeout","timer","setTimeout","status","render","killChild","cancel","Error","code","submit","errorMessage","trim","err","Object","assign","lines","split","i","length","line","lastLogLine","killed","kill","cleanup","clearTimeout","_firstRender","symbol","theme","muted","ANSI","RESET","success","symbols","tick","error","cross","details","maxLen","stripAnsi","substring","output","title","message","renderFrame","handleInput","_char","_key"],"mappings":";;;;+BAOaA;;;eAAAA;;;+BAPuB;sBACb;uBAED;yBACE;sBACH;;;;;;;;;;;;;;AAEd,IAAA,AAAMA,aAAN,MAAMA,mBAAmBC,YAAM;IAa3BC,MAAqB;QACxB,IAAI,CAACC,KAAK,GAAGC,IAAAA,oBAAK,EAAC,IAAI,CAACC,OAAO,CAACC,OAAO,EAAE,EAAE,EAAE;YACzCC,KAAK,IAAI,CAACF,OAAO,CAACE,GAAG,IAAIC,QAAQD,GAAG;YACpCE,OAAO;YACP,iEAAiE;YACjE,kDAAkD;YAClDC,OAAO;gBAAC;gBAAU;gBAAQ;aAAO;QACrC;QAEA,iBAAiB;QACjB,IAAI,IAAI,CAACP,KAAK,CAACQ,MAAM,EAAE;YACnB,IAAI,CAACR,KAAK,CAACQ,MAAM,CAACC,EAAE,CAAC,QAAQ,CAACC;gBAC1B,MAAMC,QAAQD,KAAKE,QAAQ;gBAC3B,IAAI,CAACC,YAAY,IAAIF;gBACrB,IAAI,CAACG,iBAAiB,CAACH;YAC3B;QACJ;QAEA,iBAAiB;QACjB,IAAI,IAAI,CAACX,KAAK,CAACe,MAAM,EAAE;YACnB,IAAI,CAACf,KAAK,CAACe,MAAM,CAACN,EAAE,CAAC,QAAQ,CAACC;gBAC1B,MAAMC,QAAQD,KAAKE,QAAQ;gBAC3B,IAAI,CAACI,YAAY,IAAIL;gBACrB,IAAI,CAACG,iBAAiB,CAACH;YAC3B;QACJ;QAEA,IAAI,IAAI,CAACT,OAAO,CAACe,OAAO,IAAI,IAAI,CAACf,OAAO,CAACe,OAAO,GAAG,GAAG;YAClD,IAAI,CAACC,KAAK,GAAGC,WAAW;gBACpB,IAAI,IAAI,CAACC,MAAM,KAAK,WAAW;gBAC/B,IAAI,CAACA,MAAM,GAAG;gBACd,IAAI,CAACC,MAAM,CAAC;gBACZ,IAAI,CAACC,SAAS;gBACd,IAAI,CAACC,MAAM,CAAC,IAAIC,MAAM,CAAC,cAAc,EAAE,IAAI,CAACtB,OAAO,CAACe,OAAO,CAAC,EAAE,CAAC;YACnE,GAAG,IAAI,CAACf,OAAO,CAACe,OAAO;QAC3B;QAEA,IAAI,CAACjB,KAAK,CAACS,EAAE,CAAC,QAAQ,CAACgB;YACnB,IAAI,IAAI,CAACL,MAAM,KAAK,WAAW;YAE/B,IAAIK,SAAS,GAAG;gBACZ,IAAI,CAACL,MAAM,GAAG;gBACd,IAAI,CAACC,MAAM,CAAC;gBACZ,IAAI,CAACK,MAAM;YACf,OAAO;gBACH,IAAI,CAACN,MAAM,GAAG;gBACd,IAAI,CAACC,MAAM,CAAC;gBAEZ,MAAMM,eAAe,IAAI,CAACX,YAAY,CAACY,IAAI,MAAM,CAAC,8BAA8B,EAAEH,MAAM;gBACxF,MAAMI,MAAM,IAAIL,MAAMG;gBACtB,iBAAiB;gBACjBG,OAAOC,MAAM,CAACF,KAAK;oBACfJ;oBACAjB,QAAQ,IAAI,CAACK,YAAY;oBACzBE,QAAQ,IAAI,CAACC,YAAY;gBAC7B;gBAEA,IAAI,CAACO,MAAM,CAACM;YAChB;QACJ;QAEA,IAAI,CAAC7B,KAAK,CAACS,EAAE,CAAC,SAAS,CAACoB;YACpB,IAAI,IAAI,CAACT,MAAM,KAAK,WAAW;YAC/B,IAAI,CAACA,MAAM,GAAG;YACd,IAAI,CAACC,MAAM,CAAC;YACZ,IAAI,CAACE,MAAM,CAACM;QAChB;QAEA,OAAO,KAAK,CAAC9B;IACjB;IAEQe,kBAAkBH,KAAa,EAAE;QACrC,uCAAuC;QACvC,MAAMqB,QAAQrB,MAAMsB,KAAK,CAAC;QAC1B,oBAAoB;QACpB,IAAK,IAAIC,IAAIF,MAAMG,MAAM,GAAG,GAAGD,KAAK,GAAGA,IAAK;YACxC,MAAME,OAAOJ,KAAK,CAACE,EAAE,CAACN,IAAI;YAC1B,IAAIQ,MAAM;gBACN,IAAI,CAACC,WAAW,GAAGD;gBACnB,IAAI,CAACf,MAAM,CAAC;gBACZ;YACJ;QACJ;IACJ;IAEQC,YAAY;QAChB,IAAI,IAAI,CAACtB,KAAK,IAAI,CAAC,IAAI,CAACA,KAAK,CAACsC,MAAM,EAAE;YAClC,IAAI,CAACtC,KAAK,CAACuC,IAAI;QACnB;IACJ;IAEUC,UAAU;QAChB,IAAI,CAACpB,MAAM,GAAG;QACd,IAAI,IAAI,CAACF,KAAK,EAAEuB,aAAa,IAAI,CAACvB,KAAK;QACvC,IAAI,CAACI,SAAS;QACd,KAAK,CAACkB;IACV;IAEUnB,OAAOqB,YAAqB,EAAE;QACpC,IAAIC,SAAS;QAEb,IAAI,IAAI,CAACvB,MAAM,KAAK,WAAW;YAC3BuB,SAASC,YAAK,CAACC,KAAK,GAAG,QAAQC,UAAI,CAACC,KAAK;QAC7C,OAAO,IAAI,IAAI,CAAC3B,MAAM,KAAK,QAAQ;YAC/BuB,SAASC,YAAK,CAACI,OAAO,GAAGC,gBAAO,CAACC,IAAI,GAAGJ,UAAI,CAACC,KAAK;QACtD,OAAO,IAAI,IAAI,CAAC3B,MAAM,KAAK,SAAS;YAChCuB,SAASC,YAAK,CAACO,KAAK,GAAGF,gBAAO,CAACG,KAAK,GAAGN,UAAI,CAACC,KAAK;QACrD;QAEA,IAAIM,UAAU;QACd,IAAI,IAAI,CAACjC,MAAM,KAAK,aAAa,IAAI,CAACiB,WAAW,EAAE;YAC/C,uBAAuB;YACvB,MAAMiB,SAAS;YACf,IAAIlB,OAAO,IAAI,CAACmB,SAAS,CAAC,IAAI,CAAClB,WAAW;YAC1C,IAAID,KAAKD,MAAM,GAAGmB,QAAQ;gBACtBlB,OAAOA,KAAKoB,SAAS,CAAC,GAAGF,SAAS,KAAK;YAC3C;YACAD,UAAU,CAAC,CAAC,EAAET,YAAK,CAACC,KAAK,GAAGT,OAAOU,UAAI,CAACC,KAAK,EAAE;QACnD;QAEA,MAAMU,SAAS,GAAGb,YAAK,CAACc,KAAK,GAAG,IAAI,CAACxD,OAAO,CAACyD,OAAO,GAAGb,UAAI,CAACC,KAAK,CAAC,CAAC,EAAEJ,SAASU,SAAS;QACvF,IAAI,CAACO,WAAW,CAACH;IACrB;IAEUI,YAAYC,KAAa,EAAEC,IAAY,EAAE;IAC/C,6DAA6D;IAC7D,wCAAwC;IAC5C;IApIA,YAAY7D,OAAoB,CAAE;QAC9B,KAAK,CAACA,UARV,uBAAQF,SAAR,KAAA,IACA,uBAAQoB,UAAuC,YAC/C,uBAAQF,SAAR,KAAA,IACA,uBAAQL,gBAAuB,KAC/B,uBAAQG,gBAAuB,KAC/B,uBAAQqB,eAAsB;IAI1B,+BAA+B;IACnC;AAkIJ"}
|