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
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "FilePrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return FilePrompt;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _ansi = require("../ansi");
|
|
12
|
+
const _base = require("../base");
|
|
13
|
+
const _theme = require("../theme");
|
|
14
|
+
const _symbols = require("../symbols");
|
|
15
|
+
const _fs = /*#__PURE__*/ _interop_require_wildcard(require("fs"));
|
|
16
|
+
const _path = /*#__PURE__*/ _interop_require_wildcard(require("path"));
|
|
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
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
31
|
+
if (typeof WeakMap !== "function") return null;
|
|
32
|
+
var cacheBabelInterop = new WeakMap();
|
|
33
|
+
var cacheNodeInterop = new WeakMap();
|
|
34
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
35
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
36
|
+
})(nodeInterop);
|
|
37
|
+
}
|
|
38
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
39
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
40
|
+
return obj;
|
|
41
|
+
}
|
|
42
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
43
|
+
return {
|
|
44
|
+
default: obj
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
48
|
+
if (cache && cache.has(obj)) {
|
|
49
|
+
return cache.get(obj);
|
|
50
|
+
}
|
|
51
|
+
var newObj = {
|
|
52
|
+
__proto__: null
|
|
53
|
+
};
|
|
54
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
55
|
+
for(var key in obj){
|
|
56
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
57
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
58
|
+
if (desc && (desc.get || desc.set)) {
|
|
59
|
+
Object.defineProperty(newObj, key, desc);
|
|
60
|
+
} else {
|
|
61
|
+
newObj[key] = obj[key];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
newObj.default = obj;
|
|
66
|
+
if (cache) {
|
|
67
|
+
cache.set(obj, newObj);
|
|
68
|
+
}
|
|
69
|
+
return newObj;
|
|
70
|
+
}
|
|
71
|
+
let FilePrompt = class FilePrompt extends _base.Prompt {
|
|
72
|
+
/**
|
|
73
|
+
* Updates the suggestions list based on the current input path.
|
|
74
|
+
*/ updateSuggestions() {
|
|
75
|
+
try {
|
|
76
|
+
// Determine the directory to scan and the partial file name
|
|
77
|
+
const isDirQuery = this.input.endsWith('/') || this.input.endsWith('\\');
|
|
78
|
+
const dir = isDirQuery ? this.input : _path.dirname(this.input) || '.';
|
|
79
|
+
const partial = isDirQuery ? '' : _path.basename(this.input);
|
|
80
|
+
if (_fs.existsSync(dir) && _fs.statSync(dir).isDirectory()) {
|
|
81
|
+
const files = _fs.readdirSync(dir);
|
|
82
|
+
this.suggestions = files.filter((f)=>f.toLowerCase().startsWith(partial.toLowerCase())).filter((f)=>{
|
|
83
|
+
const fullPath = _path.join(dir, f);
|
|
84
|
+
try {
|
|
85
|
+
const stats = _fs.statSync(fullPath);
|
|
86
|
+
const isDir = stats.isDirectory();
|
|
87
|
+
if (this.options.onlyDirectories && !isDir) return false;
|
|
88
|
+
if (this.options.extensions && !isDir) {
|
|
89
|
+
return this.options.extensions.some((ext)=>f.endsWith(ext));
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
} catch (_e) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
}).map((f)=>{
|
|
96
|
+
const fullPath = _path.join(dir, f);
|
|
97
|
+
try {
|
|
98
|
+
// Append separator if the file is a directory
|
|
99
|
+
if (_fs.statSync(fullPath).isDirectory()) return f + _path.sep;
|
|
100
|
+
} catch (_e) {}
|
|
101
|
+
return f;
|
|
102
|
+
});
|
|
103
|
+
} else {
|
|
104
|
+
this.suggestions = [];
|
|
105
|
+
}
|
|
106
|
+
} catch (_e) {
|
|
107
|
+
this.suggestions = [];
|
|
108
|
+
}
|
|
109
|
+
this.selectedSuggestion = -1;
|
|
110
|
+
}
|
|
111
|
+
render(firstRender) {
|
|
112
|
+
// Restore cursor position to the bottom before renderFrame clears the area
|
|
113
|
+
if (!firstRender && this.lastLinesUp > 0) {
|
|
114
|
+
this.print(`\x1b[${this.lastLinesUp}B`);
|
|
115
|
+
this.lastLinesUp = 0;
|
|
116
|
+
}
|
|
117
|
+
const icon = this.errorMsg ? `${_theme.theme.error}${_symbols.symbols.cross}` : `${_theme.theme.success}?`;
|
|
118
|
+
let output = `${icon} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} ${this.input}`;
|
|
119
|
+
if (this.suggestions.length > 0) {
|
|
120
|
+
output += '\n';
|
|
121
|
+
const maxShow = 5;
|
|
122
|
+
const displayed = this.suggestions.slice(0, maxShow);
|
|
123
|
+
displayed.forEach((s, i)=>{
|
|
124
|
+
if (i > 0) output += '\n';
|
|
125
|
+
if (i === this.selectedSuggestion) {
|
|
126
|
+
output += `${_theme.theme.main}${_symbols.symbols.pointer} ${s}${_ansi.ANSI.RESET}`;
|
|
127
|
+
} else {
|
|
128
|
+
output += ` ${s}`;
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
if (this.suggestions.length > maxShow) {
|
|
132
|
+
output += `\n ${_theme.theme.muted}...and ${this.suggestions.length - maxShow} more${_ansi.ANSI.RESET}`;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
this.renderFrame(output);
|
|
136
|
+
// Move cursor back up to the input line
|
|
137
|
+
const totalLines = this.lastRenderHeight;
|
|
138
|
+
if (totalLines > 1) {
|
|
139
|
+
this.lastLinesUp = totalLines - 1;
|
|
140
|
+
this.print(`\x1b[${this.lastLinesUp}A`);
|
|
141
|
+
}
|
|
142
|
+
// Calculate horizontal cursor position on the input line
|
|
143
|
+
const prefix = `${icon} ${_theme.theme.title}${this.options.message} `;
|
|
144
|
+
const prefixLen = this.stripAnsi(prefix).length;
|
|
145
|
+
const targetCol = prefixLen + this.input.length;
|
|
146
|
+
this.print(_ansi.ANSI.CURSOR_LEFT);
|
|
147
|
+
if (targetCol > 0) this.print(`\x1b[${targetCol}C`);
|
|
148
|
+
this.print(_ansi.ANSI.SHOW_CURSOR);
|
|
149
|
+
}
|
|
150
|
+
cleanup() {
|
|
151
|
+
if (this.lastLinesUp > 0) {
|
|
152
|
+
this.print(`\x1b[${this.lastLinesUp}B`);
|
|
153
|
+
this.lastLinesUp = 0;
|
|
154
|
+
}
|
|
155
|
+
super.cleanup();
|
|
156
|
+
}
|
|
157
|
+
handleInput(char) {
|
|
158
|
+
if (char === '\t') {
|
|
159
|
+
if (this.suggestions.length > 0) {
|
|
160
|
+
// Use the selected suggestion or the first one available
|
|
161
|
+
const idx = this.selectedSuggestion === -1 ? 0 : this.selectedSuggestion;
|
|
162
|
+
const suggestion = this.suggestions[idx];
|
|
163
|
+
const isDir = this.input.endsWith('/') || this.input.endsWith('\\');
|
|
164
|
+
const dir = isDir ? this.input : _path.dirname(this.input);
|
|
165
|
+
// Construct the new path accurately
|
|
166
|
+
const baseDir = dir === '.' && !this.input.startsWith('.') ? '' : dir;
|
|
167
|
+
this.input = _path.join(baseDir, suggestion);
|
|
168
|
+
this.cursor = this.input.length;
|
|
169
|
+
// Immediately refresh suggestions for the new path
|
|
170
|
+
this.updateSuggestions();
|
|
171
|
+
this.render(false);
|
|
172
|
+
}
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if (char === '\r' || char === '\n') {
|
|
176
|
+
this.submit(this.input);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
if (this.isDown(char)) {
|
|
180
|
+
if (this.suggestions.length > 0) {
|
|
181
|
+
const count = Math.min(this.suggestions.length, 5);
|
|
182
|
+
this.selectedSuggestion = (this.selectedSuggestion + 1) % count;
|
|
183
|
+
this.render(false);
|
|
184
|
+
}
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (this.isUp(char)) {
|
|
188
|
+
if (this.suggestions.length > 0) {
|
|
189
|
+
const count = Math.min(this.suggestions.length, 5);
|
|
190
|
+
this.selectedSuggestion = (this.selectedSuggestion - 1 + count) % count;
|
|
191
|
+
this.render(false);
|
|
192
|
+
}
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (char === '\u0008' || char === '\x7f') {
|
|
196
|
+
if (this.input.length > 0) {
|
|
197
|
+
this.input = this.input.slice(0, -1);
|
|
198
|
+
this.updateSuggestions();
|
|
199
|
+
this.render(false);
|
|
200
|
+
}
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (!/^[\x00-\x1F]/.test(char) && !char.startsWith('\x1b')) {
|
|
204
|
+
this.input += char;
|
|
205
|
+
this.updateSuggestions();
|
|
206
|
+
this.render(false);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
constructor(options){
|
|
210
|
+
super(options), _define_property(this, "input", ''), _define_property(this, "cursor", 0), _define_property(this, "suggestions", []), _define_property(this, "selectedSuggestion", -1), _define_property(this, "errorMsg", ''), _define_property(this, "lastLinesUp", 0);
|
|
211
|
+
this.input = options.basePath || '';
|
|
212
|
+
this.cursor = this.input.length;
|
|
213
|
+
this.updateSuggestions();
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
//# sourceMappingURL=file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/file.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { FileOptions } from '../types';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * Implementation of FilePrompt with autocomplete.\n */\nexport class FilePrompt extends Prompt<string, FileOptions> {\n private input: string = '';\n private cursor: number = 0;\n private suggestions: string[] = [];\n private selectedSuggestion: number = -1;\n private errorMsg: string = '';\n private lastLinesUp: number = 0;\n\n constructor(options: FileOptions) {\n super(options);\n this.input = options.basePath || '';\n this.cursor = this.input.length;\n this.updateSuggestions();\n }\n\n /**\n * Updates the suggestions list based on the current input path.\n */\n private updateSuggestions() {\n try {\n // Determine the directory to scan and the partial file name\n const isDirQuery = this.input.endsWith('/') || this.input.endsWith('\\\\');\n const dir = isDirQuery ? this.input : (path.dirname(this.input) || '.');\n const partial = isDirQuery ? '' : path.basename(this.input);\n\n if (fs.existsSync(dir) && fs.statSync(dir).isDirectory()) {\n const files = fs.readdirSync(dir);\n this.suggestions = files\n .filter(f => f.toLowerCase().startsWith(partial.toLowerCase()))\n .filter(f => {\n const fullPath = path.join(dir, f);\n try {\n const stats = fs.statSync(fullPath);\n const isDir = stats.isDirectory();\n if (this.options.onlyDirectories && !isDir) return false;\n if (this.options.extensions && !isDir) {\n return this.options.extensions.some(ext => f.endsWith(ext));\n }\n return true;\n } catch (_e) {\n return false;\n }\n })\n .map(f => {\n const fullPath = path.join(dir, f);\n try {\n // Append separator if the file is a directory\n if (fs.statSync(fullPath).isDirectory()) return f + path.sep;\n } catch (_e) { /* ignore */ }\n return f;\n });\n } else {\n this.suggestions = [];\n }\n } catch (_e) {\n this.suggestions = [];\n }\n this.selectedSuggestion = -1;\n }\n\n protected render(firstRender: boolean) {\n // Restore cursor position to the bottom before renderFrame clears the area\n if (!firstRender && this.lastLinesUp > 0) {\n this.print(`\\x1b[${this.lastLinesUp}B`);\n this.lastLinesUp = 0;\n }\n\n const icon = this.errorMsg ? `${theme.error}${symbols.cross}` : `${theme.success}?`;\n let output = `${icon} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET} ${this.input}`;\n\n if (this.suggestions.length > 0) {\n output += '\\n';\n const maxShow = 5;\n const displayed = this.suggestions.slice(0, maxShow);\n\n displayed.forEach((s, i) => {\n if (i > 0) output += '\\n';\n if (i === this.selectedSuggestion) {\n output += `${theme.main}${symbols.pointer} ${s}${ANSI.RESET}`;\n } else {\n output += ` ${s}`;\n }\n });\n if (this.suggestions.length > maxShow) {\n output += `\\n ${theme.muted}...and ${this.suggestions.length - maxShow} more${ANSI.RESET}`;\n }\n }\n\n this.renderFrame(output);\n\n // Move cursor back up to the input line\n const totalLines = this.lastRenderHeight;\n if (totalLines > 1) {\n this.lastLinesUp = totalLines - 1;\n this.print(`\\x1b[${this.lastLinesUp}A`);\n }\n\n // Calculate horizontal cursor position on the input line\n const prefix = `${icon} ${theme.title}${this.options.message} `;\n const prefixLen = this.stripAnsi(prefix).length;\n const targetCol = prefixLen + this.input.length;\n\n this.print(ANSI.CURSOR_LEFT);\n if (targetCol > 0) this.print(`\\x1b[${targetCol}C`);\n this.print(ANSI.SHOW_CURSOR);\n }\n\n protected cleanup() {\n if (this.lastLinesUp > 0) {\n this.print(`\\x1b[${this.lastLinesUp}B`);\n this.lastLinesUp = 0;\n }\n super.cleanup();\n }\n\n protected handleInput(char: string) {\n if (char === '\\t') {\n if (this.suggestions.length > 0) {\n // Use the selected suggestion or the first one available\n const idx = this.selectedSuggestion === -1 ? 0 : this.selectedSuggestion;\n const suggestion = this.suggestions[idx];\n\n const isDir = this.input.endsWith('/') || this.input.endsWith('\\\\');\n const dir = isDir ? this.input : path.dirname(this.input);\n\n // Construct the new path accurately\n const baseDir = (dir === '.' && !this.input.startsWith('.')) ? '' : dir;\n this.input = path.join(baseDir, suggestion);\n this.cursor = this.input.length;\n\n // Immediately refresh suggestions for the new path\n this.updateSuggestions();\n this.render(false);\n }\n return;\n }\n\n if (char === '\\r' || char === '\\n') {\n this.submit(this.input);\n return;\n }\n\n if (this.isDown(char)) {\n if (this.suggestions.length > 0) {\n const count = Math.min(this.suggestions.length, 5);\n this.selectedSuggestion = (this.selectedSuggestion + 1) % count;\n this.render(false);\n }\n return;\n }\n\n if (this.isUp(char)) {\n if (this.suggestions.length > 0) {\n const count = Math.min(this.suggestions.length, 5);\n this.selectedSuggestion = (this.selectedSuggestion - 1 + count) % count;\n this.render(false);\n }\n return;\n }\n\n if (char === '\\u0008' || char === '\\x7f') {\n if (this.input.length > 0) {\n this.input = this.input.slice(0, -1);\n this.updateSuggestions();\n this.render(false);\n }\n return;\n }\n\n if (!/^[\\x00-\\x1F]/.test(char) && !char.startsWith('\\x1b')) {\n this.input += char;\n this.updateSuggestions();\n this.render(false);\n }\n }\n}"],"names":["FilePrompt","Prompt","updateSuggestions","isDirQuery","input","endsWith","dir","path","dirname","partial","basename","fs","existsSync","statSync","isDirectory","files","readdirSync","suggestions","filter","f","toLowerCase","startsWith","fullPath","join","stats","isDir","options","onlyDirectories","extensions","some","ext","_e","map","sep","selectedSuggestion","render","firstRender","lastLinesUp","print","icon","errorMsg","theme","error","symbols","cross","success","output","ANSI","BOLD","title","message","RESET","length","maxShow","displayed","slice","forEach","s","i","main","pointer","muted","renderFrame","totalLines","lastRenderHeight","prefix","prefixLen","stripAnsi","targetCol","CURSOR_LEFT","SHOW_CURSOR","cleanup","handleInput","char","idx","suggestion","baseDir","cursor","submit","isDown","count","Math","min","isUp","test","basePath"],"mappings":"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"}
|
|
@@ -1,25 +1,32 @@
|
|
|
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
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "FormPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return FormPrompt;
|
|
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
|
|
20
23
|
});
|
|
21
|
-
|
|
24
|
+
} else {
|
|
25
|
+
obj[key] = value;
|
|
22
26
|
}
|
|
27
|
+
return obj;
|
|
28
|
+
}
|
|
29
|
+
let FormPrompt = class FormPrompt extends _base.Prompt {
|
|
23
30
|
render(firstRender) {
|
|
24
31
|
if (!firstRender && this.lastLinesUp > 0) {
|
|
25
32
|
this.print(`\x1b[${this.lastLinesUp}B`);
|
|
@@ -27,30 +34,29 @@ class FormPrompt extends base_1.Prompt {
|
|
|
27
34
|
this.lastLinesUp = 0;
|
|
28
35
|
const outputLines = [];
|
|
29
36
|
// Title
|
|
30
|
-
outputLines.push(`${
|
|
37
|
+
outputLines.push(`${_theme.theme.success}? ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}`);
|
|
31
38
|
if (this.globalError) {
|
|
32
|
-
outputLines.push(`${
|
|
39
|
+
outputLines.push(`${_theme.theme.error}>> ${this.globalError}${_ansi.ANSI.RESET}`);
|
|
33
40
|
}
|
|
34
41
|
let cursorLineIndex = -1;
|
|
35
42
|
let cursorColIndex = 0;
|
|
36
|
-
this.options.fields.forEach((field, index)
|
|
43
|
+
this.options.fields.forEach((field, index)=>{
|
|
37
44
|
const isActive = index === this.activeIndex;
|
|
38
45
|
const value = this.values[field.name];
|
|
39
46
|
const error = this.fieldErrors[field.name];
|
|
40
47
|
// Icon
|
|
41
48
|
let icon = '';
|
|
42
49
|
if (isActive) {
|
|
43
|
-
icon = `${
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
50
|
+
icon = `${_theme.theme.main}${_symbols.symbols.pointer}`; // >
|
|
51
|
+
} else {
|
|
46
52
|
icon = ' '; // indent
|
|
47
53
|
}
|
|
48
54
|
// Label
|
|
49
|
-
const labelStyle = isActive ? `${
|
|
50
|
-
const label = `${labelStyle}${field.message}:${
|
|
55
|
+
const labelStyle = isActive ? `${_theme.theme.main}${_ansi.ANSI.BOLD}` : _theme.theme.muted;
|
|
56
|
+
const label = `${labelStyle}${field.message}:${_ansi.ANSI.RESET}`;
|
|
51
57
|
// Value
|
|
52
58
|
// Note: Use Secret/Password prompt for case sensitive input, Form prompt is for general text input
|
|
53
|
-
const displayValue = isActive ? value : `${
|
|
59
|
+
const displayValue = isActive ? value : `${_theme.theme.muted}${value}${_ansi.ANSI.RESET}`;
|
|
54
60
|
// Construct Line
|
|
55
61
|
const line = `${icon} ${label} ${displayValue}`;
|
|
56
62
|
outputLines.push(line);
|
|
@@ -60,29 +66,29 @@ class FormPrompt extends base_1.Prompt {
|
|
|
60
66
|
const prefix = `${icon} ${label} `;
|
|
61
67
|
const valuePrefix = value.substring(0, this.cursor);
|
|
62
68
|
cursorLineIndex = outputLines.length - 1;
|
|
63
|
-
cursorColIndex = (0,
|
|
69
|
+
cursorColIndex = (0, _utils.stringWidth)(this.stripAnsi(prefix)) + (0, _utils.stringWidth)(this.stripAnsi(valuePrefix));
|
|
64
70
|
}
|
|
65
71
|
// Error for this field
|
|
66
72
|
if (error) {
|
|
67
|
-
outputLines.push(` ${
|
|
73
|
+
outputLines.push(` ${_theme.theme.error}>> ${error}${_ansi.ANSI.RESET}`);
|
|
68
74
|
}
|
|
69
75
|
});
|
|
70
76
|
// Instructions
|
|
71
77
|
outputLines.push('');
|
|
72
|
-
outputLines.push(`${
|
|
78
|
+
outputLines.push(`${_ansi.ANSI.RESET}${_theme.theme.muted}(Use Up/Down/Tab to navigate, Enter to submit)${_ansi.ANSI.RESET}`);
|
|
73
79
|
const output = outputLines.join('\n');
|
|
74
80
|
this.renderFrame(output);
|
|
75
81
|
// Position Cursor
|
|
76
|
-
this.print(
|
|
82
|
+
this.print(_ansi.ANSI.SHOW_CURSOR);
|
|
77
83
|
if (cursorLineIndex !== -1) {
|
|
78
84
|
// Calculate lines up from bottom
|
|
79
85
|
const totalLines = outputLines.length;
|
|
80
|
-
const linesUp =
|
|
86
|
+
const linesUp = totalLines - 1 - cursorLineIndex;
|
|
81
87
|
if (linesUp > 0) {
|
|
82
88
|
this.print(`\x1b[${linesUp}A`);
|
|
83
89
|
this.lastLinesUp = linesUp;
|
|
84
90
|
}
|
|
85
|
-
this.print(
|
|
91
|
+
this.print(_ansi.ANSI.CURSOR_LEFT);
|
|
86
92
|
if (cursorColIndex > 0) {
|
|
87
93
|
this.print(`\x1b[${cursorColIndex}C`);
|
|
88
94
|
}
|
|
@@ -90,7 +96,7 @@ class FormPrompt extends base_1.Prompt {
|
|
|
90
96
|
}
|
|
91
97
|
handleInput(char, key) {
|
|
92
98
|
// Navigation: Up / Shift+Tab
|
|
93
|
-
if (this.isUp(char) ||
|
|
99
|
+
if (this.isUp(char) || char === '\t' && key /* how to detect Shift+Tab? usually \u001b[Z */ || char === '\u001b[Z') {
|
|
94
100
|
this.validateCurrentField();
|
|
95
101
|
this.moveFocus(-1);
|
|
96
102
|
return;
|
|
@@ -103,12 +109,11 @@ class FormPrompt extends base_1.Prompt {
|
|
|
103
109
|
}
|
|
104
110
|
// Enter
|
|
105
111
|
if (char === '\r' || char === '\n') {
|
|
106
|
-
this.validateCurrentField().then(isValid
|
|
112
|
+
this.validateCurrentField().then((isValid)=>{
|
|
107
113
|
if (isValid) {
|
|
108
114
|
if (this.activeIndex < this.options.fields.length - 1) {
|
|
109
115
|
this.moveFocus(1);
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
116
|
+
} else {
|
|
112
117
|
// Submit
|
|
113
118
|
this.submitForm();
|
|
114
119
|
}
|
|
@@ -119,7 +124,7 @@ class FormPrompt extends base_1.Prompt {
|
|
|
119
124
|
// Editing Active Field
|
|
120
125
|
const activeField = this.options.fields[this.activeIndex];
|
|
121
126
|
const val = this.values[activeField.name];
|
|
122
|
-
if (char === '\u0008' || char === '\x7f') {
|
|
127
|
+
if (char === '\u0008' || char === '\x7f') {
|
|
123
128
|
if (this.cursor > 0) {
|
|
124
129
|
const pre = val.slice(0, this.cursor - 1);
|
|
125
130
|
const post = val.slice(this.cursor);
|
|
@@ -131,14 +136,12 @@ class FormPrompt extends base_1.Prompt {
|
|
|
131
136
|
}
|
|
132
137
|
// Left/Right arrow to move cursor within field
|
|
133
138
|
if (this.isLeft(char)) {
|
|
134
|
-
if (this.cursor > 0)
|
|
135
|
-
this.cursor--;
|
|
139
|
+
if (this.cursor > 0) this.cursor--;
|
|
136
140
|
this.render(false);
|
|
137
141
|
return;
|
|
138
142
|
}
|
|
139
143
|
if (this.isRight(char)) {
|
|
140
|
-
if (this.cursor < val.length)
|
|
141
|
-
this.cursor++;
|
|
144
|
+
if (this.cursor < val.length) this.cursor++;
|
|
142
145
|
this.render(false);
|
|
143
146
|
return;
|
|
144
147
|
}
|
|
@@ -157,8 +160,7 @@ class FormPrompt extends base_1.Prompt {
|
|
|
157
160
|
if (event.scroll === 'up') {
|
|
158
161
|
this.validateCurrentField();
|
|
159
162
|
this.moveFocus(-1);
|
|
160
|
-
}
|
|
161
|
-
else if (event.scroll === 'down') {
|
|
163
|
+
} else if (event.scroll === 'down') {
|
|
162
164
|
this.validateCurrentField();
|
|
163
165
|
this.moveFocus(1);
|
|
164
166
|
}
|
|
@@ -184,8 +186,7 @@ class FormPrompt extends base_1.Prompt {
|
|
|
184
186
|
this.render(false);
|
|
185
187
|
return false;
|
|
186
188
|
}
|
|
187
|
-
}
|
|
188
|
-
catch (err) {
|
|
189
|
+
} catch (err) {
|
|
189
190
|
this.fieldErrors[field.name] = err.message || 'Validation failed';
|
|
190
191
|
this.render(false);
|
|
191
192
|
return false;
|
|
@@ -207,26 +208,34 @@ class FormPrompt extends base_1.Prompt {
|
|
|
207
208
|
this.globalError = '';
|
|
208
209
|
// Validate all fields
|
|
209
210
|
let allValid = true;
|
|
210
|
-
for (const field of this.options.fields)
|
|
211
|
+
for (const field of this.options.fields){
|
|
211
212
|
const val = this.values[field.name];
|
|
212
213
|
if (field.validate) {
|
|
213
214
|
const res = await field.validate(val);
|
|
214
215
|
if (res !== true) {
|
|
215
216
|
this.fieldErrors[field.name] = typeof res === 'string' ? res : 'Invalid value';
|
|
216
217
|
allValid = false;
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
218
|
+
} else {
|
|
219
219
|
delete this.fieldErrors[field.name];
|
|
220
220
|
}
|
|
221
221
|
}
|
|
222
222
|
}
|
|
223
223
|
if (allValid) {
|
|
224
224
|
this.submit(this.values);
|
|
225
|
-
}
|
|
226
|
-
else {
|
|
225
|
+
} else {
|
|
227
226
|
this.globalError = 'Please fix errors before submitting.';
|
|
228
227
|
this.render(false);
|
|
229
228
|
}
|
|
230
229
|
}
|
|
231
|
-
|
|
232
|
-
|
|
230
|
+
constructor(options){
|
|
231
|
+
super(options), _define_property(this, "values", {}), _define_property(this, "activeIndex", 0), _define_property(this, "fieldErrors", {}), _define_property(this, "globalError", ''), _define_property(this, "cursor", 0) // Cursor position for the ACTIVE field.
|
|
232
|
+
, _define_property(this, "lastLinesUp", 0) // To track cursor position after render
|
|
233
|
+
;
|
|
234
|
+
this.options.fields.forEach((field)=>{
|
|
235
|
+
this.values[field.name] = field.initial || '';
|
|
236
|
+
});
|
|
237
|
+
this.cursor = this.values[this.options.fields[0].name].length;
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
//# sourceMappingURL=form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/form.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { FormOptions, MouseEvent } from '../types';\nimport { stringWidth } from '../utils';\n\nexport class FormPrompt extends Prompt<Record<string, string>, FormOptions> {\n private values: Record<string, string> = {};\n private activeIndex: number = 0;\n private fieldErrors: Record<string, string> = {};\n private globalError: string = '';\n private cursor: number = 0; // Cursor position for the ACTIVE field.\n private lastLinesUp: number = 0; // To track cursor position after render\n\n constructor(options: FormOptions) {\n super(options);\n this.options.fields.forEach(field => {\n this.values[field.name] = field.initial || '';\n });\n this.cursor = this.values[this.options.fields[0].name].length;\n }\n\n protected render(firstRender: boolean) {\n if (!firstRender && this.lastLinesUp > 0) {\n this.print(`\\x1b[${this.lastLinesUp}B`);\n }\n this.lastLinesUp = 0;\n\n const outputLines: string[] = [];\n\n // Title\n outputLines.push(`${theme.success}? ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}`);\n if (this.globalError) {\n outputLines.push(`${theme.error}>> ${this.globalError}${ANSI.RESET}`);\n }\n\n let cursorLineIndex = -1;\n let cursorColIndex = 0;\n\n this.options.fields.forEach((field, index) => {\n const isActive = index === this.activeIndex;\n const value = this.values[field.name];\n const error = this.fieldErrors[field.name];\n\n // Icon\n let icon = '';\n if (isActive) {\n icon = `${theme.main}${symbols.pointer}`; // >\n } else {\n icon = ' '; // indent\n }\n\n // Label\n const labelStyle = isActive ? `${theme.main}${ANSI.BOLD}` : theme.muted;\n const label = `${labelStyle}${field.message}:${ANSI.RESET}`;\n\n // Value\n // Note: Use Secret/Password prompt for case sensitive input, Form prompt is for general text input\n const displayValue = isActive ? value : `${theme.muted}${value}${ANSI.RESET}`;\n\n // Construct Line\n const line = `${icon} ${label} ${displayValue}`;\n outputLines.push(line);\n\n if (isActive) {\n // Determine cursor position\n // We need visual length of \"icon + label + value_up_to_cursor\"\n const prefix = `${icon} ${label} `;\n const valuePrefix = value.substring(0, this.cursor);\n cursorLineIndex = outputLines.length - 1;\n cursorColIndex = stringWidth(this.stripAnsi(prefix)) + stringWidth(this.stripAnsi(valuePrefix));\n }\n\n // Error for this field\n if (error) {\n outputLines.push(` ${theme.error}>> ${error}${ANSI.RESET}`);\n }\n });\n\n // Instructions\n outputLines.push('');\n outputLines.push(`${ANSI.RESET}${theme.muted}(Use Up/Down/Tab to navigate, Enter to submit)${ANSI.RESET}`);\n\n const output = outputLines.join('\\n');\n this.renderFrame(output);\n\n // Position Cursor\n this.print(ANSI.SHOW_CURSOR);\n\n if (cursorLineIndex !== -1) {\n // Calculate lines up from bottom\n const totalLines = outputLines.length;\n const linesUp = (totalLines - 1) - cursorLineIndex;\n\n if (linesUp > 0) {\n this.print(`\\x1b[${linesUp}A`);\n this.lastLinesUp = linesUp;\n }\n\n this.print(ANSI.CURSOR_LEFT);\n if (cursorColIndex > 0) {\n this.print(`\\x1b[${cursorColIndex}C`);\n }\n }\n }\n\n protected handleInput(char: string, key: Buffer) {\n // Navigation: Up / Shift+Tab\n if (this.isUp(char) || (char === '\\t' && key /* how to detect Shift+Tab? usually \\u001b[Z */) || char === '\\u001b[Z') {\n this.validateCurrentField();\n this.moveFocus(-1);\n return;\n }\n\n // Navigation: Down / Tab\n if (this.isDown(char) || char === '\\t') {\n this.validateCurrentField();\n this.moveFocus(1);\n return;\n }\n\n // Enter\n if (char === '\\r' || char === '\\n') {\n this.validateCurrentField().then(isValid => {\n if (isValid) {\n if (this.activeIndex < this.options.fields.length - 1) {\n this.moveFocus(1);\n } else {\n // Submit\n this.submitForm();\n }\n }\n });\n return;\n }\n\n // Editing Active Field\n const activeField = this.options.fields[this.activeIndex];\n const val = this.values[activeField.name];\n\n if (char === '\\u0008' || char === '\\x7f') { // Backspace\n if (this.cursor > 0) {\n const pre = val.slice(0, this.cursor - 1);\n const post = val.slice(this.cursor);\n this.values[activeField.name] = pre + post;\n this.cursor--;\n this.render(false);\n }\n return;\n }\n\n // Left/Right arrow to move cursor within field\n if (this.isLeft(char)) {\n if (this.cursor > 0) this.cursor--;\n this.render(false);\n return;\n }\n if (this.isRight(char)) {\n if (this.cursor < val.length) this.cursor++;\n this.render(false);\n return;\n }\n\n // Typing\n if (!/^[\\x00-\\x1F]/.test(char) && !char.startsWith('\\x1b')) {\n const pre = val.slice(0, this.cursor);\n const post = val.slice(this.cursor);\n this.values[activeField.name] = pre + char + post;\n this.cursor += char.length;\n this.fieldErrors[activeField.name] = ''; // Clear error on type\n this.render(false);\n }\n }\n\n protected handleMouse(event: MouseEvent) {\n if (event.action === 'scroll') {\n if (event.scroll === 'up') {\n this.validateCurrentField();\n this.moveFocus(-1);\n } else if (event.scroll === 'down') {\n this.validateCurrentField();\n this.moveFocus(1);\n }\n }\n }\n\n private moveFocus(direction: number) {\n const nextIndex = this.activeIndex + direction;\n if (nextIndex >= 0 && nextIndex < this.options.fields.length) {\n this.activeIndex = nextIndex;\n // \"cursor must jump to end of data\"\n this.cursor = this.values[this.options.fields[this.activeIndex].name].length;\n this.render(false);\n }\n }\n\n private async validateCurrentField(): Promise<boolean> {\n const field = this.options.fields[this.activeIndex];\n const val = this.values[field.name];\n\n if (field.validate) {\n try {\n const res = await field.validate(val);\n if (res !== true) {\n this.fieldErrors[field.name] = typeof res === 'string' ? res : 'Invalid value';\n this.render(false);\n return false;\n }\n } catch (err: any) {\n this.fieldErrors[field.name] = err.message || 'Validation failed';\n this.render(false);\n return false;\n }\n }\n\n // Clear error if valid\n delete this.fieldErrors[field.name];\n this.render(false);\n return true;\n }\n\n protected cleanup() {\n if (this.lastLinesUp > 0) {\n this.print(`\\x1b[${this.lastLinesUp}B`);\n this.lastLinesUp = 0;\n }\n super.cleanup();\n }\n\n private async submitForm() {\n this.globalError = '';\n\n // Validate all fields\n let allValid = true;\n for (const field of this.options.fields) {\n const val = this.values[field.name];\n if (field.validate) {\n const res = await field.validate(val);\n if (res !== true) {\n this.fieldErrors[field.name] = typeof res === 'string' ? res : 'Invalid value';\n allValid = false;\n } else {\n delete this.fieldErrors[field.name];\n }\n }\n }\n\n if (allValid) {\n this.submit(this.values);\n } else {\n this.globalError = 'Please fix errors before submitting.';\n this.render(false);\n }\n }\n}\n"],"names":["FormPrompt","Prompt","render","firstRender","lastLinesUp","print","outputLines","push","theme","success","ANSI","BOLD","title","options","message","RESET","globalError","error","cursorLineIndex","cursorColIndex","fields","forEach","field","index","isActive","activeIndex","value","values","name","fieldErrors","icon","main","symbols","pointer","labelStyle","muted","label","displayValue","line","prefix","valuePrefix","substring","cursor","length","stringWidth","stripAnsi","output","join","renderFrame","SHOW_CURSOR","totalLines","linesUp","CURSOR_LEFT","handleInput","char","key","isUp","validateCurrentField","moveFocus","isDown","then","isValid","submitForm","activeField","val","pre","slice","post","isLeft","isRight","test","startsWith","handleMouse","event","action","scroll","direction","nextIndex","validate","res","err","cleanup","allValid","submit","initial"],"mappings":"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"}
|