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,30 +1,40 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "MatchPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return MatchPrompt;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _ansi = require("../ansi");
|
|
12
|
+
const _base = require("../base");
|
|
13
|
+
const _theme = require("../theme");
|
|
14
|
+
const _symbols = require("../symbols");
|
|
15
|
+
const _utils = require("../utils");
|
|
16
|
+
function _define_property(obj, key, value) {
|
|
17
|
+
if (key in obj) {
|
|
18
|
+
Object.defineProperty(obj, key, {
|
|
19
|
+
value: value,
|
|
20
|
+
enumerable: true,
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: true
|
|
23
|
+
});
|
|
24
|
+
} else {
|
|
25
|
+
obj[key] = value;
|
|
23
26
|
}
|
|
27
|
+
return obj;
|
|
28
|
+
}
|
|
29
|
+
let MatchPrompt = class MatchPrompt extends _base.Prompt {
|
|
24
30
|
normalize(items) {
|
|
25
|
-
return items.map(item
|
|
31
|
+
return items.map((item)=>{
|
|
26
32
|
if (typeof item === 'string') {
|
|
27
|
-
return {
|
|
33
|
+
return {
|
|
34
|
+
id: item,
|
|
35
|
+
label: item,
|
|
36
|
+
value: item
|
|
37
|
+
};
|
|
28
38
|
}
|
|
29
39
|
return item;
|
|
30
40
|
});
|
|
@@ -34,25 +44,20 @@ class MatchPrompt extends base_1.Prompt {
|
|
|
34
44
|
const colWidth = Math.floor((termWidth - 8) / 2); // -8 for middle spacing and borders
|
|
35
45
|
// Adjust Scroll Top
|
|
36
46
|
if (this.activeSide === 'source') {
|
|
37
|
-
if (this.cursorSource < this.scrollTopSource)
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
else {
|
|
43
|
-
if (this.cursorTarget < this.scrollTopTarget)
|
|
44
|
-
this.scrollTopTarget = this.cursorTarget;
|
|
45
|
-
if (this.cursorTarget >= this.scrollTopTarget + this.pageSize)
|
|
46
|
-
this.scrollTopTarget = this.cursorTarget - this.pageSize + 1;
|
|
47
|
+
if (this.cursorSource < this.scrollTopSource) this.scrollTopSource = this.cursorSource;
|
|
48
|
+
if (this.cursorSource >= this.scrollTopSource + this.pageSize) this.scrollTopSource = this.cursorSource - this.pageSize + 1;
|
|
49
|
+
} else {
|
|
50
|
+
if (this.cursorTarget < this.scrollTopTarget) this.scrollTopTarget = this.cursorTarget;
|
|
51
|
+
if (this.cursorTarget >= this.scrollTopTarget + this.pageSize) this.scrollTopTarget = this.cursorTarget - this.pageSize + 1;
|
|
47
52
|
}
|
|
48
|
-
let output = `${
|
|
53
|
+
let output = `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}\n`;
|
|
49
54
|
// Headers
|
|
50
|
-
const sourceTitle = this.activeSide === 'source' ? `${
|
|
51
|
-
const targetTitle = this.activeSide === 'target' ? `${
|
|
55
|
+
const sourceTitle = this.activeSide === 'source' ? `${_theme.theme.main}Source${_ansi.ANSI.RESET}` : 'Source';
|
|
56
|
+
const targetTitle = this.activeSide === 'target' ? `${_theme.theme.main}Target${_ansi.ANSI.RESET}` : 'Target';
|
|
52
57
|
output += ` ${sourceTitle}`.padEnd(colWidth + 2) + ' ' + ` ${targetTitle}\n`;
|
|
53
|
-
output += ` ${
|
|
58
|
+
output += ` ${_ansi.ANSI.DIM}${_symbols.symbols.line.repeat(colWidth)}${_ansi.ANSI.RESET} ${_ansi.ANSI.DIM}${_symbols.symbols.line.repeat(colWidth)}${_ansi.ANSI.RESET}\n`;
|
|
54
59
|
// Render Rows
|
|
55
|
-
for
|
|
60
|
+
for(let i = 0; i < this.pageSize; i++){
|
|
56
61
|
const idxSource = this.scrollTopSource + i;
|
|
57
62
|
const idxTarget = this.scrollTopTarget + i;
|
|
58
63
|
const itemSource = this.source[idxSource];
|
|
@@ -64,30 +69,25 @@ class MatchPrompt extends base_1.Prompt {
|
|
|
64
69
|
const isPicked = this.pickedSourceIndex === idxSource;
|
|
65
70
|
const hasLinks = this.links.has(itemSource.id) && this.links.get(itemSource.id).size > 0;
|
|
66
71
|
let prefix = ' ';
|
|
67
|
-
if (isSelected)
|
|
68
|
-
|
|
69
|
-
if (isPicked)
|
|
70
|
-
prefix = `${theme_1.theme.success}${symbols_1.symbols.pointer} `;
|
|
72
|
+
if (isSelected) prefix = `${_theme.theme.main}${_symbols.symbols.pointer} `;
|
|
73
|
+
if (isPicked) prefix = `${_theme.theme.success}${_symbols.symbols.pointer} `;
|
|
71
74
|
let title = this.truncate(itemSource.label, colWidth - 4);
|
|
72
75
|
// Color logic
|
|
73
76
|
if (isPicked) {
|
|
74
|
-
title = `${
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
else if (isSelected) {
|
|
80
|
-
title = `${ansi_1.ANSI.FG_CYAN}${title}${ansi_1.ANSI.RESET}`;
|
|
77
|
+
title = `${_theme.theme.success}${title}${_ansi.ANSI.RESET}`;
|
|
78
|
+
} else if (hasLinks) {
|
|
79
|
+
title = `${_theme.theme.success}${title}${_ansi.ANSI.RESET}`;
|
|
80
|
+
} else if (isSelected) {
|
|
81
|
+
title = `${_ansi.ANSI.FG_CYAN}${title}${_ansi.ANSI.RESET}`;
|
|
81
82
|
}
|
|
82
83
|
// Indicator for links
|
|
83
|
-
const linkIndicator = hasLinks ? `${
|
|
84
|
+
const linkIndicator = hasLinks ? `${_theme.theme.success}*${_ansi.ANSI.RESET}` : ' ';
|
|
84
85
|
sourceStr = `${prefix}${title} ${linkIndicator}`;
|
|
85
86
|
// Highlight connected targets?
|
|
86
87
|
if (isSelected || isPicked) {
|
|
87
|
-
|
|
88
|
+
// This is handled in Target render
|
|
88
89
|
}
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
90
|
+
} else {
|
|
91
91
|
sourceStr = '';
|
|
92
92
|
}
|
|
93
93
|
// Target Column
|
|
@@ -101,7 +101,7 @@ class MatchPrompt extends base_1.Prompt {
|
|
|
101
101
|
let isLinkedToRelevant = false;
|
|
102
102
|
let isLinkedToAny = false;
|
|
103
103
|
// Check links
|
|
104
|
-
for (const [sId, tIds] of Array.from(this.links.entries()))
|
|
104
|
+
for (const [sId, tIds] of Array.from(this.links.entries())){
|
|
105
105
|
if (tIds.has(itemTarget.id)) {
|
|
106
106
|
isLinkedToAny = true;
|
|
107
107
|
if (relevantSource && sId === relevantSource.id) {
|
|
@@ -110,35 +110,31 @@ class MatchPrompt extends base_1.Prompt {
|
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
112
|
let prefix = ' ';
|
|
113
|
-
if (isSelected)
|
|
114
|
-
prefix = `${theme_1.theme.main}${symbols_1.symbols.pointer} `;
|
|
113
|
+
if (isSelected) prefix = `${_theme.theme.main}${_symbols.symbols.pointer} `;
|
|
115
114
|
let title = this.truncate(itemTarget.label, colWidth - 4);
|
|
116
115
|
if (isLinkedToRelevant) {
|
|
117
|
-
title = `${
|
|
118
|
-
}
|
|
119
|
-
else if (isLinkedToAny) {
|
|
116
|
+
title = `${_theme.theme.success}${title}${_ansi.ANSI.RESET}`;
|
|
117
|
+
} else if (isLinkedToAny) {
|
|
120
118
|
// Linked to someone else
|
|
121
|
-
title = `${
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
title = `${ansi_1.ANSI.FG_CYAN}${title}${ansi_1.ANSI.RESET}`;
|
|
119
|
+
title = `${_ansi.ANSI.DIM}${title}${_ansi.ANSI.RESET}`;
|
|
120
|
+
} else if (isSelected) {
|
|
121
|
+
title = `${_ansi.ANSI.FG_CYAN}${title}${_ansi.ANSI.RESET}`;
|
|
125
122
|
}
|
|
126
123
|
// Indicator
|
|
127
|
-
const linkIndicator = isLinkedToRelevant ? `${
|
|
124
|
+
const linkIndicator = isLinkedToRelevant ? `${_theme.theme.success}<=${_ansi.ANSI.RESET}` : isLinkedToAny ? `${_ansi.ANSI.DIM}<=${_ansi.ANSI.RESET}` : ' ';
|
|
128
125
|
targetStr = `${linkIndicator} ${prefix}${title}`;
|
|
129
126
|
}
|
|
130
127
|
// Pad Source
|
|
131
|
-
const sourceVisualLen = itemSource ? (
|
|
128
|
+
const sourceVisualLen = itemSource ? (0, _utils.stringWidth)(this.stripAnsi(sourceStr)) : 0;
|
|
132
129
|
const padding = ' '.repeat(Math.max(0, colWidth - sourceVisualLen + 2)); // +2 extra space
|
|
133
130
|
output += sourceStr + padding + ' ' + targetStr + '\n';
|
|
134
131
|
}
|
|
135
132
|
// Instructions
|
|
136
133
|
if (this.pickedSourceIndex !== null) {
|
|
137
|
-
output += `\n${
|
|
138
|
-
output += `\n${
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
output += `\n${ansi_1.ANSI.DIM}Space to Pick Source, Enter to Submit.${ansi_1.ANSI.RESET}`;
|
|
134
|
+
output += `\n${_theme.theme.success}Linking: ${this.source[this.pickedSourceIndex].label}${_ansi.ANSI.RESET}`;
|
|
135
|
+
output += `\n${_ansi.ANSI.DIM}Select Target to Link/Unlink. Esc to Cancel.${_ansi.ANSI.RESET}`;
|
|
136
|
+
} else {
|
|
137
|
+
output += `\n${_ansi.ANSI.DIM}Space to Pick Source, Enter to Submit.${_ansi.ANSI.RESET}`;
|
|
142
138
|
}
|
|
143
139
|
this.renderFrame(output);
|
|
144
140
|
}
|
|
@@ -147,8 +143,7 @@ class MatchPrompt extends base_1.Prompt {
|
|
|
147
143
|
if (this.isUp(char)) {
|
|
148
144
|
if (this.activeSide === 'source') {
|
|
149
145
|
this.cursorSource = Math.max(0, this.cursorSource - 1);
|
|
150
|
-
}
|
|
151
|
-
else {
|
|
146
|
+
} else {
|
|
152
147
|
this.cursorTarget = Math.max(0, this.cursorTarget - 1);
|
|
153
148
|
}
|
|
154
149
|
this.render(false);
|
|
@@ -157,8 +152,7 @@ class MatchPrompt extends base_1.Prompt {
|
|
|
157
152
|
if (this.isDown(char)) {
|
|
158
153
|
if (this.activeSide === 'source') {
|
|
159
154
|
this.cursorSource = Math.min(this.source.length - 1, this.cursorSource + 1);
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
155
|
+
} else {
|
|
162
156
|
this.cursorTarget = Math.min(this.target.length - 1, this.cursorTarget + 1);
|
|
163
157
|
}
|
|
164
158
|
this.render(false);
|
|
@@ -170,10 +164,9 @@ class MatchPrompt extends base_1.Prompt {
|
|
|
170
164
|
// Pick Source
|
|
171
165
|
this.pickedSourceIndex = this.cursorSource;
|
|
172
166
|
this.activeSide = 'target';
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
167
|
+
// Try to find first linked target or stay at top?
|
|
168
|
+
// Stay at top or current pos is fine.
|
|
169
|
+
} else {
|
|
177
170
|
// Toggle Link
|
|
178
171
|
if (this.pickedSourceIndex !== null) {
|
|
179
172
|
const sId = this.source[this.pickedSourceIndex].id;
|
|
@@ -185,11 +178,10 @@ class MatchPrompt extends base_1.Prompt {
|
|
|
185
178
|
if (sourceLinks.has(tId)) {
|
|
186
179
|
// Unlink
|
|
187
180
|
sourceLinks.delete(tId);
|
|
188
|
-
}
|
|
189
|
-
else {
|
|
181
|
+
} else {
|
|
190
182
|
// Link
|
|
191
183
|
if (this.options.constraints?.oneToMany === false) {
|
|
192
|
-
for (const [otherSId, tIds] of Array.from(this.links.entries()))
|
|
184
|
+
for (const [otherSId, tIds] of Array.from(this.links.entries())){
|
|
193
185
|
if (otherSId !== sId && tIds.has(tId)) {
|
|
194
186
|
tIds.delete(tId);
|
|
195
187
|
}
|
|
@@ -197,7 +189,7 @@ class MatchPrompt extends base_1.Prompt {
|
|
|
197
189
|
}
|
|
198
190
|
sourceLinks.add(tId);
|
|
199
191
|
}
|
|
200
|
-
|
|
192
|
+
// Stay in Target side to allow picking more?
|
|
201
193
|
}
|
|
202
194
|
}
|
|
203
195
|
this.render(false);
|
|
@@ -208,7 +200,7 @@ class MatchPrompt extends base_1.Prompt {
|
|
|
208
200
|
// Check Required Constraint
|
|
209
201
|
if (this.options.constraints?.required) {
|
|
210
202
|
// Check if all sources have at least one link
|
|
211
|
-
const allLinked = this.source.every(s
|
|
203
|
+
const allLinked = this.source.every((s)=>{
|
|
212
204
|
return this.links.has(s.id) && this.links.get(s.id).size > 0;
|
|
213
205
|
});
|
|
214
206
|
if (!allLinked) {
|
|
@@ -217,11 +209,11 @@ class MatchPrompt extends base_1.Prompt {
|
|
|
217
209
|
}
|
|
218
210
|
// Submit Result: Record<SourceID, TargetValue[]>
|
|
219
211
|
const result = {};
|
|
220
|
-
for (const [sId, tIds] of Array.from(this.links.entries()))
|
|
212
|
+
for (const [sId, tIds] of Array.from(this.links.entries())){
|
|
221
213
|
if (tIds.size > 0) {
|
|
222
214
|
// Map Target IDs back to Values
|
|
223
|
-
const values = Array.from(tIds).map(tid
|
|
224
|
-
return this.target.find(t
|
|
215
|
+
const values = Array.from(tIds).map((tid)=>{
|
|
216
|
+
return this.target.find((t)=>t.id === tid)?.value;
|
|
225
217
|
});
|
|
226
218
|
result[sId] = values;
|
|
227
219
|
}
|
|
@@ -230,7 +222,7 @@ class MatchPrompt extends base_1.Prompt {
|
|
|
230
222
|
return;
|
|
231
223
|
}
|
|
232
224
|
// Escape / Backspace to go back to Source
|
|
233
|
-
if (char === '\u001b' || char === '\u0008' || char === '\x7f' || char === 'h') {
|
|
225
|
+
if (char === '\u001b' || char === '\u0008' || char === '\x7f' || char === 'h') {
|
|
234
226
|
if (this.activeSide === 'target') {
|
|
235
227
|
this.activeSide = 'source';
|
|
236
228
|
this.pickedSourceIndex = null;
|
|
@@ -255,21 +247,25 @@ class MatchPrompt extends base_1.Prompt {
|
|
|
255
247
|
if (event.scroll === 'up') {
|
|
256
248
|
if (this.activeSide === 'source') {
|
|
257
249
|
this.cursorSource = Math.max(0, this.cursorSource - 1);
|
|
258
|
-
}
|
|
259
|
-
else {
|
|
250
|
+
} else {
|
|
260
251
|
this.cursorTarget = Math.max(0, this.cursorTarget - 1);
|
|
261
252
|
}
|
|
262
|
-
}
|
|
263
|
-
else {
|
|
253
|
+
} else {
|
|
264
254
|
if (this.activeSide === 'source') {
|
|
265
255
|
this.cursorSource = Math.min(this.source.length - 1, this.cursorSource + 1);
|
|
266
|
-
}
|
|
267
|
-
else {
|
|
256
|
+
} else {
|
|
268
257
|
this.cursorTarget = Math.min(this.target.length - 1, this.cursorTarget + 1);
|
|
269
258
|
}
|
|
270
259
|
}
|
|
271
260
|
this.render(false);
|
|
272
261
|
}
|
|
273
262
|
}
|
|
274
|
-
|
|
275
|
-
|
|
263
|
+
constructor(options){
|
|
264
|
+
super(options), _define_property(this, "source", void 0), _define_property(this, "target", void 0), // Links: Source ID -> Set of Target IDs
|
|
265
|
+
_define_property(this, "links", new Map()), _define_property(this, "cursorSource", 0), _define_property(this, "cursorTarget", 0), _define_property(this, "scrollTopSource", 0), _define_property(this, "scrollTopTarget", 0), _define_property(this, "activeSide", 'source'), _define_property(this, "pickedSourceIndex", null), _define_property(this, "pageSize", 10);
|
|
266
|
+
this.source = this.normalize(options.source);
|
|
267
|
+
this.target = this.normalize(options.target);
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
//# sourceMappingURL=match.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/match.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { MatchOptions, MatchItem, MouseEvent } from '../types';\nimport { stringWidth } from '../utils';\n\nexport class MatchPrompt extends Prompt<Record<string, any[]>, MatchOptions> {\n private source: MatchItem[];\n private target: MatchItem[];\n // Links: Source ID -> Set of Target IDs\n private links: Map<string, Set<string>> = new Map();\n\n private cursorSource: number = 0;\n private cursorTarget: number = 0;\n private scrollTopSource: number = 0;\n private scrollTopTarget: number = 0;\n\n private activeSide: 'source' | 'target' = 'source';\n private pickedSourceIndex: number | null = null;\n\n private readonly pageSize: number = 10;\n\n constructor(options: MatchOptions) {\n super(options);\n this.source = this.normalize(options.source);\n this.target = this.normalize(options.target);\n }\n\n private normalize(items: (string | MatchItem)[]): MatchItem[] {\n return items.map(item => {\n if (typeof item === 'string') {\n return { id: item, label: item, value: item };\n }\n return item;\n });\n }\n\n protected render(_firstRender: boolean) {\n const termWidth = process.stdout.columns || 80;\n const colWidth = Math.floor((termWidth - 8) / 2); // -8 for middle spacing and borders\n\n // Adjust Scroll Top\n if (this.activeSide === 'source') {\n if (this.cursorSource < this.scrollTopSource) this.scrollTopSource = this.cursorSource;\n if (this.cursorSource >= this.scrollTopSource + this.pageSize) this.scrollTopSource = this.cursorSource - this.pageSize + 1;\n } else {\n if (this.cursorTarget < this.scrollTopTarget) this.scrollTopTarget = this.cursorTarget;\n if (this.cursorTarget >= this.scrollTopTarget + this.pageSize) this.scrollTopTarget = this.cursorTarget - this.pageSize + 1;\n }\n\n let output = `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}\\n`;\n\n // Headers\n const sourceTitle = this.activeSide === 'source' ? `${theme.main}Source${ANSI.RESET}` : 'Source';\n const targetTitle = this.activeSide === 'target' ? `${theme.main}Target${ANSI.RESET}` : 'Target';\n\n output += ` ${sourceTitle}`.padEnd(colWidth + 2) + ' ' + ` ${targetTitle}\\n`;\n output += ` ${ANSI.DIM}${symbols.line.repeat(colWidth)}${ANSI.RESET} ${ANSI.DIM}${symbols.line.repeat(colWidth)}${ANSI.RESET}\\n`;\n\n // Render Rows\n for (let i = 0; i < this.pageSize; i++) {\n const idxSource = this.scrollTopSource + i;\n const idxTarget = this.scrollTopTarget + i;\n\n const itemSource = this.source[idxSource];\n const itemTarget = this.target[idxTarget];\n\n // Source Column\n let sourceStr = '';\n\n if (itemSource) {\n const isSelected = this.activeSide === 'source' && idxSource === this.cursorSource;\n const isPicked = this.pickedSourceIndex === idxSource;\n const hasLinks = this.links.has(itemSource.id) && this.links.get(itemSource.id)!.size > 0;\n\n let prefix = ' ';\n if (isSelected) prefix = `${theme.main}${symbols.pointer} `;\n if (isPicked) prefix = `${theme.success}${symbols.pointer} `;\n\n let title = this.truncate(itemSource.label, colWidth - 4);\n\n // Color logic\n if (isPicked) {\n title = `${theme.success}${title}${ANSI.RESET}`;\n } else if (hasLinks) {\n title = `${theme.success}${title}${ANSI.RESET}`;\n } else if (isSelected) {\n title = `${ANSI.FG_CYAN}${title}${ANSI.RESET}`;\n }\n\n // Indicator for links\n const linkIndicator = hasLinks ? `${theme.success}*${ANSI.RESET}` : ' ';\n\n sourceStr = `${prefix}${title} ${linkIndicator}`;\n\n // Highlight connected targets?\n if (isSelected || isPicked) {\n // This is handled in Target render\n }\n } else {\n sourceStr = '';\n }\n\n // Target Column\n let targetStr = '';\n if (itemTarget) {\n const isSelected = this.activeSide === 'target' && idxTarget === this.cursorTarget;\n\n // Determine if this target is linked to the RELEVANT source\n // Relevant source is: Picked Source OR (if none picked) Cursor Source\n const relevantSourceIdx = this.pickedSourceIndex !== null ? this.pickedSourceIndex : this.cursorSource;\n const relevantSource = this.source[relevantSourceIdx];\n\n let isLinkedToRelevant = false;\n let isLinkedToAny = false;\n\n // Check links\n for (const [sId, tIds] of Array.from(this.links.entries())) {\n if (tIds.has(itemTarget.id)) {\n isLinkedToAny = true;\n if (relevantSource && sId === relevantSource.id) {\n isLinkedToRelevant = true;\n }\n }\n }\n\n let prefix = ' ';\n if (isSelected) prefix = `${theme.main}${symbols.pointer} `;\n\n let title = this.truncate(itemTarget.label, colWidth - 4);\n\n if (isLinkedToRelevant) {\n title = `${theme.success}${title}${ANSI.RESET}`;\n } else if (isLinkedToAny) {\n // Linked to someone else\n title = `${ANSI.DIM}${title}${ANSI.RESET}`;\n } else if (isSelected) {\n title = `${ANSI.FG_CYAN}${title}${ANSI.RESET}`;\n }\n\n // Indicator\n const linkIndicator = isLinkedToRelevant ? `${theme.success}<=${ANSI.RESET}` : (isLinkedToAny ? `${ANSI.DIM}<=${ANSI.RESET}` : ' ');\n\n targetStr = `${linkIndicator} ${prefix}${title}`;\n }\n\n // Pad Source\n const sourceVisualLen = itemSource ? (stringWidth(this.stripAnsi(sourceStr))) : 0;\n const padding = ' '.repeat(Math.max(0, colWidth - sourceVisualLen + 2)); // +2 extra space\n\n output += sourceStr + padding + ' ' + targetStr + '\\n';\n }\n\n // Instructions\n if (this.pickedSourceIndex !== null) {\n output += `\\n${theme.success}Linking: ${this.source[this.pickedSourceIndex].label}${ANSI.RESET}`;\n output += `\\n${ANSI.DIM}Select Target to Link/Unlink. Esc to Cancel.${ANSI.RESET}`;\n } else {\n output += `\\n${ANSI.DIM}Space to Pick Source, Enter to Submit.${ANSI.RESET}`;\n }\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string) {\n // Navigation\n if (this.isUp(char)) {\n if (this.activeSide === 'source') {\n this.cursorSource = Math.max(0, this.cursorSource - 1);\n } else {\n this.cursorTarget = Math.max(0, this.cursorTarget - 1);\n }\n this.render(false);\n return;\n }\n\n if (this.isDown(char)) {\n if (this.activeSide === 'source') {\n this.cursorSource = Math.min(this.source.length - 1, this.cursorSource + 1);\n } else {\n this.cursorTarget = Math.min(this.target.length - 1, this.cursorTarget + 1);\n }\n this.render(false);\n return;\n }\n\n // Space: Action\n if (char === ' ') {\n if (this.activeSide === 'source') {\n // Pick Source\n this.pickedSourceIndex = this.cursorSource;\n this.activeSide = 'target';\n // Try to find first linked target or stay at top?\n // Stay at top or current pos is fine.\n } else {\n // Toggle Link\n if (this.pickedSourceIndex !== null) {\n const sId = this.source[this.pickedSourceIndex].id;\n const tId = this.target[this.cursorTarget].id;\n\n if (!this.links.has(sId)) {\n this.links.set(sId, new Set());\n }\n\n const sourceLinks = this.links.get(sId)!;\n\n if (sourceLinks.has(tId)) {\n // Unlink\n sourceLinks.delete(tId);\n } else {\n // Link\n if (this.options.constraints?.oneToMany === false) {\n\n for (const [otherSId, tIds] of Array.from(this.links.entries())) {\n if (otherSId !== sId && tIds.has(tId)) {\n tIds.delete(tId);\n }\n }\n }\n\n sourceLinks.add(tId);\n }\n // Stay in Target side to allow picking more?\n }\n }\n this.render(false);\n return;\n }\n\n // Enter\n if (char === '\\r' || char === '\\n') {\n // Check Required Constraint\n if (this.options.constraints?.required) {\n // Check if all sources have at least one link\n const allLinked = this.source.every(s => {\n return this.links.has(s.id) && this.links.get(s.id)!.size > 0;\n });\n\n if (!allLinked) {\n return;\n }\n }\n\n // Submit Result: Record<SourceID, TargetValue[]>\n const result: Record<string, any[]> = {};\n for (const [sId, tIds] of Array.from(this.links.entries())) {\n if (tIds.size > 0) {\n // Map Target IDs back to Values\n const values = Array.from(tIds).map(tid => {\n return this.target.find(t => t.id === tid)?.value;\n });\n result[sId] = values;\n }\n }\n this.submit(result);\n return;\n }\n\n // Escape / Backspace to go back to Source\n if (char === '\\u001b' || char === '\\u0008' || char === '\\x7f' || char === 'h') { // h for vim left\n if (this.activeSide === 'target') {\n this.activeSide = 'source';\n this.pickedSourceIndex = null;\n this.render(false);\n }\n return;\n }\n\n // Tab\n if (char === '\\t') {\n this.activeSide = this.activeSide === 'source' ? 'target' : 'source';\n // If switching to target without picking, pickedIndex is null.\n // Just viewing mode.\n if (this.activeSide === 'source') {\n this.pickedSourceIndex = null;\n }\n this.render(false);\n return;\n }\n }\n\n protected handleMouse(event: MouseEvent) {\n if (event.action === 'scroll') {\n if (event.scroll === 'up') {\n if (this.activeSide === 'source') {\n this.cursorSource = Math.max(0, this.cursorSource - 1);\n } else {\n this.cursorTarget = Math.max(0, this.cursorTarget - 1);\n }\n } else {\n if (this.activeSide === 'source') {\n this.cursorSource = Math.min(this.source.length - 1, this.cursorSource + 1);\n } else {\n this.cursorTarget = Math.min(this.target.length - 1, this.cursorTarget + 1);\n }\n }\n this.render(false);\n }\n }\n}\n"],"names":["MatchPrompt","Prompt","normalize","items","map","item","id","label","value","render","_firstRender","termWidth","process","stdout","columns","colWidth","Math","floor","activeSide","cursorSource","scrollTopSource","pageSize","cursorTarget","scrollTopTarget","output","theme","success","ANSI","RESET","BOLD","title","options","message","sourceTitle","main","targetTitle","padEnd","DIM","symbols","line","repeat","i","idxSource","idxTarget","itemSource","source","itemTarget","target","sourceStr","isSelected","isPicked","pickedSourceIndex","hasLinks","links","has","get","size","prefix","pointer","truncate","FG_CYAN","linkIndicator","targetStr","relevantSourceIdx","relevantSource","isLinkedToRelevant","isLinkedToAny","sId","tIds","Array","from","entries","sourceVisualLen","stringWidth","stripAnsi","padding","max","renderFrame","handleInput","char","isUp","isDown","min","length","tId","set","Set","sourceLinks","delete","constraints","oneToMany","otherSId","add","required","allLinked","every","s","result","values","tid","find","t","submit","handleMouse","event","action","scroll","Map"],"mappings":"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"}
|
|
@@ -1,44 +1,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class MillerPrompt extends base_1.Prompt {
|
|
10
|
-
constructor(options) {
|
|
11
|
-
super(options);
|
|
12
|
-
this.selections = [];
|
|
13
|
-
this.activeCol = 0;
|
|
14
|
-
this.scrollTops = []; // Scroll position for each column
|
|
15
|
-
// Layout
|
|
16
|
-
this.colWidth = 0;
|
|
17
|
-
this.visibleCols = 3;
|
|
18
|
-
this.selections = [0];
|
|
19
|
-
this.scrollTops = [0];
|
|
20
|
-
// TODO: Map initial values to selections if provided
|
|
21
|
-
this.calculateLayout();
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "MillerPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return MillerPrompt;
|
|
22
9
|
}
|
|
10
|
+
});
|
|
11
|
+
const _base = require("../base");
|
|
12
|
+
const _theme = require("../theme");
|
|
13
|
+
const _ansi = require("../ansi");
|
|
14
|
+
const _symbols = require("../symbols");
|
|
15
|
+
const _utils = require("../utils");
|
|
16
|
+
function _define_property(obj, key, value) {
|
|
17
|
+
if (key in obj) {
|
|
18
|
+
Object.defineProperty(obj, key, {
|
|
19
|
+
value: value,
|
|
20
|
+
enumerable: true,
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: true
|
|
23
|
+
});
|
|
24
|
+
} else {
|
|
25
|
+
obj[key] = value;
|
|
26
|
+
}
|
|
27
|
+
return obj;
|
|
28
|
+
}
|
|
29
|
+
let MillerPrompt = class MillerPrompt extends _base.Prompt {
|
|
23
30
|
calculateLayout() {
|
|
24
31
|
const termWidth = process.stdout.columns || 80;
|
|
25
32
|
// We aim for 3 columns? Or based on width?
|
|
26
33
|
// Minimum width per column ~ 20?
|
|
27
34
|
this.visibleCols = Math.floor(termWidth / 20);
|
|
28
|
-
if (this.visibleCols < 1)
|
|
29
|
-
|
|
30
|
-
if (this.visibleCols > 4)
|
|
31
|
-
this.visibleCols = 4; // Cap at 4
|
|
35
|
+
if (this.visibleCols < 1) this.visibleCols = 1;
|
|
36
|
+
if (this.visibleCols > 4) this.visibleCols = 4; // Cap at 4
|
|
32
37
|
this.colWidth = Math.floor((termWidth - 4) / this.visibleCols); // -4 for margins
|
|
33
38
|
}
|
|
34
39
|
getColumnData(depth) {
|
|
35
40
|
let current = this.options.data;
|
|
36
|
-
for
|
|
41
|
+
for(let i = 0; i < depth; i++){
|
|
37
42
|
const sel = this.selections[i];
|
|
38
43
|
if (current[sel] && current[sel].children) {
|
|
39
44
|
current = current[sel].children;
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
45
|
+
} else {
|
|
42
46
|
return undefined;
|
|
43
47
|
}
|
|
44
48
|
}
|
|
@@ -46,103 +50,98 @@ class MillerPrompt extends base_1.Prompt {
|
|
|
46
50
|
}
|
|
47
51
|
render(_firstRender) {
|
|
48
52
|
let output = '';
|
|
49
|
-
output += `${
|
|
53
|
+
output += `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}\n`;
|
|
50
54
|
let startCol = 0;
|
|
51
55
|
if (this.activeCol >= this.visibleCols) {
|
|
52
56
|
startCol = this.activeCol - this.visibleCols + 1;
|
|
53
57
|
}
|
|
54
58
|
// Construct columns content
|
|
55
59
|
const columnsToRender = [];
|
|
56
|
-
for
|
|
60
|
+
for(let c = startCol; c < startCol + this.visibleCols; c++){
|
|
57
61
|
const data = this.getColumnData(c);
|
|
58
|
-
if (!data)
|
|
59
|
-
break;
|
|
62
|
+
if (!data) break;
|
|
60
63
|
const rows = [];
|
|
61
64
|
const selectedIdx = this.selections[c] ?? -1;
|
|
62
65
|
const isFocusedCol = c === this.activeCol;
|
|
63
66
|
// Scroll handling
|
|
64
67
|
const pageSize = 10; // Fixed height for now
|
|
65
|
-
if (!this.scrollTops[c])
|
|
66
|
-
this.scrollTops[c] = 0;
|
|
68
|
+
if (!this.scrollTops[c]) this.scrollTops[c] = 0;
|
|
67
69
|
if (selectedIdx !== -1) {
|
|
68
70
|
if (selectedIdx < this.scrollTops[c]) {
|
|
69
71
|
this.scrollTops[c] = selectedIdx;
|
|
70
|
-
}
|
|
71
|
-
else if (selectedIdx >= this.scrollTops[c] + pageSize) {
|
|
72
|
+
} else if (selectedIdx >= this.scrollTops[c] + pageSize) {
|
|
72
73
|
this.scrollTops[c] = selectedIdx - pageSize + 1;
|
|
73
74
|
}
|
|
74
75
|
}
|
|
75
76
|
// Render rows
|
|
76
77
|
const start = this.scrollTops[c];
|
|
77
78
|
const end = Math.min(data.length, start + pageSize);
|
|
78
|
-
for
|
|
79
|
+
for(let i = start; i < end; i++){
|
|
79
80
|
const item = data[i];
|
|
80
81
|
const isSelected = i === selectedIdx;
|
|
81
82
|
const isFocused = isSelected && isFocusedCol;
|
|
82
83
|
let prefix = ' ';
|
|
83
84
|
if (isSelected) {
|
|
84
|
-
prefix = isFocused ? `${
|
|
85
|
+
prefix = isFocused ? `${_theme.theme.main}${_symbols.symbols.pointer}${_ansi.ANSI.RESET}` : `${_theme.theme.muted}${_symbols.symbols.pointer}${_ansi.ANSI.RESET}`;
|
|
85
86
|
}
|
|
86
87
|
let title = item.title;
|
|
87
88
|
// Truncate
|
|
88
|
-
if ((0,
|
|
89
|
+
if ((0, _utils.stringWidth)(title) > this.colWidth - 4) {
|
|
89
90
|
title = title.slice(0, this.colWidth - 5) + '…';
|
|
90
91
|
}
|
|
91
|
-
let line = `${prefix} ${isSelected && isFocused ?
|
|
92
|
+
let line = `${prefix} ${isSelected && isFocused ? _theme.theme.main : ''}${title}${_ansi.ANSI.RESET}`;
|
|
92
93
|
// Add arrow if children exist
|
|
93
94
|
if (item.children && item.children.length > 0) {
|
|
94
|
-
const pad = this.colWidth - (0,
|
|
95
|
-
line += ' '.repeat(Math.max(0, pad)) + `${
|
|
95
|
+
const pad = this.colWidth - (0, _utils.stringWidth)((0, _utils.stripAnsi)(line)) - 2;
|
|
96
|
+
line += ' '.repeat(Math.max(0, pad)) + `${_theme.theme.muted}>${_ansi.ANSI.RESET}`;
|
|
96
97
|
}
|
|
97
98
|
rows.push(line);
|
|
98
99
|
}
|
|
99
100
|
// Pad column to pageSize
|
|
100
|
-
while
|
|
101
|
+
while(rows.length < pageSize){
|
|
101
102
|
rows.push('');
|
|
102
103
|
}
|
|
103
104
|
columnsToRender.push(rows);
|
|
104
105
|
}
|
|
105
106
|
// Combine columns side by side
|
|
106
107
|
const rowCount = 10;
|
|
107
|
-
for
|
|
108
|
+
for(let r = 0; r < rowCount; r++){
|
|
108
109
|
let line = '';
|
|
109
|
-
for
|
|
110
|
+
for(let c = 0; c < columnsToRender.length; c++){
|
|
110
111
|
let cell = columnsToRender[c][r] || '';
|
|
111
112
|
// Pad cell
|
|
112
|
-
const len = (0,
|
|
113
|
+
const len = (0, _utils.stringWidth)((0, _utils.stripAnsi)(cell));
|
|
113
114
|
const pad = this.colWidth - len;
|
|
114
115
|
cell += ' '.repeat(Math.max(0, pad));
|
|
115
116
|
line += cell;
|
|
116
117
|
// Separator
|
|
117
118
|
if (c < columnsToRender.length - 1) {
|
|
118
|
-
line += `${
|
|
119
|
+
line += `${_theme.theme.muted}│${_ansi.ANSI.RESET} `;
|
|
119
120
|
}
|
|
120
121
|
}
|
|
121
122
|
output += line + '\n';
|
|
122
123
|
}
|
|
123
124
|
// Breadcrumbs / Status
|
|
124
125
|
const pathTitles = [];
|
|
125
|
-
for
|
|
126
|
+
for(let i = 0; i <= this.activeCol; i++){
|
|
126
127
|
const data = this.getColumnData(i);
|
|
127
128
|
if (data && typeof this.selections[i] === 'number') {
|
|
128
129
|
pathTitles.push(data[this.selections[i]].title);
|
|
129
130
|
}
|
|
130
131
|
}
|
|
131
|
-
output += `${
|
|
132
|
+
output += `${_theme.theme.muted}Path: ${pathTitles.join(' / ')}${_ansi.ANSI.RESET}`;
|
|
132
133
|
this.renderFrame(output);
|
|
133
134
|
}
|
|
134
135
|
handleInput(char) {
|
|
135
136
|
const currentData = this.getColumnData(this.activeCol);
|
|
136
|
-
if (!currentData)
|
|
137
|
-
return; // Should not happen
|
|
137
|
+
if (!currentData) return; // Should not happen
|
|
138
138
|
// Enter
|
|
139
139
|
if (char === '\r' || char === '\n') {
|
|
140
140
|
// Collect values
|
|
141
141
|
const values = [];
|
|
142
|
-
for
|
|
142
|
+
for(let i = 0; i <= this.activeCol; i++){
|
|
143
143
|
const d = this.getColumnData(i);
|
|
144
|
-
if (d)
|
|
145
|
-
values.push(d[this.selections[i]].value);
|
|
144
|
+
if (d) values.push(d[this.selections[i]].value);
|
|
146
145
|
}
|
|
147
146
|
this.submit(values);
|
|
148
147
|
return;
|
|
@@ -152,8 +151,7 @@ class MillerPrompt extends base_1.Prompt {
|
|
|
152
151
|
this.selections[this.activeCol]--;
|
|
153
152
|
// Reset subsequent columns
|
|
154
153
|
this.selections = this.selections.slice(0, this.activeCol + 1);
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
154
|
+
} else {
|
|
157
155
|
this.selections[this.activeCol] = currentData.length - 1;
|
|
158
156
|
this.selections = this.selections.slice(0, this.activeCol + 1);
|
|
159
157
|
}
|
|
@@ -164,8 +162,7 @@ class MillerPrompt extends base_1.Prompt {
|
|
|
164
162
|
if (this.selections[this.activeCol] < currentData.length - 1) {
|
|
165
163
|
this.selections[this.activeCol]++;
|
|
166
164
|
this.selections = this.selections.slice(0, this.activeCol + 1);
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
165
|
+
} else {
|
|
169
166
|
this.selections[this.activeCol] = 0;
|
|
170
167
|
this.selections = this.selections.slice(0, this.activeCol + 1);
|
|
171
168
|
}
|
|
@@ -194,21 +191,17 @@ class MillerPrompt extends base_1.Prompt {
|
|
|
194
191
|
handleMouse(event) {
|
|
195
192
|
if (event.action === 'scroll') {
|
|
196
193
|
const currentData = this.getColumnData(this.activeCol);
|
|
197
|
-
if (!currentData || currentData.length === 0)
|
|
198
|
-
return;
|
|
194
|
+
if (!currentData || currentData.length === 0) return;
|
|
199
195
|
if (event.scroll === 'up') {
|
|
200
196
|
if (this.selections[this.activeCol] > 0) {
|
|
201
197
|
this.selections[this.activeCol]--;
|
|
202
|
-
}
|
|
203
|
-
else {
|
|
198
|
+
} else {
|
|
204
199
|
this.selections[this.activeCol] = currentData.length - 1;
|
|
205
200
|
}
|
|
206
|
-
}
|
|
207
|
-
else if (event.scroll === 'down') {
|
|
201
|
+
} else if (event.scroll === 'down') {
|
|
208
202
|
if (this.selections[this.activeCol] < currentData.length - 1) {
|
|
209
203
|
this.selections[this.activeCol]++;
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
204
|
+
} else {
|
|
212
205
|
this.selections[this.activeCol] = 0;
|
|
213
206
|
}
|
|
214
207
|
}
|
|
@@ -217,5 +210,19 @@ class MillerPrompt extends base_1.Prompt {
|
|
|
217
210
|
this.render(false);
|
|
218
211
|
}
|
|
219
212
|
}
|
|
220
|
-
|
|
221
|
-
|
|
213
|
+
constructor(options){
|
|
214
|
+
super(options), _define_property(this, "selections", []), _define_property(this, "activeCol", 0), _define_property(this, "scrollTops", []) // Scroll position for each column
|
|
215
|
+
, // Layout
|
|
216
|
+
_define_property(this, "colWidth", 0), _define_property(this, "visibleCols", 3);
|
|
217
|
+
this.selections = [
|
|
218
|
+
0
|
|
219
|
+
];
|
|
220
|
+
this.scrollTops = [
|
|
221
|
+
0
|
|
222
|
+
];
|
|
223
|
+
// TODO: Map initial values to selections if provided
|
|
224
|
+
this.calculateLayout();
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
//# sourceMappingURL=miller.js.map
|