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,46 +1,56 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
super(options);
|
|
10
|
-
this.activeCol = 0;
|
|
11
|
-
this.activeRow = 0;
|
|
12
|
-
this.grabbed = false;
|
|
13
|
-
// Deep copy columns to avoid mutating original options during drag/drop
|
|
14
|
-
this.columns = JSON.parse(JSON.stringify(options.columns));
|
|
15
|
-
this.scrollStates = new Array(this.columns.length).fill(0);
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "KanbanPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return KanbanPrompt;
|
|
16
9
|
}
|
|
10
|
+
});
|
|
11
|
+
const _base = require("../base");
|
|
12
|
+
const _ansi = require("../ansi");
|
|
13
|
+
const _utils = require("../utils");
|
|
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 KanbanPrompt = class KanbanPrompt extends _base.Prompt {
|
|
17
28
|
render(_firstRender) {
|
|
18
29
|
const { columns } = this.stdout; // terminal width
|
|
19
30
|
const colCount = this.columns.length;
|
|
20
31
|
const colWidth = Math.floor(columns / colCount);
|
|
21
32
|
let output = '';
|
|
22
33
|
// Render Title
|
|
23
|
-
output += `${
|
|
34
|
+
output += `${_ansi.ANSI.FG_CYAN}${_ansi.ANSI.BOLD}? ${this.options.message}${_ansi.ANSI.RESET}\n`;
|
|
24
35
|
if (this.grabbed) {
|
|
25
|
-
output += `${
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
output += `${ansi_1.ANSI.FG_GRAY}(Normal) Space to Grab, Arrows to Navigate, Enter to Submit${ansi_1.ANSI.RESET}\n`;
|
|
36
|
+
output += `${_ansi.ANSI.FG_YELLOW}(Grabbed) Move with arrows, Space to Drop${_ansi.ANSI.RESET}\n`;
|
|
37
|
+
} else {
|
|
38
|
+
output += `${_ansi.ANSI.FG_GRAY}(Normal) Space to Grab, Arrows to Navigate, Enter to Submit${_ansi.ANSI.RESET}\n`;
|
|
29
39
|
}
|
|
30
40
|
// Render Headers
|
|
31
|
-
const headers = this.columns.map((col, i)
|
|
41
|
+
const headers = this.columns.map((col, i)=>{
|
|
32
42
|
const isSelected = i === this.activeCol;
|
|
33
43
|
const title = this.truncate(col.title, colWidth - 4);
|
|
34
|
-
const style = isSelected ? `${
|
|
44
|
+
const style = isSelected ? `${_ansi.ANSI.FG_BLUE}${_ansi.ANSI.BOLD}` : _ansi.ANSI.BOLD;
|
|
35
45
|
return this.padCenter(title, colWidth, style);
|
|
36
46
|
});
|
|
37
47
|
output += headers.join('') + '\n';
|
|
38
48
|
// Render Separator
|
|
39
|
-
output +=
|
|
49
|
+
output += _ansi.ANSI.FG_GRAY + '─'.repeat(columns) + _ansi.ANSI.RESET + '\n';
|
|
40
50
|
// Render Rows
|
|
41
51
|
const viewportHeight = 10;
|
|
42
|
-
for
|
|
43
|
-
const rowLine = this.columns.map((col, cIndex)
|
|
52
|
+
for(let r = 0; r < viewportHeight; r++){
|
|
53
|
+
const rowLine = this.columns.map((col, cIndex)=>{
|
|
44
54
|
const scrollTop = this.scrollStates[cIndex];
|
|
45
55
|
const itemIndex = r + scrollTop;
|
|
46
56
|
const item = col.items[itemIndex];
|
|
@@ -52,11 +62,10 @@ class KanbanPrompt extends base_1.Prompt {
|
|
|
52
62
|
let style = '';
|
|
53
63
|
if (isCursor) {
|
|
54
64
|
if (this.grabbed) {
|
|
55
|
-
style =
|
|
65
|
+
style = _ansi.ANSI.BG_YELLOW + _ansi.ANSI.FG_BLACK;
|
|
56
66
|
prefix = '>';
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
style = ansi_1.ANSI.FG_CYAN + ansi_1.ANSI.BOLD;
|
|
67
|
+
} else {
|
|
68
|
+
style = _ansi.ANSI.FG_CYAN + _ansi.ANSI.BOLD;
|
|
60
69
|
prefix = '>';
|
|
61
70
|
}
|
|
62
71
|
}
|
|
@@ -65,13 +74,11 @@ class KanbanPrompt extends base_1.Prompt {
|
|
|
65
74
|
content = content.padEnd(colWidth);
|
|
66
75
|
const plain = `${prefix} ${title}${suffix}`.padEnd(colWidth);
|
|
67
76
|
if (style) {
|
|
68
|
-
content = style + plain +
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
77
|
+
content = style + plain + _ansi.ANSI.RESET;
|
|
78
|
+
} else {
|
|
71
79
|
content = plain;
|
|
72
80
|
}
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
81
|
+
} else {
|
|
75
82
|
// Empty slot
|
|
76
83
|
content = ' '.repeat(colWidth);
|
|
77
84
|
}
|
|
@@ -82,12 +89,11 @@ class KanbanPrompt extends base_1.Prompt {
|
|
|
82
89
|
this.renderFrame(output);
|
|
83
90
|
}
|
|
84
91
|
padCenter(str, width, style = '') {
|
|
85
|
-
const visibleLen = (0,
|
|
86
|
-
if (visibleLen >= width)
|
|
87
|
-
return style + str + ansi_1.ANSI.RESET;
|
|
92
|
+
const visibleLen = (0, _utils.stringWidth)(str);
|
|
93
|
+
if (visibleLen >= width) return style + str + _ansi.ANSI.RESET;
|
|
88
94
|
const left = Math.floor((width - visibleLen) / 2);
|
|
89
95
|
const right = width - visibleLen - left;
|
|
90
|
-
return ' '.repeat(left) + style + str +
|
|
96
|
+
return ' '.repeat(left) + style + str + _ansi.ANSI.RESET + ' '.repeat(right);
|
|
91
97
|
}
|
|
92
98
|
handleMouse(event) {
|
|
93
99
|
if (event.action === 'scroll') {
|
|
@@ -101,8 +107,7 @@ class KanbanPrompt extends base_1.Prompt {
|
|
|
101
107
|
this.clampRow();
|
|
102
108
|
this.ensureVisible();
|
|
103
109
|
}
|
|
104
|
-
}
|
|
105
|
-
else if (event.scroll === 'down') {
|
|
110
|
+
} else if (event.scroll === 'down') {
|
|
106
111
|
// Down/Right
|
|
107
112
|
if (this.activeCol < this.columns.length - 1) {
|
|
108
113
|
this.moveItemHorizontal(1);
|
|
@@ -111,16 +116,14 @@ class KanbanPrompt extends base_1.Prompt {
|
|
|
111
116
|
this.ensureVisible();
|
|
112
117
|
}
|
|
113
118
|
}
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
119
|
+
} else {
|
|
116
120
|
// Normal: Scroll moves Up/Down
|
|
117
121
|
if (event.scroll === 'up') {
|
|
118
122
|
if (this.activeRow > 0) {
|
|
119
123
|
this.activeRow--;
|
|
120
124
|
this.ensureVisible();
|
|
121
125
|
}
|
|
122
|
-
}
|
|
123
|
-
else if (event.scroll === 'down') {
|
|
126
|
+
} else if (event.scroll === 'down') {
|
|
124
127
|
const colLen = this.columns[this.activeCol].items.length;
|
|
125
128
|
if (this.activeRow < colLen - 1) {
|
|
126
129
|
this.activeRow++;
|
|
@@ -132,15 +135,15 @@ class KanbanPrompt extends base_1.Prompt {
|
|
|
132
135
|
}
|
|
133
136
|
}
|
|
134
137
|
handleInput(char, _key) {
|
|
135
|
-
if (char === '\r' || char === '\n') {
|
|
138
|
+
if (char === '\r' || char === '\n') {
|
|
136
139
|
const result = {};
|
|
137
|
-
this.columns.forEach(c
|
|
140
|
+
this.columns.forEach((c)=>{
|
|
138
141
|
result[c.id] = c.items;
|
|
139
142
|
});
|
|
140
143
|
this.submit(result);
|
|
141
144
|
return;
|
|
142
145
|
}
|
|
143
|
-
if (char === ' ') {
|
|
146
|
+
if (char === ' ') {
|
|
144
147
|
this.grabbed = !this.grabbed;
|
|
145
148
|
this.render(false);
|
|
146
149
|
return;
|
|
@@ -154,8 +157,7 @@ class KanbanPrompt extends base_1.Prompt {
|
|
|
154
157
|
this.clampRow();
|
|
155
158
|
this.ensureVisible();
|
|
156
159
|
}
|
|
157
|
-
}
|
|
158
|
-
else if (this.isRight(char)) {
|
|
160
|
+
} else if (this.isRight(char)) {
|
|
159
161
|
if (this.activeCol < this.columns.length - 1) {
|
|
160
162
|
if (this.grabbed) {
|
|
161
163
|
this.moveItemHorizontal(1);
|
|
@@ -164,8 +166,7 @@ class KanbanPrompt extends base_1.Prompt {
|
|
|
164
166
|
this.clampRow();
|
|
165
167
|
this.ensureVisible();
|
|
166
168
|
}
|
|
167
|
-
}
|
|
168
|
-
else if (this.isUp(char)) {
|
|
169
|
+
} else if (this.isUp(char)) {
|
|
169
170
|
if (this.activeRow > 0) {
|
|
170
171
|
if (this.grabbed) {
|
|
171
172
|
// Swap with prev
|
|
@@ -177,8 +178,7 @@ class KanbanPrompt extends base_1.Prompt {
|
|
|
177
178
|
this.activeRow--;
|
|
178
179
|
this.ensureVisible();
|
|
179
180
|
}
|
|
180
|
-
}
|
|
181
|
-
else if (this.isDown(char)) {
|
|
181
|
+
} else if (this.isDown(char)) {
|
|
182
182
|
const colLen = this.columns[this.activeCol].items.length;
|
|
183
183
|
if (this.activeRow < colLen - 1) {
|
|
184
184
|
if (this.grabbed) {
|
|
@@ -209,8 +209,7 @@ class KanbanPrompt extends base_1.Prompt {
|
|
|
209
209
|
const len = this.columns[this.activeCol].items.length;
|
|
210
210
|
if (len === 0) {
|
|
211
211
|
this.activeRow = 0;
|
|
212
|
-
}
|
|
213
|
-
else if (this.activeRow >= len) {
|
|
212
|
+
} else if (this.activeRow >= len) {
|
|
214
213
|
this.activeRow = len - 1;
|
|
215
214
|
}
|
|
216
215
|
}
|
|
@@ -219,10 +218,16 @@ class KanbanPrompt extends base_1.Prompt {
|
|
|
219
218
|
const viewportHeight = 10;
|
|
220
219
|
if (this.activeRow < scrollTop) {
|
|
221
220
|
this.scrollStates[this.activeCol] = this.activeRow;
|
|
222
|
-
}
|
|
223
|
-
else if (this.activeRow >= scrollTop + viewportHeight) {
|
|
221
|
+
} else if (this.activeRow >= scrollTop + viewportHeight) {
|
|
224
222
|
this.scrollStates[this.activeCol] = this.activeRow - viewportHeight + 1;
|
|
225
223
|
}
|
|
226
224
|
}
|
|
227
|
-
|
|
228
|
-
|
|
225
|
+
constructor(options){
|
|
226
|
+
super(options), _define_property(this, "columns", void 0), _define_property(this, "activeCol", 0), _define_property(this, "activeRow", 0), _define_property(this, "grabbed", false), _define_property(this, "scrollStates", void 0);
|
|
227
|
+
// Deep copy columns to avoid mutating original options during drag/drop
|
|
228
|
+
this.columns = JSON.parse(JSON.stringify(options.columns));
|
|
229
|
+
this.scrollStates = new Array(this.columns.length).fill(0);
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
//# sourceMappingURL=kanban.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/kanban.ts"],"sourcesContent":["import { Prompt } from '../base';\nimport { KanbanOptions, KanbanItem, KanbanColumn, MouseEvent } from '../types';\nimport { ANSI } from '../ansi';\nimport { stringWidth } from '../utils';\n\nexport class KanbanPrompt<V extends KanbanItem> extends Prompt<Record<string, V[]>, KanbanOptions<V>> {\n private columns: KanbanColumn<V>[];\n private activeCol: number = 0;\n private activeRow: number = 0;\n private grabbed: boolean = false;\n private scrollStates: number[];\n\n constructor(options: KanbanOptions<V>) {\n super(options);\n // Deep copy columns to avoid mutating original options during drag/drop\n this.columns = JSON.parse(JSON.stringify(options.columns));\n this.scrollStates = new Array(this.columns.length).fill(0);\n }\n\n protected render(_firstRender: boolean): void {\n const { columns } = this.stdout; // terminal width\n const colCount = this.columns.length;\n const colWidth = Math.floor(columns / colCount);\n\n let output = '';\n\n // Render Title\n output += `${ANSI.FG_CYAN}${ANSI.BOLD}? ${this.options.message}${ANSI.RESET}\\n`;\n if (this.grabbed) {\n output += `${ANSI.FG_YELLOW}(Grabbed) Move with arrows, Space to Drop${ANSI.RESET}\\n`;\n } else {\n output += `${ANSI.FG_GRAY}(Normal) Space to Grab, Arrows to Navigate, Enter to Submit${ANSI.RESET}\\n`;\n }\n\n // Render Headers\n const headers = this.columns.map((col, i) => {\n const isSelected = i === this.activeCol;\n const title = this.truncate(col.title, colWidth - 4);\n const style = isSelected ? `${ANSI.FG_BLUE}${ANSI.BOLD}` : ANSI.BOLD;\n return this.padCenter(title, colWidth, style);\n });\n output += headers.join('') + '\\n';\n\n // Render Separator\n output += ANSI.FG_GRAY + '─'.repeat(columns) + ANSI.RESET + '\\n';\n\n // Render Rows\n const viewportHeight = 10;\n\n for (let r = 0; r < viewportHeight; r++) {\n const rowLine = this.columns.map((col, cIndex) => {\n const scrollTop = this.scrollStates[cIndex];\n const itemIndex = r + scrollTop;\n const item = col.items[itemIndex];\n\n let content = '';\n if (item) {\n const isCursor = cIndex === this.activeCol && itemIndex === this.activeRow;\n let prefix = ' ';\n const suffix = ' ';\n let style = '';\n\n if (isCursor) {\n if (this.grabbed) {\n style = ANSI.BG_YELLOW + ANSI.FG_BLACK;\n prefix = '>';\n } else {\n style = ANSI.FG_CYAN + ANSI.BOLD;\n prefix = '>';\n }\n }\n\n const title = this.truncate(item.title, colWidth - 4);\n content = `${prefix} ${title}${suffix}`;\n content = content.padEnd(colWidth);\n\n const plain = `${prefix} ${title}${suffix}`.padEnd(colWidth);\n\n if (style) {\n content = style + plain + ANSI.RESET;\n } else {\n content = plain;\n }\n\n } else {\n // Empty slot\n content = ' '.repeat(colWidth);\n }\n return content;\n }).join('');\n\n output += rowLine + '\\n';\n }\n\n this.renderFrame(output);\n }\n\n private padCenter(str: string, width: number, style: string = ''): string {\n const visibleLen = stringWidth(str);\n if (visibleLen >= width) return style + str + ANSI.RESET;\n const left = Math.floor((width - visibleLen) / 2);\n const right = width - visibleLen - left;\n return ' '.repeat(left) + style + str + ANSI.RESET + ' '.repeat(right);\n }\n\n protected handleMouse(event: MouseEvent): void {\n if (event.action === 'scroll') {\n if (this.grabbed) {\n // Grabbed: Scroll moves Left/Right\n if (event.scroll === 'up') {\n // Up/Left\n if (this.activeCol > 0) {\n this.moveItemHorizontal(-1);\n this.activeCol--;\n this.clampRow();\n this.ensureVisible();\n }\n } else if (event.scroll === 'down') {\n // Down/Right\n if (this.activeCol < this.columns.length - 1) {\n this.moveItemHorizontal(1);\n this.activeCol++;\n this.clampRow();\n this.ensureVisible();\n }\n }\n } else {\n // Normal: Scroll moves Up/Down\n if (event.scroll === 'up') {\n if (this.activeRow > 0) {\n this.activeRow--;\n this.ensureVisible();\n }\n } else if (event.scroll === 'down') {\n const colLen = this.columns[this.activeCol].items.length;\n if (this.activeRow < colLen - 1) {\n this.activeRow++;\n this.ensureVisible();\n }\n }\n }\n this.render(false);\n }\n }\n\n protected handleInput(char: string, _key: Buffer): void {\n if (char === '\\r' || char === '\\n') { // Enter\n const result: Record<string, V[]> = {};\n this.columns.forEach(c => {\n result[c.id] = c.items;\n });\n this.submit(result);\n return;\n }\n\n if (char === ' ') { // Space\n this.grabbed = !this.grabbed;\n this.render(false);\n return;\n }\n\n if (this.isLeft(char)) {\n if (this.activeCol > 0) {\n if (this.grabbed) {\n this.moveItemHorizontal(-1);\n }\n this.activeCol--;\n this.clampRow();\n this.ensureVisible();\n }\n } else if (this.isRight(char)) {\n if (this.activeCol < this.columns.length - 1) {\n if (this.grabbed) {\n this.moveItemHorizontal(1);\n }\n this.activeCol++;\n this.clampRow();\n this.ensureVisible();\n }\n } else if (this.isUp(char)) {\n if (this.activeRow > 0) {\n if (this.grabbed) {\n // Swap with prev\n const col = this.columns[this.activeCol];\n const temp = col.items[this.activeRow];\n col.items[this.activeRow] = col.items[this.activeRow - 1];\n col.items[this.activeRow - 1] = temp;\n }\n this.activeRow--;\n this.ensureVisible();\n }\n } else if (this.isDown(char)) {\n const colLen = this.columns[this.activeCol].items.length;\n if (this.activeRow < colLen - 1) {\n if (this.grabbed) {\n // Swap with next\n const col = this.columns[this.activeCol];\n const temp = col.items[this.activeRow];\n col.items[this.activeRow] = col.items[this.activeRow + 1];\n col.items[this.activeRow + 1] = temp;\n }\n this.activeRow++;\n this.ensureVisible();\n }\n }\n\n this.render(false);\n }\n\n private moveItemHorizontal(direction: number) {\n const sourceCol = this.columns[this.activeCol];\n const targetCol = this.columns[this.activeCol + direction];\n const item = sourceCol.items.splice(this.activeRow, 1)[0];\n\n let targetIndex = this.activeRow;\n if (targetIndex > targetCol.items.length) {\n targetIndex = targetCol.items.length;\n }\n\n targetCol.items.splice(targetIndex, 0, item);\n\n this.activeRow = targetIndex;\n }\n\n private clampRow() {\n const len = this.columns[this.activeCol].items.length;\n if (len === 0) {\n this.activeRow = 0;\n } else if (this.activeRow >= len) {\n this.activeRow = len - 1;\n }\n }\n\n private ensureVisible() {\n const scrollTop = this.scrollStates[this.activeCol];\n const viewportHeight = 10;\n\n if (this.activeRow < scrollTop) {\n this.scrollStates[this.activeCol] = this.activeRow;\n } else if (this.activeRow >= scrollTop + viewportHeight) {\n this.scrollStates[this.activeCol] = this.activeRow - viewportHeight + 1;\n }\n }\n}\n"],"names":["KanbanPrompt","Prompt","render","_firstRender","columns","stdout","colCount","length","colWidth","Math","floor","output","ANSI","FG_CYAN","BOLD","options","message","RESET","grabbed","FG_YELLOW","FG_GRAY","headers","map","col","i","isSelected","activeCol","title","truncate","style","FG_BLUE","padCenter","join","repeat","viewportHeight","r","rowLine","cIndex","scrollTop","scrollStates","itemIndex","item","items","content","isCursor","activeRow","prefix","suffix","BG_YELLOW","FG_BLACK","padEnd","plain","renderFrame","str","width","visibleLen","stringWidth","left","right","handleMouse","event","action","scroll","moveItemHorizontal","clampRow","ensureVisible","colLen","handleInput","char","_key","result","forEach","c","id","submit","isLeft","isRight","isUp","temp","isDown","direction","sourceCol","targetCol","splice","targetIndex","len","JSON","parse","stringify","Array","fill"],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "KeypressPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return KeypressPrompt;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _ansi = require("../ansi");
|
|
12
|
+
const _base = require("../base");
|
|
13
|
+
const _theme = require("../theme");
|
|
14
|
+
let KeypressPrompt = class KeypressPrompt extends _base.Prompt {
|
|
15
|
+
render(_firstRender) {
|
|
16
|
+
let output = `${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}`;
|
|
17
|
+
if (this.options.keys) {
|
|
18
|
+
const hint = this.options.keys.map((k)=>{
|
|
19
|
+
if (k === '\r' || k === '\n' || k === 'enter') return 'enter';
|
|
20
|
+
if (k === ' ' || k === 'space') return 'space';
|
|
21
|
+
return k;
|
|
22
|
+
}).join('/');
|
|
23
|
+
output += ` ${_theme.theme.muted}(${hint})${_ansi.ANSI.RESET}`;
|
|
24
|
+
} else {
|
|
25
|
+
output += ` ${_theme.theme.muted}(Press any key)${_ansi.ANSI.RESET}`;
|
|
26
|
+
}
|
|
27
|
+
this.renderFrame(output);
|
|
28
|
+
}
|
|
29
|
+
handleInput(char, _key) {
|
|
30
|
+
let keyName = char;
|
|
31
|
+
if (char === '\r' || char === '\n') keyName = 'enter';
|
|
32
|
+
else if (char === ' ') keyName = 'space';
|
|
33
|
+
else if (char === '\u001b') keyName = 'escape';
|
|
34
|
+
else if (char === '\t') keyName = 'tab';
|
|
35
|
+
else if (char === '\x7f' || char === '\b') keyName = 'backspace';
|
|
36
|
+
// Check against whitelist
|
|
37
|
+
if (this.options.keys) {
|
|
38
|
+
const allowed = this.options.keys.map((k)=>k.toLowerCase());
|
|
39
|
+
// Check normalized name or exact char
|
|
40
|
+
if (!allowed.includes(keyName) && !allowed.includes(char)) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (this.options.showInvisible) {
|
|
45
|
+
this.print(` ${_theme.theme.success}${keyName}${_ansi.ANSI.RESET}`);
|
|
46
|
+
}
|
|
47
|
+
this.submit(keyName);
|
|
48
|
+
}
|
|
49
|
+
constructor(options){
|
|
50
|
+
super(options);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=keypress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/keypress.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { KeypressOptions } from '../types';\n\nexport class KeypressPrompt extends Prompt<string, KeypressOptions> {\n constructor(options: KeypressOptions) {\n super(options);\n }\n\n protected render(_firstRender: boolean) {\n let output = `${theme.title}${this.options.message}${ANSI.RESET}`;\n\n if (this.options.keys) {\n const hint = this.options.keys.map(k => {\n if (k === '\\r' || k === '\\n' || k === 'enter') return 'enter';\n if (k === ' ' || k === 'space') return 'space';\n return k;\n }).join('/');\n output += ` ${theme.muted}(${hint})${ANSI.RESET}`;\n } else {\n output += ` ${theme.muted}(Press any key)${ANSI.RESET}`;\n }\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string, _key: Buffer) {\n let keyName = char;\n if (char === '\\r' || char === '\\n') keyName = 'enter';\n else if (char === ' ') keyName = 'space';\n else if (char === '\\u001b') keyName = 'escape';\n else if (char === '\\t') keyName = 'tab';\n // Handle backspace\n else if (char === '\\x7f' || char === '\\b') keyName = 'backspace';\n\n // Check against whitelist\n if (this.options.keys) {\n const allowed = this.options.keys.map(k => k.toLowerCase());\n // Check normalized name or exact char\n if (!allowed.includes(keyName) && !allowed.includes(char)) {\n return;\n }\n }\n\n if (this.options.showInvisible) {\n this.print(` ${theme.success}${keyName}${ANSI.RESET}`);\n }\n\n this.submit(keyName);\n }\n}\n"],"names":["KeypressPrompt","Prompt","render","_firstRender","output","theme","title","options","message","ANSI","RESET","keys","hint","map","k","join","muted","renderFrame","handleInput","char","_key","keyName","allowed","toLowerCase","includes","showInvisible","print","success","submit"],"mappings":";;;;+BAKaA;;;eAAAA;;;sBALQ;sBACE;uBACD;AAGf,IAAA,AAAMA,iBAAN,MAAMA,uBAAuBC,YAAM;IAK5BC,OAAOC,YAAqB,EAAE;QACpC,IAAIC,SAAS,GAAGC,YAAK,CAACC,KAAK,GAAG,IAAI,CAACC,OAAO,CAACC,OAAO,GAAGC,UAAI,CAACC,KAAK,EAAE;QAEjE,IAAI,IAAI,CAACH,OAAO,CAACI,IAAI,EAAE;YACnB,MAAMC,OAAO,IAAI,CAACL,OAAO,CAACI,IAAI,CAACE,GAAG,CAACC,CAAAA;gBAC/B,IAAIA,MAAM,QAAQA,MAAM,QAAQA,MAAM,SAAS,OAAO;gBACtD,IAAIA,MAAM,OAAOA,MAAM,SAAS,OAAO;gBACvC,OAAOA;YACX,GAAGC,IAAI,CAAC;YACRX,UAAU,CAAC,CAAC,EAAEC,YAAK,CAACW,KAAK,CAAC,CAAC,EAAEJ,KAAK,CAAC,EAAEH,UAAI,CAACC,KAAK,EAAE;QACrD,OAAO;YACHN,UAAU,CAAC,CAAC,EAAEC,YAAK,CAACW,KAAK,CAAC,eAAe,EAAEP,UAAI,CAACC,KAAK,EAAE;QAC3D;QAEA,IAAI,CAACO,WAAW,CAACb;IACrB;IAEUc,YAAYC,IAAY,EAAEC,IAAY,EAAE;QAC9C,IAAIC,UAAUF;QACd,IAAIA,SAAS,QAAQA,SAAS,MAAME,UAAU;aACzC,IAAIF,SAAS,KAAKE,UAAU;aAC5B,IAAIF,SAAS,UAAUE,UAAU;aACjC,IAAIF,SAAS,MAAME,UAAU;aAE7B,IAAIF,SAAS,UAAUA,SAAS,MAAME,UAAU;QAErD,0BAA0B;QAC1B,IAAI,IAAI,CAACd,OAAO,CAACI,IAAI,EAAE;YACnB,MAAMW,UAAU,IAAI,CAACf,OAAO,CAACI,IAAI,CAACE,GAAG,CAACC,CAAAA,IAAKA,EAAES,WAAW;YACxD,sCAAsC;YACtC,IAAI,CAACD,QAAQE,QAAQ,CAACH,YAAY,CAACC,QAAQE,QAAQ,CAACL,OAAO;gBACvD;YACJ;QACJ;QAEA,IAAI,IAAI,CAACZ,OAAO,CAACkB,aAAa,EAAE;YAC5B,IAAI,CAACC,KAAK,CAAC,CAAC,CAAC,EAAErB,YAAK,CAACsB,OAAO,GAAGN,UAAUZ,UAAI,CAACC,KAAK,EAAE;QACzD;QAEA,IAAI,CAACkB,MAAM,CAACP;IAChB;IA5CA,YAAYd,OAAwB,CAAE;QAClC,KAAK,CAACA;IACV;AA2CJ"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "LicensePrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return LicensePrompt;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _ansi = require("../ansi");
|
|
12
|
+
const _select = require("./select");
|
|
13
|
+
const _theme = require("../theme");
|
|
14
|
+
const _symbols = require("../symbols");
|
|
15
|
+
const _utils = require("../utils");
|
|
16
|
+
const _licenses = require("../data/licenses");
|
|
17
|
+
function _define_property(obj, key, value) {
|
|
18
|
+
if (key in obj) {
|
|
19
|
+
Object.defineProperty(obj, key, {
|
|
20
|
+
value: value,
|
|
21
|
+
enumerable: true,
|
|
22
|
+
configurable: true,
|
|
23
|
+
writable: true
|
|
24
|
+
});
|
|
25
|
+
} else {
|
|
26
|
+
obj[key] = value;
|
|
27
|
+
}
|
|
28
|
+
return obj;
|
|
29
|
+
}
|
|
30
|
+
let LicensePrompt = class LicensePrompt extends _select.SelectPrompt {
|
|
31
|
+
render(_firstRender) {
|
|
32
|
+
const choices = this.getFilteredChoices();
|
|
33
|
+
// Adjust Scroll Top
|
|
34
|
+
if (this.selectedIndex < this.scrollTop) {
|
|
35
|
+
this.scrollTop = this.selectedIndex;
|
|
36
|
+
} else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
|
|
37
|
+
this.scrollTop = this.selectedIndex - this.pageSize + 1;
|
|
38
|
+
}
|
|
39
|
+
// Handle Filtering Edge Case: if list shrinks, scrollTop might be too high
|
|
40
|
+
if (this.scrollTop > choices.length - 1) {
|
|
41
|
+
this.scrollTop = Math.max(0, choices.length - this.pageSize);
|
|
42
|
+
}
|
|
43
|
+
const width = this.stdout.columns || 80;
|
|
44
|
+
const gap = 2;
|
|
45
|
+
const ratio = 0.3;
|
|
46
|
+
// Calculate dimensions
|
|
47
|
+
// Left column: 30% or min 20 chars
|
|
48
|
+
// Right column: rest
|
|
49
|
+
const leftWidth = Math.floor((width - gap) * ratio);
|
|
50
|
+
const rightWidth = width - leftWidth - gap;
|
|
51
|
+
const leftContent = this.renderList();
|
|
52
|
+
const rightContent = this.renderDetails(rightWidth);
|
|
53
|
+
const content = _utils.Layout.split(leftContent, rightContent, width, {
|
|
54
|
+
ratio,
|
|
55
|
+
gap
|
|
56
|
+
});
|
|
57
|
+
// Header
|
|
58
|
+
const searchStr = this.searchBuffer ? ` ${_theme.theme.muted}(Filter: ${this.searchBuffer})${_ansi.ANSI.RESET}` : '';
|
|
59
|
+
const header = `${_theme.theme.success}? ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}${searchStr} ${_theme.theme.muted}(Use arrows to navigate, Enter to select)${_ansi.ANSI.RESET}`;
|
|
60
|
+
// Combine
|
|
61
|
+
this.renderFrame(`${header}\n${content}`);
|
|
62
|
+
}
|
|
63
|
+
renderList() {
|
|
64
|
+
const choices = this.getFilteredChoices();
|
|
65
|
+
let output = '';
|
|
66
|
+
if (choices.length === 0) {
|
|
67
|
+
output += ` ${_theme.theme.muted}No results found${_ansi.ANSI.RESET}`;
|
|
68
|
+
return output + '\n'.repeat(this.pageSize - 1);
|
|
69
|
+
}
|
|
70
|
+
const visibleChoices = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);
|
|
71
|
+
visibleChoices.forEach((choice, index)=>{
|
|
72
|
+
const actualIndex = this.scrollTop + index;
|
|
73
|
+
const isSelected = actualIndex === this.selectedIndex;
|
|
74
|
+
const cursor = isSelected ? `${_theme.theme.main}${_symbols.symbols.pointer}` : ' ';
|
|
75
|
+
// Handle Separator type safety
|
|
76
|
+
if ('separator' in choice) {
|
|
77
|
+
output += `${_theme.theme.muted}${choice.text || '---'}${_ansi.ANSI.RESET}\n`;
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const title = isSelected ? `${_theme.theme.main}${choice.title}${_ansi.ANSI.RESET}` : choice.title;
|
|
81
|
+
output += `${cursor} ${title}\n`;
|
|
82
|
+
});
|
|
83
|
+
// Fill remaining lines to maintain height
|
|
84
|
+
const filledLines = visibleChoices.length;
|
|
85
|
+
if (filledLines < this.pageSize) {
|
|
86
|
+
output += '\n'.repeat(this.pageSize - filledLines);
|
|
87
|
+
}
|
|
88
|
+
return output;
|
|
89
|
+
}
|
|
90
|
+
renderDetails(maxWidth) {
|
|
91
|
+
const choices = this.getFilteredChoices();
|
|
92
|
+
if (choices.length === 0) return '';
|
|
93
|
+
const selectedChoice = choices[this.selectedIndex];
|
|
94
|
+
if (!selectedChoice || 'separator' in selectedChoice) return '';
|
|
95
|
+
const license = this.licenses.find((l)=>l.id === selectedChoice.value);
|
|
96
|
+
if (!license) return '';
|
|
97
|
+
let output = '';
|
|
98
|
+
output += `${_ansi.ANSI.BOLD}${license.name}${_ansi.ANSI.RESET}\n`;
|
|
99
|
+
const wrappedDesc = _utils.Layout.wrap(license.description, maxWidth);
|
|
100
|
+
const coloredDesc = wrappedDesc.split('\n').map((line)=>`${_theme.theme.muted}${line}${_ansi.ANSI.RESET}`).join('\n');
|
|
101
|
+
output += `${coloredDesc}\n\n`;
|
|
102
|
+
// Permissions
|
|
103
|
+
if (license.permissions.length > 0) {
|
|
104
|
+
output += `${_ansi.ANSI.FG_GREEN}Permissions:${_ansi.ANSI.RESET}\n`;
|
|
105
|
+
license.permissions.forEach((p)=>output += ` ${_theme.theme.success}${_symbols.symbols.checked} ${p}${_ansi.ANSI.RESET}\n`);
|
|
106
|
+
output += '\n';
|
|
107
|
+
}
|
|
108
|
+
// Conditions
|
|
109
|
+
if (license.conditions.length > 0) {
|
|
110
|
+
output += `${_ansi.ANSI.FG_BLUE}Conditions:${_ansi.ANSI.RESET}\n`;
|
|
111
|
+
// symbols.info doesn't exist, use 'i' or similar
|
|
112
|
+
license.conditions.forEach((c)=>output += ` ${_ansi.ANSI.FG_BLUE}ℹ ${c}${_ansi.ANSI.RESET}\n`);
|
|
113
|
+
output += '\n';
|
|
114
|
+
}
|
|
115
|
+
// Limitations
|
|
116
|
+
if (license.limitations.length > 0) {
|
|
117
|
+
output += `${_ansi.ANSI.FG_RED}Limitations:${_ansi.ANSI.RESET}\n`;
|
|
118
|
+
license.limitations.forEach((l)=>output += ` ${_theme.theme.error}${_symbols.symbols.cross} ${l}${_ansi.ANSI.RESET}\n`);
|
|
119
|
+
}
|
|
120
|
+
return output;
|
|
121
|
+
}
|
|
122
|
+
constructor(options){
|
|
123
|
+
// Map licenses to choices expected by SelectPrompt
|
|
124
|
+
const choices = _licenses.POPULAR_LICENSES.map((l)=>({
|
|
125
|
+
title: l.id,
|
|
126
|
+
value: l.id,
|
|
127
|
+
description: l.name
|
|
128
|
+
}));
|
|
129
|
+
super({
|
|
130
|
+
...options,
|
|
131
|
+
choices
|
|
132
|
+
}), _define_property(this, "licenses", void 0);
|
|
133
|
+
this.licenses = _licenses.POPULAR_LICENSES;
|
|
134
|
+
// Set initial selection if provided
|
|
135
|
+
if (options.defaultLicense) {
|
|
136
|
+
const idx = this.licenses.findIndex((l)=>l.id === options.defaultLicense);
|
|
137
|
+
if (idx !== -1) {
|
|
138
|
+
this.selectedIndex = idx;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
//# sourceMappingURL=license.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/license.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { SelectPrompt } from './select';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { LicenseOptions, License } from '../types';\nimport { Layout } from '../utils';\nimport { POPULAR_LICENSES } from '../data/licenses';\n\nexport class LicensePrompt extends SelectPrompt<string> {\n private licenses: License[];\n\n constructor(options: LicenseOptions) {\n // Map licenses to choices expected by SelectPrompt\n const choices = POPULAR_LICENSES.map(l => ({\n title: l.id,\n value: l.id,\n description: l.name\n }));\n\n super({\n ...options,\n choices\n });\n\n this.licenses = POPULAR_LICENSES;\n\n // Set initial selection if provided\n if (options.defaultLicense) {\n const idx = this.licenses.findIndex(l => l.id === options.defaultLicense);\n if (idx !== -1) {\n (this as any).selectedIndex = idx;\n }\n }\n }\n\n protected render(_firstRender: boolean) {\n const choices = this.getFilteredChoices();\n\n // Adjust Scroll Top\n if (this.selectedIndex < this.scrollTop) {\n this.scrollTop = this.selectedIndex;\n } else if (this.selectedIndex >= this.scrollTop + this.pageSize) {\n this.scrollTop = this.selectedIndex - this.pageSize + 1;\n }\n // Handle Filtering Edge Case: if list shrinks, scrollTop might be too high\n if (this.scrollTop > choices.length - 1) {\n this.scrollTop = Math.max(0, choices.length - this.pageSize);\n }\n\n const width = this.stdout.columns || 80;\n const gap = 2;\n const ratio = 0.3;\n\n // Calculate dimensions\n // Left column: 30% or min 20 chars\n // Right column: rest\n const leftWidth = Math.floor((width - gap) * ratio);\n const rightWidth = width - leftWidth - gap;\n\n const leftContent = this.renderList();\n const rightContent = this.renderDetails(rightWidth);\n\n const content = Layout.split(leftContent, rightContent, width, { ratio, gap });\n\n // Header\n const searchStr = this.searchBuffer ? ` ${theme.muted}(Filter: ${this.searchBuffer})${ANSI.RESET}` : '';\n const header = `${theme.success}? ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}${searchStr} ${theme.muted}(Use arrows to navigate, Enter to select)${ANSI.RESET}`;\n\n // Combine\n this.renderFrame(`${header}\\n${content}`);\n }\n\n private renderList(): string {\n const choices = this.getFilteredChoices();\n let output = '';\n\n if (choices.length === 0) {\n output += ` ${theme.muted}No results found${ANSI.RESET}`;\n return output + '\\n'.repeat(this.pageSize - 1);\n }\n\n const visibleChoices = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);\n\n visibleChoices.forEach((choice, index) => {\n const actualIndex = this.scrollTop + index;\n const isSelected = actualIndex === this.selectedIndex;\n\n const cursor = isSelected ? `${theme.main}${symbols.pointer}` : ' ';\n\n // Handle Separator type safety\n if ('separator' in choice) {\n output += `${theme.muted}${choice.text || '---'}${ANSI.RESET}\\n`;\n return;\n }\n\n const title = isSelected ? `${theme.main}${choice.title}${ANSI.RESET}` : choice.title;\n\n output += `${cursor} ${title}\\n`;\n });\n\n // Fill remaining lines to maintain height\n const filledLines = visibleChoices.length;\n if (filledLines < this.pageSize) {\n output += '\\n'.repeat(this.pageSize - filledLines);\n }\n\n return output;\n }\n\n private renderDetails(maxWidth: number): string {\n const choices = this.getFilteredChoices();\n if (choices.length === 0) return '';\n\n const selectedChoice = choices[this.selectedIndex];\n if (!selectedChoice || 'separator' in selectedChoice) return '';\n\n const license = this.licenses.find(l => l.id === selectedChoice.value);\n\n if (!license) return '';\n\n let output = '';\n output += `${ANSI.BOLD}${license.name}${ANSI.RESET}\\n`;\n\n const wrappedDesc = Layout.wrap(license.description, maxWidth);\n const coloredDesc = wrappedDesc.split('\\n').map(line => `${theme.muted}${line}${ANSI.RESET}`).join('\\n');\n\n output += `${coloredDesc}\\n\\n`;\n\n // Permissions\n if (license.permissions.length > 0) {\n output += `${ANSI.FG_GREEN}Permissions:${ANSI.RESET}\\n`;\n license.permissions.forEach(p => output += ` ${theme.success}${symbols.checked} ${p}${ANSI.RESET}\\n`);\n output += '\\n';\n }\n\n // Conditions\n if (license.conditions.length > 0) {\n output += `${ANSI.FG_BLUE}Conditions:${ANSI.RESET}\\n`;\n // symbols.info doesn't exist, use 'i' or similar\n license.conditions.forEach(c => output += ` ${ANSI.FG_BLUE}ℹ ${c}${ANSI.RESET}\\n`);\n output += '\\n';\n }\n\n // Limitations\n if (license.limitations.length > 0) {\n output += `${ANSI.FG_RED}Limitations:${ANSI.RESET}\\n`;\n license.limitations.forEach(l => output += ` ${theme.error}${symbols.cross} ${l}${ANSI.RESET}\\n`);\n }\n\n return output;\n }\n}\n"],"names":["LicensePrompt","SelectPrompt","render","_firstRender","choices","getFilteredChoices","selectedIndex","scrollTop","pageSize","length","Math","max","width","stdout","columns","gap","ratio","leftWidth","floor","rightWidth","leftContent","renderList","rightContent","renderDetails","content","Layout","split","searchStr","searchBuffer","theme","muted","ANSI","RESET","header","success","BOLD","title","options","message","renderFrame","output","repeat","visibleChoices","slice","forEach","choice","index","actualIndex","isSelected","cursor","main","symbols","pointer","text","filledLines","maxWidth","selectedChoice","license","licenses","find","l","id","value","name","wrappedDesc","wrap","description","coloredDesc","map","line","join","permissions","FG_GREEN","p","checked","conditions","FG_BLUE","c","limitations","FG_RED","error","cross","POPULAR_LICENSES","defaultLicense","idx","findIndex"],"mappings":"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"}
|
|
@@ -1,41 +1,53 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "ListPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return ListPrompt;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _ansi = require("../ansi");
|
|
12
|
+
const _base = require("../base");
|
|
13
|
+
const _theme = require("../theme");
|
|
14
|
+
const _symbols = require("../symbols");
|
|
15
|
+
function _define_property(obj, key, value) {
|
|
16
|
+
if (key in obj) {
|
|
17
|
+
Object.defineProperty(obj, key, {
|
|
18
|
+
value: value,
|
|
19
|
+
enumerable: true,
|
|
20
|
+
configurable: true,
|
|
21
|
+
writable: true
|
|
22
|
+
});
|
|
23
|
+
} else {
|
|
24
|
+
obj[key] = value;
|
|
15
25
|
}
|
|
26
|
+
return obj;
|
|
27
|
+
}
|
|
28
|
+
let ListPrompt = class ListPrompt extends _base.Prompt {
|
|
16
29
|
render(_firstRender) {
|
|
17
30
|
const cols = process.stdout.columns || 80;
|
|
18
31
|
// 1. Prepare Prefix
|
|
19
|
-
const icon = this.errorMsg ? `${
|
|
20
|
-
const prefix = `${icon} ${
|
|
32
|
+
const icon = this.errorMsg ? `${_theme.theme.error}${_symbols.symbols.cross}` : `${_theme.theme.success}?`;
|
|
33
|
+
const prefix = `${icon} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} `;
|
|
21
34
|
// 2. Build Lines with Wrapping
|
|
22
35
|
const lines = [];
|
|
23
36
|
let currentLine = prefix;
|
|
24
37
|
// Helper to check width
|
|
25
|
-
const addText = (text)
|
|
38
|
+
const addText = (text)=>{
|
|
26
39
|
const visualLen = this.stripAnsi(currentLine).length + this.stripAnsi(text).length;
|
|
27
40
|
if (visualLen > cols) {
|
|
28
41
|
lines.push(currentLine);
|
|
29
42
|
currentLine = text.trimStart(); // Start new line
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
43
|
+
} else {
|
|
32
44
|
currentLine += text;
|
|
33
45
|
}
|
|
34
46
|
};
|
|
35
47
|
// Render Tags
|
|
36
48
|
if (this.value.length > 0) {
|
|
37
|
-
this.value.forEach((tag)
|
|
38
|
-
const tagStr = `${
|
|
49
|
+
this.value.forEach((tag)=>{
|
|
50
|
+
const tagStr = `${_theme.theme.main}[${tag}]${_ansi.ANSI.RESET} `;
|
|
39
51
|
addText(tagStr);
|
|
40
52
|
});
|
|
41
53
|
}
|
|
@@ -47,21 +59,21 @@ class ListPrompt extends base_1.Prompt {
|
|
|
47
59
|
const inputVisualCol = this.stripAnsi(currentLine).length;
|
|
48
60
|
// 3. Append Error if any
|
|
49
61
|
if (this.errorMsg) {
|
|
50
|
-
lines.push(`${
|
|
62
|
+
lines.push(`${_theme.theme.error}>> ${this.errorMsg}${_ansi.ANSI.RESET}`);
|
|
51
63
|
}
|
|
52
64
|
const output = lines.join('\n');
|
|
53
65
|
// 4. Render Frame
|
|
54
66
|
this.renderFrame(output);
|
|
55
|
-
this.print(
|
|
67
|
+
this.print(_ansi.ANSI.SHOW_CURSOR);
|
|
56
68
|
// 5. Position Cursor
|
|
57
69
|
// If we printed lines after the input line (e.g. error msg), move up.
|
|
58
70
|
const totalRows = lines.length;
|
|
59
|
-
const linesUp =
|
|
71
|
+
const linesUp = totalRows - 1 - inputLineIndex;
|
|
60
72
|
if (linesUp > 0) {
|
|
61
73
|
this.print(`\x1b[${linesUp}A`);
|
|
62
74
|
}
|
|
63
75
|
// Move to correct column
|
|
64
|
-
this.print(
|
|
76
|
+
this.print(_ansi.ANSI.CURSOR_LEFT);
|
|
65
77
|
if (inputVisualCol > 0) {
|
|
66
78
|
this.print(`\x1b[${inputVisualCol}C`);
|
|
67
79
|
}
|
|
@@ -73,8 +85,7 @@ class ListPrompt extends base_1.Prompt {
|
|
|
73
85
|
this.currentInput = '';
|
|
74
86
|
this.errorMsg = '';
|
|
75
87
|
this.render(false);
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
88
|
+
} else {
|
|
78
89
|
// Done if input is empty
|
|
79
90
|
if (this.options.validate) {
|
|
80
91
|
const result = this.options.validate(this.value);
|
|
@@ -88,12 +99,11 @@ class ListPrompt extends base_1.Prompt {
|
|
|
88
99
|
}
|
|
89
100
|
return;
|
|
90
101
|
}
|
|
91
|
-
if (char === '\u0008' || char === '\x7f') {
|
|
102
|
+
if (char === '\u0008' || char === '\x7f') {
|
|
92
103
|
if (this.currentInput.length > 0) {
|
|
93
104
|
this.currentInput = this.currentInput.slice(0, -1);
|
|
94
105
|
this.render(false);
|
|
95
|
-
}
|
|
96
|
-
else if (this.value.length > 0) {
|
|
106
|
+
} else if (this.value.length > 0) {
|
|
97
107
|
const last = this.value.pop();
|
|
98
108
|
this.currentInput = last || '';
|
|
99
109
|
this.render(false);
|
|
@@ -105,5 +115,10 @@ class ListPrompt extends base_1.Prompt {
|
|
|
105
115
|
this.render(false);
|
|
106
116
|
}
|
|
107
117
|
}
|
|
108
|
-
|
|
109
|
-
|
|
118
|
+
constructor(options){
|
|
119
|
+
super(options), _define_property(this, "currentInput", ''), _define_property(this, "errorMsg", '');
|
|
120
|
+
this.value = options.initial || [];
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
//# sourceMappingURL=list.js.map
|