mepcli 2.0.0-beta.2 → 2.0.0-beta.3
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/dist/ansi.d.ts +36 -0
- package/dist/ansi.js +1 -0
- package/dist/base.d.ts +60 -0
- package/dist/base.js +1 -0
- package/dist/{src/core.js → core.d.ts} +175 -345
- package/dist/core.js +1 -0
- package/dist/data/countries.d.ts +2 -0
- package/dist/data/countries.js +1 -0
- package/dist/data/licenses.d.ts +2 -0
- package/dist/data/licenses.js +1 -0
- package/dist/highlight.d.ts +7 -0
- package/dist/highlight.js +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.js +1 -0
- package/dist/input.d.ts +14 -0
- package/dist/input.js +1 -0
- package/dist/pipeline.d.ts +90 -0
- package/dist/pipeline.js +1 -0
- package/dist/prompts/autocomplete.d.ts +22 -0
- package/dist/prompts/autocomplete.js +1 -0
- package/dist/prompts/box.d.ts +21 -0
- package/dist/prompts/box.js +4 -0
- package/dist/prompts/breadcrumb-search.d.ts +14 -0
- package/dist/prompts/breadcrumb-search.js +2 -0
- package/dist/prompts/breadcrumb.d.ts +32 -0
- package/dist/prompts/breadcrumb.js +3 -0
- package/dist/prompts/byte.d.ts +13 -0
- package/dist/prompts/byte.js +5 -0
- package/dist/prompts/calculator.d.ts +17 -0
- package/dist/prompts/calculator.js +3 -0
- package/dist/prompts/calendar.d.ts +33 -0
- package/dist/prompts/calendar.js +3 -0
- package/dist/prompts/checkbox.d.ts +13 -0
- package/dist/prompts/checkbox.js +2 -0
- package/dist/prompts/code.d.ts +19 -0
- package/dist/prompts/code.js +4 -0
- package/dist/prompts/color.d.ts +14 -0
- package/dist/prompts/color.js +10 -0
- package/dist/prompts/confirm.d.ts +8 -0
- package/dist/prompts/confirm.js +1 -0
- package/dist/prompts/connection-string.d.ts +18 -0
- package/dist/prompts/connection-string.js +1 -0
- package/dist/prompts/cron.d.ts +13 -0
- package/dist/prompts/cron.js +4 -0
- package/dist/prompts/curl-utils.d.ts +25 -0
- package/dist/prompts/curl-utils.js +1 -0
- package/dist/prompts/curl.d.ts +41 -0
- package/dist/prompts/curl.js +12 -0
- package/dist/prompts/data-inspector.d.ts +22 -0
- package/dist/prompts/data-inspector.js +5 -0
- package/dist/prompts/date.d.ts +12 -0
- package/dist/prompts/date.js +2 -0
- package/dist/prompts/dependency.d.ts +16 -0
- package/dist/prompts/dependency.js +3 -0
- package/dist/prompts/dial.d.ts +10 -0
- package/dist/prompts/dial.js +3 -0
- package/dist/prompts/diff.d.ts +10 -0
- package/dist/prompts/diff.js +10 -0
- package/dist/prompts/draw.d.ts +20 -0
- package/dist/prompts/draw.js +6 -0
- package/dist/prompts/editor.d.ts +14 -0
- package/dist/prompts/editor.js +2 -0
- package/dist/prompts/emoji.d.ts +18 -0
- package/dist/prompts/emoji.js +5 -0
- package/dist/prompts/exec.d.ts +17 -0
- package/dist/prompts/exec.js +1 -0
- package/dist/prompts/file.d.ts +21 -0
- package/dist/prompts/file.js +2 -0
- package/dist/prompts/form.d.ts +18 -0
- package/dist/prompts/form.js +1 -0
- package/dist/prompts/fuzzy-multi-column.d.ts +12 -0
- package/dist/prompts/fuzzy-multi-column.js +2 -0
- package/dist/prompts/fuzzy.d.ts +12 -0
- package/dist/prompts/fuzzy.js +2 -0
- package/dist/prompts/gauge.d.ts +21 -0
- package/dist/prompts/gauge.js +4 -0
- package/dist/prompts/grid.d.ts +14 -0
- package/dist/prompts/grid.js +2 -0
- package/dist/prompts/heatmap.d.ts +13 -0
- package/dist/prompts/heatmap.js +2 -0
- package/dist/prompts/ip.d.ts +11 -0
- package/dist/prompts/ip.js +3 -0
- package/dist/prompts/kanban.d.ts +17 -0
- package/dist/prompts/kanban.js +4 -0
- package/dist/prompts/keypress.d.ts +7 -0
- package/dist/prompts/keypress.js +1 -0
- package/dist/prompts/license.d.ts +9 -0
- package/dist/prompts/license.js +13 -0
- package/dist/prompts/list.d.ts +9 -0
- package/dist/prompts/list.js +1 -0
- package/dist/prompts/map.d.ts +17 -0
- package/dist/prompts/map.js +5 -0
- package/dist/prompts/match.d.ts +19 -0
- package/dist/prompts/match.js +7 -0
- package/dist/prompts/miller.d.ts +15 -0
- package/dist/prompts/miller.js +2 -0
- package/dist/prompts/multi-column-select.d.ts +10 -0
- package/dist/prompts/multi-column-select.js +2 -0
- package/dist/prompts/multi-range.d.ts +9 -0
- package/dist/prompts/multi-range.js +3 -0
- package/dist/prompts/multi-select.d.ts +15 -0
- package/dist/prompts/multi-select.js +4 -0
- package/dist/prompts/number.d.ts +11 -0
- package/dist/prompts/number.js +2 -0
- package/dist/prompts/otp.d.ts +10 -0
- package/dist/prompts/otp.js +2 -0
- package/dist/prompts/pattern.d.ts +22 -0
- package/dist/prompts/pattern.js +4 -0
- package/dist/prompts/phone.d.ts +41 -0
- package/dist/prompts/phone.js +3 -0
- package/dist/prompts/quiz-select.d.ts +10 -0
- package/dist/prompts/quiz-select.js +7 -0
- package/dist/prompts/quiz-text.d.ts +11 -0
- package/dist/prompts/quiz-text.js +8 -0
- package/dist/prompts/range.d.ts +9 -0
- package/dist/prompts/range.js +1 -0
- package/dist/prompts/rating.d.ts +8 -0
- package/dist/prompts/rating.js +1 -0
- package/dist/prompts/regex.d.ts +13 -0
- package/dist/prompts/regex.js +5 -0
- package/dist/prompts/region.d.ts +11 -0
- package/dist/prompts/region.js +5 -0
- package/dist/prompts/schedule.d.ts +20 -0
- package/dist/prompts/schedule.js +5 -0
- package/dist/prompts/scroll.d.ts +13 -0
- package/dist/prompts/scroll.js +1 -0
- package/dist/prompts/seat.d.ts +17 -0
- package/dist/prompts/seat.js +5 -0
- package/dist/prompts/select-range.d.ts +8 -0
- package/dist/prompts/select-range.js +3 -0
- package/dist/prompts/select.d.ts +15 -0
- package/dist/prompts/select.js +2 -0
- package/dist/prompts/semver.d.ts +6 -0
- package/dist/prompts/semver.js +1 -0
- package/dist/prompts/shortcut.d.ts +9 -0
- package/dist/prompts/shortcut.js +1 -0
- package/dist/prompts/slider.d.ts +8 -0
- package/dist/prompts/slider.js +1 -0
- package/dist/prompts/slot.d.ts +16 -0
- package/dist/prompts/slot.js +8 -0
- package/dist/prompts/snippet.d.ts +19 -0
- package/dist/prompts/snippet.js +4 -0
- package/dist/prompts/sort-grid.d.ts +16 -0
- package/dist/prompts/sort-grid.js +2 -0
- package/dist/prompts/sort.d.ts +14 -0
- package/dist/prompts/sort.js +2 -0
- package/dist/prompts/spam.d.ts +17 -0
- package/dist/prompts/spam.js +2 -0
- package/dist/prompts/spreadsheet.d.ts +21 -0
- package/dist/prompts/spreadsheet.js +7 -0
- package/dist/prompts/table.d.ts +14 -0
- package/dist/prompts/table.js +3 -0
- package/dist/prompts/text.d.ts +17 -0
- package/dist/prompts/text.js +2 -0
- package/dist/prompts/time.d.ts +12 -0
- package/dist/prompts/time.js +2 -0
- package/dist/prompts/toggle.d.ts +8 -0
- package/dist/prompts/toggle.js +1 -0
- package/dist/prompts/transfer.d.ts +18 -0
- package/dist/prompts/transfer.js +5 -0
- package/dist/prompts/tree-select.d.ts +31 -0
- package/dist/prompts/tree-select.js +3 -0
- package/dist/prompts/tree.d.ts +20 -0
- package/dist/prompts/tree.js +3 -0
- package/dist/prompts/wait.d.ts +18 -0
- package/dist/prompts/wait.js +1 -0
- package/dist/spinner.d.ts +33 -0
- package/dist/spinner.js +3 -0
- package/dist/symbols.d.ts +33 -0
- package/dist/symbols.js +1 -0
- package/dist/tasks.d.ts +57 -0
- package/dist/tasks.js +1 -0
- package/dist/theme.d.ts +2 -0
- package/dist/theme.js +1 -0
- package/dist/types.d.ts +503 -0
- package/dist/types.js +1 -0
- package/dist/utils.d.ts +81 -0
- package/dist/utils.js +1 -0
- package/package.json +8 -9
- package/dist/src/ansi.js +0 -50
- package/dist/src/ansi.js.map +0 -1
- package/dist/src/base.js +0 -258
- package/dist/src/base.js.map +0 -1
- package/dist/src/core.js.map +0 -1
- package/dist/src/data/countries.js +0 -569
- package/dist/src/data/countries.js.map +0 -1
- package/dist/src/data/licenses.js +0 -480
- package/dist/src/data/licenses.js.map +0 -1
- package/dist/src/highlight.js +0 -185
- package/dist/src/highlight.js.map +0 -1
- package/dist/src/index.js +0 -66
- package/dist/src/index.js.map +0 -1
- package/dist/src/input.js +0 -158
- package/dist/src/input.js.map +0 -1
- package/dist/src/pipeline.js +0 -273
- package/dist/src/pipeline.js.map +0 -1
- package/dist/src/prompts/autocomplete.js +0 -171
- package/dist/src/prompts/autocomplete.js.map +0 -1
- package/dist/src/prompts/box.js +0 -225
- package/dist/src/prompts/box.js.map +0 -1
- package/dist/src/prompts/breadcrumb-search.js +0 -260
- package/dist/src/prompts/breadcrumb-search.js.map +0 -1
- package/dist/src/prompts/breadcrumb.js +0 -307
- package/dist/src/prompts/breadcrumb.js.map +0 -1
- package/dist/src/prompts/byte.js +0 -176
- package/dist/src/prompts/byte.js.map +0 -1
- package/dist/src/prompts/calculator.js +0 -243
- package/dist/src/prompts/calculator.js.map +0 -1
- package/dist/src/prompts/calendar.js +0 -430
- package/dist/src/prompts/calendar.js.map +0 -1
- package/dist/src/prompts/checkbox.js +0 -159
- package/dist/src/prompts/checkbox.js.map +0 -1
- package/dist/src/prompts/code.js +0 -271
- package/dist/src/prompts/code.js.map +0 -1
- package/dist/src/prompts/color.js +0 -165
- package/dist/src/prompts/color.js.map +0 -1
- package/dist/src/prompts/confirm.js +0 -55
- package/dist/src/prompts/confirm.js.map +0 -1
- package/dist/src/prompts/connection-string.js +0 -120
- package/dist/src/prompts/connection-string.js.map +0 -1
- package/dist/src/prompts/cron.js +0 -207
- package/dist/src/prompts/cron.js.map +0 -1
- package/dist/src/prompts/curl-utils.js +0 -71
- package/dist/src/prompts/curl-utils.js.map +0 -1
- package/dist/src/prompts/curl.js +0 -431
- package/dist/src/prompts/curl.js.map +0 -1
- package/dist/src/prompts/data-inspector.js +0 -261
- package/dist/src/prompts/data-inspector.js.map +0 -1
- package/dist/src/prompts/date.js +0 -185
- package/dist/src/prompts/date.js.map +0 -1
- package/dist/src/prompts/dependency.js +0 -283
- package/dist/src/prompts/dependency.js.map +0 -1
- package/dist/src/prompts/dial.js +0 -124
- package/dist/src/prompts/dial.js.map +0 -1
- package/dist/src/prompts/diff.js +0 -118
- package/dist/src/prompts/diff.js.map +0 -1
- package/dist/src/prompts/draw.js +0 -191
- package/dist/src/prompts/draw.js.map +0 -1
- package/dist/src/prompts/editor.js +0 -234
- package/dist/src/prompts/editor.js.map +0 -1
- package/dist/src/prompts/emoji.js +0 -226
- package/dist/src/prompts/emoji.js.map +0 -1
- package/dist/src/prompts/exec.js +0 -151
- package/dist/src/prompts/exec.js.map +0 -1
- package/dist/src/prompts/file.js +0 -217
- package/dist/src/prompts/file.js.map +0 -1
- package/dist/src/prompts/form.js +0 -241
- package/dist/src/prompts/form.js.map +0 -1
- package/dist/src/prompts/fuzzy-multi-column.js +0 -161
- package/dist/src/prompts/fuzzy-multi-column.js.map +0 -1
- package/dist/src/prompts/fuzzy.js +0 -147
- package/dist/src/prompts/fuzzy.js.map +0 -1
- package/dist/src/prompts/gauge.js +0 -137
- package/dist/src/prompts/gauge.js.map +0 -1
- package/dist/src/prompts/grid.js +0 -191
- package/dist/src/prompts/grid.js.map +0 -1
- package/dist/src/prompts/heatmap.js +0 -147
- package/dist/src/prompts/heatmap.js.map +0 -1
- package/dist/src/prompts/ip.js +0 -138
- package/dist/src/prompts/ip.js.map +0 -1
- package/dist/src/prompts/kanban.js +0 -233
- package/dist/src/prompts/kanban.js.map +0 -1
- package/dist/src/prompts/keypress.js +0 -54
- package/dist/src/prompts/keypress.js.map +0 -1
- package/dist/src/prompts/license.js +0 -144
- package/dist/src/prompts/license.js.map +0 -1
- package/dist/src/prompts/list.js +0 -124
- package/dist/src/prompts/list.js.map +0 -1
- package/dist/src/prompts/map.js +0 -262
- package/dist/src/prompts/map.js.map +0 -1
- package/dist/src/prompts/match.js +0 -271
- package/dist/src/prompts/match.js.map +0 -1
- package/dist/src/prompts/miller.js +0 -228
- package/dist/src/prompts/miller.js.map +0 -1
- package/dist/src/prompts/multi-column-select.js +0 -176
- package/dist/src/prompts/multi-column-select.js.map +0 -1
- package/dist/src/prompts/multi-range.js +0 -189
- package/dist/src/prompts/multi-range.js.map +0 -1
- package/dist/src/prompts/multi-select.js +0 -183
- package/dist/src/prompts/multi-select.js.map +0 -1
- package/dist/src/prompts/number.js +0 -166
- package/dist/src/prompts/number.js.map +0 -1
- package/dist/src/prompts/otp.js +0 -107
- package/dist/src/prompts/otp.js.map +0 -1
- package/dist/src/prompts/pattern.js +0 -252
- package/dist/src/prompts/pattern.js.map +0 -1
- package/dist/src/prompts/phone.js +0 -398
- package/dist/src/prompts/phone.js.map +0 -1
- package/dist/src/prompts/quiz-select.js +0 -114
- package/dist/src/prompts/quiz-select.js.map +0 -1
- package/dist/src/prompts/quiz-text.js +0 -98
- package/dist/src/prompts/quiz-text.js.map +0 -1
- package/dist/src/prompts/range.js +0 -164
- package/dist/src/prompts/range.js.map +0 -1
- package/dist/src/prompts/rating.js +0 -83
- package/dist/src/prompts/rating.js.map +0 -1
- package/dist/src/prompts/regex.js +0 -145
- package/dist/src/prompts/regex.js.map +0 -1
- package/dist/src/prompts/region.js +0 -170
- package/dist/src/prompts/region.js.map +0 -1
- package/dist/src/prompts/schedule.js +0 -270
- package/dist/src/prompts/schedule.js.map +0 -1
- package/dist/src/prompts/scroll.js +0 -155
- package/dist/src/prompts/scroll.js.map +0 -1
- package/dist/src/prompts/seat.js +0 -164
- package/dist/src/prompts/seat.js.map +0 -1
- package/dist/src/prompts/select-range.js +0 -148
- package/dist/src/prompts/select-range.js.map +0 -1
- package/dist/src/prompts/select.js +0 -163
- package/dist/src/prompts/select.js.map +0 -1
- package/dist/src/prompts/semver.js +0 -43
- package/dist/src/prompts/semver.js.map +0 -1
- package/dist/src/prompts/shortcut.js +0 -133
- package/dist/src/prompts/shortcut.js.map +0 -1
- package/dist/src/prompts/slider.js +0 -69
- package/dist/src/prompts/slider.js.map +0 -1
- package/dist/src/prompts/slot.js +0 -117
- package/dist/src/prompts/slot.js.map +0 -1
- package/dist/src/prompts/snippet.js +0 -228
- package/dist/src/prompts/snippet.js.map +0 -1
- package/dist/src/prompts/sort-grid.js +0 -151
- package/dist/src/prompts/sort-grid.js.map +0 -1
- package/dist/src/prompts/sort.js +0 -166
- package/dist/src/prompts/sort.js.map +0 -1
- package/dist/src/prompts/spam.js +0 -80
- package/dist/src/prompts/spam.js.map +0 -1
- package/dist/src/prompts/spreadsheet.js +0 -240
- package/dist/src/prompts/spreadsheet.js.map +0 -1
- package/dist/src/prompts/table.js +0 -120
- package/dist/src/prompts/table.js.map +0 -1
- package/dist/src/prompts/text.js +0 -317
- package/dist/src/prompts/text.js.map +0 -1
- package/dist/src/prompts/time.js +0 -211
- package/dist/src/prompts/time.js.map +0 -1
- package/dist/src/prompts/toggle.js +0 -53
- package/dist/src/prompts/toggle.js.map +0 -1
- package/dist/src/prompts/transfer.js +0 -207
- package/dist/src/prompts/transfer.js.map +0 -1
- package/dist/src/prompts/tree-select.js +0 -270
- package/dist/src/prompts/tree-select.js.map +0 -1
- package/dist/src/prompts/tree.js +0 -233
- package/dist/src/prompts/tree.js.map +0 -1
- package/dist/src/prompts/wait.js +0 -79
- package/dist/src/prompts/wait.js.map +0 -1
- package/dist/src/spinner.js +0 -105
- package/dist/src/spinner.js.map +0 -1
- package/dist/src/symbols.js +0 -66
- package/dist/src/symbols.js.map +0 -1
- package/dist/src/tasks.js +0 -231
- package/dist/src/tasks.js.map +0 -1
- package/dist/src/theme.js +0 -29
- package/dist/src/theme.js.map +0 -1
- package/dist/src/types.js +0 -8
- package/dist/src/types.js.map +0 -1
- package/dist/src/utils.js +0 -480
- package/dist/src/utils.js.map +0 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Prompt } from '../base';
|
|
2
|
+
import { CodeOptions, MouseEvent } from '../types';
|
|
3
|
+
export declare class CodePrompt extends Prompt<string, CodeOptions> {
|
|
4
|
+
private tokens;
|
|
5
|
+
private variableTokens;
|
|
6
|
+
private values;
|
|
7
|
+
private activeVarIndex;
|
|
8
|
+
private cursor;
|
|
9
|
+
private lastLinesUp;
|
|
10
|
+
constructor(options: CodeOptions);
|
|
11
|
+
private parseTemplate;
|
|
12
|
+
protected cleanup(): void;
|
|
13
|
+
protected render(firstRender: boolean): void;
|
|
14
|
+
private appendSegment;
|
|
15
|
+
protected handleInput(char: string, _key: Buffer): void;
|
|
16
|
+
protected handleMouse(event: MouseEvent): void;
|
|
17
|
+
private moveFocus;
|
|
18
|
+
private submitCode;
|
|
19
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"CodePrompt",{enumerable:true,get:function(){return CodePrompt}});const _ansi=require("../ansi");const _base=require("../base");const _theme=require("../theme");const _utils=require("../utils");const _highlight=require("../highlight");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let CodePrompt=class CodePrompt extends _base.Prompt{parseTemplate(){const regex=/\$\{([a-zA-Z0-9_]+)\}/g;let lastIndex=0;let match;while((match=regex.exec(this.options.template))!==null){if(match.index>lastIndex){this.tokens.push({type:"static",value:this.options.template.substring(lastIndex,match.index)})}this.tokens.push({type:"variable",value:match[1]});this.variableTokens.push(this.tokens.length-1);lastIndex=regex.lastIndex}if(lastIndex<this.options.template.length){this.tokens.push({type:"static",value:this.options.template.substring(lastIndex)})}}cleanup(){if(this.lastLinesUp>0){this.print(`\x1b[${this.lastLinesUp}B`);this.lastLinesUp=0}super.cleanup()}render(firstRender){if(!firstRender&&this.lastLinesUp>0){this.print(`\x1b[${this.lastLinesUp}B`)}this.lastLinesUp=0;let fullRawText="";let activeVarStart=-1;let activeVarEnd=-1;const activeTokenIdx=this.variableTokens[this.activeVarIndex];this.tokens.forEach((token,idx)=>{const val=token.type==="static"?token.value:this.values[token.value]||"";if(idx===activeTokenIdx){activeVarStart=fullRawText.length;activeVarEnd=activeVarStart+val.length}fullRawText+=val});let highlighted="";const shouldHighlight=this.options.highlight!==false;if(shouldHighlight){const lang=this.options.language||"json";const highlightedText=(0,_highlight.highlight)(fullRawText,lang);let visibleIdx=0;let activeColor="";for(let i=0;i<highlightedText.length;i++){const char=highlightedText[i];if(char==="\x1b"){let sequence=char;i++;while(i<highlightedText.length&&highlightedText[i]!=="m"){sequence+=highlightedText[i];i++}if(i<highlightedText.length)sequence+="m";if(sequence===_ansi.ANSI.RESET||sequence==="\x1b[0m"){activeColor=""}else{activeColor=sequence}if(visibleIdx>=activeVarStart&&visibleIdx<activeVarEnd){highlighted+=sequence;highlighted+=_ansi.ANSI.UNDERLINE}else{highlighted+=sequence}continue}if(visibleIdx===activeVarStart){highlighted+=`${_theme.theme.main}${_ansi.ANSI.UNDERLINE}`}highlighted+=char;visibleIdx++;if(visibleIdx===activeVarEnd){highlighted+=_ansi.ANSI.RESET;if(activeColor){highlighted+=activeColor}}}highlighted+=_ansi.ANSI.RESET}else{this.appendSegment(fullRawText,0,activeVarStart,activeVarEnd,_ansi.ANSI.RESET,s=>highlighted+=s)}const warningMsg=shouldHighlight?`${_ansi.ANSI.FG_YELLOW}Warning:${_ansi.ANSI.RESET} Syntax highlighting is an experimental feature.
|
|
2
|
+
`:"";const prefix=`${warningMsg}${_theme.theme.success}? ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}
|
|
3
|
+
`;const suffix=`
|
|
4
|
+
${_theme.theme.muted}(Tab to next, Enter to submit)${_ansi.ANSI.RESET}`;const fullOutput=prefix+highlighted+suffix;this.renderFrame(fullOutput);const cursorAbsPos=activeVarStart+this.cursor;const textBeforeCursor=fullRawText.substring(0,cursorAbsPos);const rowsBefore=textBeforeCursor.split("\n");const cursorRow=rowsBefore.length-1;const cursorCol=(0,_utils.stringWidth)(rowsBefore[rowsBefore.length-1]);const totalSnippetLines=fullRawText.split("\n").length;const linesUp=1+(totalSnippetLines-1-cursorRow);this.print(_ansi.ANSI.SHOW_CURSOR);if(linesUp>0){this.print(`\x1b[${linesUp}A`);this.lastLinesUp=linesUp}this.print(_ansi.ANSI.CURSOR_LEFT);if(cursorCol>0){this.print(`\x1b[${cursorCol}C`)}}appendSegment(text,absStart,activeStart,activeEnd,syntaxColor,append){const absEnd=absStart+text.length;const overlapStart=Math.max(absStart,activeStart);const overlapEnd=Math.min(absEnd,activeEnd);if(overlapStart<overlapEnd){if(absStart<overlapStart){const part=text.substring(0,overlapStart-absStart);append(`${syntaxColor}${part}${_ansi.ANSI.RESET}`)}const activePart=text.substring(overlapStart-absStart,overlapEnd-absStart);append(`${_theme.theme.main}${_ansi.ANSI.UNDERLINE}${activePart}${_ansi.ANSI.RESET}`);if(absEnd>overlapEnd){const part=text.substring(overlapEnd-absStart);append(`${syntaxColor}${part}${_ansi.ANSI.RESET}`)}}else{append(`${syntaxColor}${text}${_ansi.ANSI.RESET}`)}}handleInput(char,_key){if(char==="\x1b[Z"){this.moveFocus(-1);return}if(char===" "){this.moveFocus(1);return}if(char==="\r"||char==="\n"){this.submitCode();return}const activeTokenIdx=this.variableTokens[this.activeVarIndex];const varName=this.tokens[activeTokenIdx].value;const val=this.values[varName]||"";if(char==="\b"||char===""){if(this.cursor>0){const pre=val.slice(0,this.cursor-1);const post=val.slice(this.cursor);this.values[varName]=pre+post;this.cursor--;this.render(false)}return}if(this.isLeft(char)){if(this.cursor>0)this.cursor--;this.render(false);return}if(this.isRight(char)){if(this.cursor<val.length)this.cursor++;this.render(false);return}if(!/^[\x00-\x1F]/.test(char)&&!char.startsWith("\x1b")){const pre=val.slice(0,this.cursor);const post=val.slice(this.cursor);this.values[varName]=pre+char+post;this.cursor+=char.length;this.render(false)}}handleMouse(event){if(event.action==="scroll"){if(event.scroll==="up")this.moveFocus(-1);else if(event.scroll==="down")this.moveFocus(1)}}moveFocus(direction){const nextIndex=this.activeVarIndex+direction;if(nextIndex>=0&&nextIndex<this.variableTokens.length){this.activeVarIndex=nextIndex;const varName=this.tokens[this.variableTokens[this.activeVarIndex]].value;this.cursor=(this.values[varName]||"").length;this.render(false)}}submitCode(){let result="";this.tokens.forEach(token=>{if(token.type==="static"){result+=token.value}else{result+=this.values[token.value]||""}});this.submit(result)}constructor(options){super(options),_define_property(this,"tokens",[]),_define_property(this,"variableTokens",[]),_define_property(this,"values",{}),_define_property(this,"activeVarIndex",0),_define_property(this,"cursor",0),_define_property(this,"lastLinesUp",0);this.parseTemplate();this.variableTokens.forEach(idx=>{const name=this.tokens[idx].value;this.values[name]=this.options.values&&this.options.values[name]||""});if(this.variableTokens.length>0){const activeName=this.tokens[this.variableTokens[0]].value;this.cursor=this.values[activeName].length}}};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Prompt } from '../base';
|
|
2
|
+
import { ColorOptions, MouseEvent } from '../types';
|
|
3
|
+
export declare class ColorPrompt extends Prompt<string, ColorOptions> {
|
|
4
|
+
private rgb;
|
|
5
|
+
private activeChannel;
|
|
6
|
+
private inputBuffer;
|
|
7
|
+
constructor(options: ColorOptions);
|
|
8
|
+
private parseHex;
|
|
9
|
+
private rgbToHex;
|
|
10
|
+
private getBgColorCode;
|
|
11
|
+
protected render(_firstRender: boolean): void;
|
|
12
|
+
protected handleInput(char: string, _key: Buffer): void;
|
|
13
|
+
protected handleMouse(event: MouseEvent): void;
|
|
14
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"ColorPrompt",{enumerable:true,get:function(){return ColorPrompt}});const _ansi=require("../ansi");const _base=require("../base");const _theme=require("../theme");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let ColorPrompt=class ColorPrompt extends _base.Prompt{parseHex(hex){const result=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);return result?{r:parseInt(result[1],16),g:parseInt(result[2],16),b:parseInt(result[3],16)}:{r:0,g:0,b:0}}rgbToHex(r,g,b){return"#"+((1<<24)+(r<<16)+(g<<8)+b).toString(16).slice(1).toUpperCase()}getBgColorCode(r,g,b){return`\x1b[48;2;${r};${g};${b}m`}render(_firstRender){const{r,g,b}=this.rgb;const hex=this.rgbToHex(r,g,b);let output=`${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} `;output+=`${_ansi.ANSI.BOLD}${hex}${_ansi.ANSI.RESET}
|
|
2
|
+
|
|
3
|
+
`;if(this.capabilities.hasTrueColor){const bg=this.getBgColorCode(r,g,b);const block=`${bg} ${_ansi.ANSI.RESET}`;output+=` ${block}
|
|
4
|
+
`;output+=` ${block}
|
|
5
|
+
`;output+=` ${block}
|
|
6
|
+
|
|
7
|
+
`}else{output+=` (Preview unavailable in this terminal)
|
|
8
|
+
|
|
9
|
+
`}const channels=["r","g","b"];const labels={r:"Red ",g:"Green",b:"Blue "};channels.forEach(ch=>{const val=this.rgb[ch];const isActive=this.activeChannel===ch;const width=20;const pos=Math.floor(val/255*width);const trackSimple="━".repeat(pos)+(isActive?"●":"○")+"─".repeat(width-pos);let line=`${labels[ch]}: ${val.toString().padStart(3)} [${trackSimple}]`;if(isActive){line=`${_theme.theme.main}${_ansi.ANSI.REVERSE} ${line} ${_ansi.ANSI.RESET}`}else{line=` ${line} `}output+=line+"\n"});output+=`
|
|
10
|
+
${_theme.theme.muted}Arrows: Adjust/Switch | Shift+Arrows: Adjust fast | Enter: Submit${_ansi.ANSI.RESET}`;this.renderFrame(output)}handleInput(char,_key){const isUp=this.isUp(char);const isDown=this.isDown(char);const isLeft=this.isLeft(char);const isRight=this.isRight(char);const isShiftRight=char==="\x1b[1;2C";const isShiftLeft=char==="\x1b[1;2D";if(isUp){if(this.activeChannel==="g")this.activeChannel="r";else if(this.activeChannel==="b")this.activeChannel="g";this.render(false);return}if(isDown){if(this.activeChannel==="r")this.activeChannel="g";else if(this.activeChannel==="g")this.activeChannel="b";this.render(false);return}if(isLeft||isRight||isShiftLeft||isShiftRight){let change=0;if(isRight)change=1;if(isLeft)change=-1;if(isShiftRight)change=10;if(isShiftLeft)change=-10;const val=this.rgb[this.activeChannel]+change;this.rgb[this.activeChannel]=Math.max(0,Math.min(255,val));this.render(false);return}if(char===" "){if(this.activeChannel==="r")this.activeChannel="g";else if(this.activeChannel==="g")this.activeChannel="b";else this.activeChannel="r";this.render(false);return}if(char==="\r"||char==="\n"){this.submit(this.rgbToHex(this.rgb.r,this.rgb.g,this.rgb.b));return}}handleMouse(event){if(event.action==="scroll"){const fast=!!event.ctrl;const step=fast?10:1;const change=event.scroll==="up"?step:event.scroll==="down"?-step:0;if(change!==0){const val=this.rgb[this.activeChannel]+change;this.rgb[this.activeChannel]=Math.max(0,Math.min(255,val));this.render(false)}}}constructor(options){super(options),_define_property(this,"rgb",void 0),_define_property(this,"activeChannel","r"),_define_property(this,"inputBuffer","");this.rgb=this.parseHex(options.initial||"#000000")}};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Prompt } from '../base';
|
|
2
|
+
import { ConfirmOptions, MouseEvent } from '../types';
|
|
3
|
+
export declare class ConfirmPrompt extends Prompt<boolean, ConfirmOptions> {
|
|
4
|
+
constructor(options: ConfirmOptions);
|
|
5
|
+
protected render(_firstRender: boolean): void;
|
|
6
|
+
protected handleInput(char: string): void;
|
|
7
|
+
protected handleMouse(event: MouseEvent): void;
|
|
8
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"ConfirmPrompt",{enumerable:true,get:function(){return ConfirmPrompt}});const _ansi=require("../ansi");const _base=require("../base");const _theme=require("../theme");let ConfirmPrompt=class ConfirmPrompt extends _base.Prompt{render(_firstRender){const hint=this.value?`${_ansi.ANSI.BOLD}Yes${_ansi.ANSI.RESET}/no`:`yes/${_ansi.ANSI.BOLD}No${_ansi.ANSI.RESET}`;let output=`${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} ${_theme.theme.muted}(${hint})${_ansi.ANSI.RESET} `;const text=this.value?"Yes":"No";output+=`${_theme.theme.main}${text}${_ansi.ANSI.RESET}`;this.renderFrame(output)}handleInput(char){const c=char.toLowerCase();if(c==="\r"||c==="\n"){this.submit(this.value);return}if(c==="y"){this.value=true;this.render(false)}if(c==="n"){this.value=false;this.render(false)}if(this.isLeft(char)||this.isRight(char)){this.value=!this.value;this.render(false)}}handleMouse(event){if(event.action==="scroll"){this.value=!this.value;this.render(false)}}constructor(options){super(options);this.value=options.initial??true}};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface ConnectionStringOptions {
|
|
2
|
+
message: string;
|
|
3
|
+
protocols?: string[];
|
|
4
|
+
defaults?: Record<string, number>;
|
|
5
|
+
}
|
|
6
|
+
export interface ConnectionStringResult {
|
|
7
|
+
raw: string;
|
|
8
|
+
parts: {
|
|
9
|
+
protocol: string;
|
|
10
|
+
host?: string;
|
|
11
|
+
port?: number;
|
|
12
|
+
user?: string;
|
|
13
|
+
password?: string;
|
|
14
|
+
database?: string;
|
|
15
|
+
filePath?: string;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export declare function connectionString(options: ConnectionStringOptions): Promise<ConnectionStringResult>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"connectionString",{enumerable:true,get:function(){return connectionString}});const _select=require("./select");const _text=require("./text");const _number=require("./number");const _confirm=require("./confirm");const _file=require("./file");const DEFAULT_PROTOCOLS=["postgres","mysql","mongodb","redis","amqp","sqlite"];const DEFAULT_PORTS={postgres:5432,mysql:3306,mongodb:27017,redis:6379,amqp:5672};async function connectionString(options){const protocols=options.protocols||DEFAULT_PROTOCOLS;const defaults={...DEFAULT_PORTS,...options.defaults};const protocol=await new _select.SelectPrompt({message:options.message,choices:protocols.map(p=>({title:p,value:p}))}).run();const parts={protocol};let raw="";if(protocol==="sqlite"){const filePath=await new _file.FilePrompt({message:"Database file path"}).run();parts.filePath=filePath;raw=`sqlite://${filePath}`}else{const host=await new _text.TextPrompt({message:"Host",initial:"localhost",placeholder:"localhost"}).run();parts.host=host;const defaultPort=defaults[protocol];const port=await new _number.NumberPrompt({message:"Port",initial:defaultPort}).run();parts.port=port;const hasAuth=await new _confirm.ConfirmPrompt({message:"Authentication required?",initial:true}).run();if(hasAuth){const user=await new _text.TextPrompt({message:"Username",initial:"root"}).run();parts.user=user;const password=await new _text.TextPrompt({message:"Password",mask:"*"}).run();parts.password=password}const database=await new _text.TextPrompt({message:"Database name"}).run();parts.database=database;try{const u=new URL(`${protocol}://${host}:${port}/${database}`);if(parts.user)u.username=parts.user;if(parts.password)u.password=parts.password;raw=u.toString()}catch(_e){const userEncoded=parts.user?encodeURIComponent(parts.user):"";const passEncoded=parts.password?encodeURIComponent(parts.password):"";let authPart="";if(userEncoded||passEncoded){authPart=`${userEncoded}:${passEncoded}@`}raw=`${protocol}://${authPart}${host}:${port}/${parts.database}`}}return{raw,parts}}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Prompt } from '../base';
|
|
2
|
+
import { CronOptions, MouseEvent } from '../types';
|
|
3
|
+
export declare class CronPrompt extends Prompt<string, CronOptions> {
|
|
4
|
+
private fields;
|
|
5
|
+
private activeField;
|
|
6
|
+
private buffer;
|
|
7
|
+
constructor(options: CronOptions);
|
|
8
|
+
private get currentConfig();
|
|
9
|
+
protected render(_firstRender: boolean): void;
|
|
10
|
+
private validateCurrentField;
|
|
11
|
+
protected handleInput(char: string): void;
|
|
12
|
+
protected handleMouse(event: MouseEvent): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"CronPrompt",{enumerable:true,get:function(){return CronPrompt}});const _ansi=require("../ansi");const _base=require("../base");const _theme=require("../theme");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}const FIELDS=[{label:"Minute",min:0,max:59},{label:"Hour",min:0,max:23},{label:"Day",min:1,max:31},{label:"Month",min:1,max:12},{label:"Weekday",min:0,max:6}];let CronPrompt=class CronPrompt extends _base.Prompt{get currentConfig(){return FIELDS[this.activeField]}render(_firstRender){let output=`${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}
|
|
2
|
+
`;let fieldsStr="";this.fields.forEach((val,index)=>{const isSelected=index===this.activeField;const displayVal=val.padStart(2," ");if(isSelected){fieldsStr+=`${_theme.theme.main}${_ansi.ANSI.UNDERLINE}${displayVal}${_ansi.ANSI.RESET} `}else{fieldsStr+=`${_ansi.ANSI.DIM}${displayVal}${_ansi.ANSI.RESET} `}});output+=` ${fieldsStr}
|
|
3
|
+
`;const config=this.currentConfig;output+=` ${_theme.theme.muted}${config.label} (${config.min}-${config.max})${_ansi.ANSI.RESET}
|
|
4
|
+
`;output+=` ${_ansi.ANSI.DIM}(Arrows: Adjust | Space: Toggle * | 0-9: Type | Tab: Next)${_ansi.ANSI.RESET}`;this.renderFrame(output)}validateCurrentField(){const config=this.currentConfig;const val=this.fields[this.activeField];if(val==="*")return;let num=parseInt(val);if(isNaN(num)){this.fields[this.activeField]=config.min.toString()}else{num=Math.max(config.min,Math.min(num,config.max));this.fields[this.activeField]=num.toString()}}handleInput(char){if(char==="\r"||char==="\n"){this.validateCurrentField();this.submit(this.fields.join(" "));return}if(char===" "||this.isRight(char)){this.validateCurrentField();this.activeField=(this.activeField+1)%5;this.buffer="";this.render(false);return}if(char==="\x1b[Z"||this.isLeft(char)){this.validateCurrentField();this.activeField=(this.activeField-1+5)%5;this.buffer="";this.render(false);return}const config=this.currentConfig;const currentVal=this.fields[this.activeField];let numVal=parseInt(currentVal);if(this.isUp(char)){if(currentVal==="*"){this.fields[this.activeField]=config.min.toString()}else if(!isNaN(numVal)){numVal++;if(numVal>config.max)numVal=config.min;this.fields[this.activeField]=numVal.toString()}this.buffer="";this.render(false);return}if(this.isDown(char)){if(currentVal==="*"){this.fields[this.activeField]=config.max.toString()}else if(!isNaN(numVal)){numVal--;if(numVal<config.min)numVal=config.max;this.fields[this.activeField]=numVal.toString()}this.buffer="";this.render(false);return}if(char===" "||char.toLowerCase()==="x"){this.fields[this.activeField]="*";this.buffer="";this.render(false);return}if(/^[0-9]$/.test(char)){const nextBuffer=this.buffer+char;const nextNum=parseInt(nextBuffer);if(!isNaN(nextNum)&&nextNum<=config.max){this.buffer=nextBuffer;if(nextNum>=0){this.fields[this.activeField]=nextNum.toString()}}else{const freshNum=parseInt(char);if(!isNaN(freshNum)&&freshNum<=config.max){this.buffer=char;this.fields[this.activeField]=freshNum.toString()}}this.render(false)}}handleMouse(event){if(event.action==="scroll"){const config=this.currentConfig;const currentVal=this.fields[this.activeField];let numVal=parseInt(currentVal);if(event.scroll==="up"){if(currentVal==="*"){this.fields[this.activeField]=config.min.toString()}else if(!isNaN(numVal)){numVal++;if(numVal>config.max)numVal=config.min;this.fields[this.activeField]=numVal.toString()}}else{if(currentVal==="*"){this.fields[this.activeField]=config.max.toString()}else if(!isNaN(numVal)){numVal--;if(numVal<config.min)numVal=config.max;this.fields[this.activeField]=numVal.toString()}}this.buffer="";this.render(false)}}constructor(options){super(options),_define_property(this,"fields",["*","*","*","*","*"]),_define_property(this,"activeField",0),_define_property(this,"buffer","");if(options.initial){const parts=options.initial.split(" ");if(parts.length===5){this.fields=parts}}}};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type ShellType = 'bash' | 'powershell' | 'cmd';
|
|
2
|
+
export interface ShellStrategy {
|
|
3
|
+
binary: string;
|
|
4
|
+
wrapper: string;
|
|
5
|
+
continuation: string;
|
|
6
|
+
escape(value: string): string;
|
|
7
|
+
}
|
|
8
|
+
export declare class BashStrategy implements ShellStrategy {
|
|
9
|
+
readonly binary = "curl";
|
|
10
|
+
readonly wrapper = "'";
|
|
11
|
+
readonly continuation = " \\";
|
|
12
|
+
escape(value: string): string;
|
|
13
|
+
}
|
|
14
|
+
export declare class PowerShellStrategy implements ShellStrategy {
|
|
15
|
+
readonly binary = "curl.exe";
|
|
16
|
+
readonly wrapper = "'";
|
|
17
|
+
readonly continuation = " `";
|
|
18
|
+
escape(value: string): string;
|
|
19
|
+
}
|
|
20
|
+
export declare class CmdStrategy implements ShellStrategy {
|
|
21
|
+
readonly binary = "curl";
|
|
22
|
+
readonly wrapper = "\"";
|
|
23
|
+
readonly continuation = " ^";
|
|
24
|
+
escape(value: string): string;
|
|
25
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get BashStrategy(){return BashStrategy},get CmdStrategy(){return CmdStrategy},get PowerShellStrategy(){return PowerShellStrategy}});function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let BashStrategy=class BashStrategy{escape(value){return`'${value.replace(/'/g,"'\\''")}'`}constructor(){_define_property(this,"binary","curl");_define_property(this,"wrapper","'");_define_property(this,"continuation"," \\")}};let PowerShellStrategy=class PowerShellStrategy{escape(value){return`'${value.replace(/'/g,"''")}'`}constructor(){_define_property(this,"binary","curl.exe");_define_property(this,"wrapper","'");_define_property(this,"continuation"," `")}};let CmdStrategy=class CmdStrategy{escape(value){const flattened=value.replace(/[\r\n]+/g," ");return`"${flattened.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}constructor(){_define_property(this,"binary","curl");_define_property(this,"wrapper",'"');_define_property(this,"continuation"," ^")}};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Prompt } from '../base';
|
|
2
|
+
export interface CurlOptions {
|
|
3
|
+
message: string;
|
|
4
|
+
defaultMethod?: string;
|
|
5
|
+
defaultUrl?: string;
|
|
6
|
+
defaultHeaders?: Record<string, string>;
|
|
7
|
+
defaultBody?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface CurlResult {
|
|
10
|
+
method: string;
|
|
11
|
+
url: string;
|
|
12
|
+
headers: Record<string, string>;
|
|
13
|
+
body?: string;
|
|
14
|
+
command: string;
|
|
15
|
+
}
|
|
16
|
+
export declare class CurlPrompt extends Prompt<CurlResult, CurlOptions> {
|
|
17
|
+
private section;
|
|
18
|
+
private methodIndex;
|
|
19
|
+
private urlSegments;
|
|
20
|
+
private urlCursor;
|
|
21
|
+
private headers;
|
|
22
|
+
private body;
|
|
23
|
+
private lastLinesUp;
|
|
24
|
+
private shell;
|
|
25
|
+
private strategies;
|
|
26
|
+
constructor(options: CurlOptions);
|
|
27
|
+
private get currentMethod();
|
|
28
|
+
private get hasBody();
|
|
29
|
+
private get url();
|
|
30
|
+
private cycleShell;
|
|
31
|
+
private generateCommand;
|
|
32
|
+
protected render(firstRender: boolean): void;
|
|
33
|
+
protected cleanup(): void;
|
|
34
|
+
protected handleInput(char: string, _buffer: Buffer): void;
|
|
35
|
+
private handleUrlInput;
|
|
36
|
+
private cycleSection;
|
|
37
|
+
private clear;
|
|
38
|
+
private editHeaders;
|
|
39
|
+
private editBody;
|
|
40
|
+
private submitResult;
|
|
41
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"CurlPrompt",{enumerable:true,get:function(){return CurlPrompt}});const _base=require("../base");const _ansi=require("../ansi");const _theme=require("../theme");const _symbols=require("../symbols");const _map=require("./map");const _code=require("./code");const _utils=require("../utils");const _curlutils=require("./curl-utils");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}var Section=/*#__PURE__*/function(Section){Section[Section["METHOD"]=0]="METHOD";Section[Section["URL"]=1]="URL";Section[Section["HEADERS"]=2]="HEADERS";Section[Section["BODY"]=3]="BODY";return Section}(Section||{});const METHODS=["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS"];const COMMON_HEADERS=["Accept","Accept-Encoding","Accept-Language","Authorization","Cache-Control","Connection","Content-Type","Cookie","Host","Origin","Pragma","Referer","User-Agent","X-Requested-With"];let CurlPrompt=class CurlPrompt extends _base.Prompt{get currentMethod(){return METHODS[this.methodIndex]}get hasBody(){return this.currentMethod!=="GET"&&this.currentMethod!=="HEAD"}get url(){return this.urlSegments.join("")}cycleShell(){const shells=["bash","powershell","cmd"];const currentIdx=shells.indexOf(this.shell);this.shell=shells[(currentIdx+1)%shells.length];this.render(false)}generateCommand(multiline=false){if(this.shell==="cmd"){multiline=false}const strategy=this.strategies[this.shell];const continuation=multiline?`${strategy.continuation}
|
|
2
|
+
`:" ";let cmd=`${strategy.binary} -X ${this.currentMethod}`;Object.entries(this.headers).forEach(([k,v])=>{cmd+=`${continuation}-H ${strategy.escape(`${k}: ${v}`)}`});if(this.hasBody&&this.body){const escapedBody=strategy.escape(this.body);cmd+=`${continuation}-d ${escapedBody}`}const urlStr=this.url;const displayUrl=urlStr||"http://localhost...";cmd+=`${continuation}${strategy.escape(displayUrl)}`;return cmd}render(firstRender){if(!firstRender&&this.lastLinesUp>0){this.print(`\x1b[${this.lastLinesUp}B`)}this.lastLinesUp=0;let output="";const shellLabel=`${_theme.theme.muted}[Shell: ${this.shell.toUpperCase()}]${_ansi.ANSI.RESET}`;output+=`${_theme.theme.success}? ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message} ${shellLabel}${_ansi.ANSI.RESET}
|
|
3
|
+
`;const methodLabel=this.section===0?`${_theme.theme.main}${_ansi.ANSI.REVERSE} ${this.currentMethod} ${_ansi.ANSI.RESET}`:`${_ansi.ANSI.BOLD}[${this.currentMethod}]${_ansi.ANSI.RESET}`;output+=`
|
|
4
|
+
${methodLabel}`;const urlActive=this.section===1;const urlPrefix=urlActive?`${_theme.theme.main}${_ansi.ANSI.BOLD} URL: ${_ansi.ANSI.RESET}`:` URL: `;let urlDisplay="";if(this.urlSegments.length===0&&urlActive){urlDisplay=""}else if(this.urlSegments.length===0&&!urlActive){urlDisplay=`${_theme.theme.muted}http://localhost:3000${_ansi.ANSI.RESET}`}else{urlDisplay=this.urlSegments.join("")}output+=`${urlPrefix}${urlDisplay}
|
|
5
|
+
`;const headersCount=Object.keys(this.headers).length;const headersActive=this.section===2;const headersPointer=headersActive?`${_theme.theme.main}${_symbols.symbols.pointer} `:" ";const headersStyle=headersActive?`${_theme.theme.main}${_ansi.ANSI.UNDERLINE}`:"";output+=`${headersPointer}${headersStyle}HEADERS${_ansi.ANSI.RESET} (${headersCount} defined)
|
|
6
|
+
`;if(this.hasBody){const bodyActive=this.section===3;const bodyPointer=bodyActive?`${_theme.theme.main}${_symbols.symbols.pointer} `:" ";const bodyStyle=bodyActive?`${_theme.theme.main}${_ansi.ANSI.UNDERLINE}`:"";let bodyPreview="";if(this.body){const oneLiner=this.body.replace(/\n/g," ").substring(0,40);bodyPreview=`${_theme.theme.muted} ${oneLiner}...${_ansi.ANSI.RESET}`}else{bodyPreview=`${_theme.theme.muted} (empty)${_ansi.ANSI.RESET}`}output+=`${bodyPointer}${bodyStyle}BODY${_ansi.ANSI.RESET}${bodyPreview}
|
|
7
|
+
`}else{output+=` ${_theme.theme.muted}BODY (Disabled for ${this.currentMethod})${_ansi.ANSI.RESET}
|
|
8
|
+
`}output+=`
|
|
9
|
+
${_ansi.ANSI.BOLD}Preview:${_ansi.ANSI.RESET}
|
|
10
|
+
`;const cmd=this.generateCommand(true);output+=`${_ansi.ANSI.FG_CYAN}${cmd}${_ansi.ANSI.RESET}
|
|
11
|
+
`;output+=`
|
|
12
|
+
${_theme.theme.muted}(Tab: Nav, 's': Shell, Space: Toggle Method, Enter: Edit/Submit)${_ansi.ANSI.RESET}`;this.renderFrame(output);if(this.section===1){const prefixLen=6;let urlLineIndex=-1;for(let i=0;i<this.lastRenderLines.length;i++){if(this.lastRenderLines[i].includes(" URL: ")){urlLineIndex=i;break}}if(urlLineIndex!==-1){const linesFromBottom=this.lastRenderLines.length-1-urlLineIndex;this.print(_ansi.ANSI.SHOW_CURSOR);if(linesFromBottom>0){this.print(`\x1b[${linesFromBottom}A`);this.lastLinesUp=linesFromBottom}let targetCol=prefixLen;for(let i=0;i<this.urlCursor;i++){targetCol+=(0,_utils.stringWidth)(this.urlSegments[i])}this.print(`\r\x1b[${targetCol}C`)}}else{this.print(_ansi.ANSI.HIDE_CURSOR)}}cleanup(){if(this.lastLinesUp>0){this.print(`\x1b[${this.lastLinesUp}B`);this.lastLinesUp=0}super.cleanup()}handleInput(char,_buffer){if(char==="s"&&this.section!==1){this.cycleShell();return}if(char===" "){this.cycleSection(1);this.render(false);return}if(char==="\x1b[Z"){this.cycleSection(-1);this.render(false);return}switch(this.section){case 0:if(char===" "||this.isRight(char)||this.isDown(char)){this.methodIndex=(this.methodIndex+1)%METHODS.length;this.render(false)}else if(this.isLeft(char)||this.isUp(char)){this.methodIndex=(this.methodIndex-1+METHODS.length)%METHODS.length;this.render(false)}else if(char==="\r"||char==="\n"){this.submitResult()}break;case 1:this.handleUrlInput(char);break;case 2:if(char==="\r"||char==="\n"){this.editHeaders()}break;case 3:if(char==="\r"||char==="\n"){this.editBody()}break}}handleUrlInput(char){if(char==="\r"||char==="\n"){this.submitResult();return}if(char==="\x1b[H"||char==="\x1bOH"||char==="\x1b[1~"){this.urlCursor=0;this.render(false);return}if(char==="\x1b[F"||char==="\x1bOF"||char==="\x1b[4~"){this.urlCursor=this.urlSegments.length;this.render(false);return}if(char==="\x15"){if(this.urlCursor>0){this.urlSegments.splice(0,this.urlCursor);this.urlCursor=0;this.render(false)}return}if(char==="\x17"){if(this.urlCursor>0){let i=this.urlCursor-1;while(i>=0&&this.urlSegments[i]===" ")i--;while(i>=0&&this.urlSegments[i]!==" ")i--;const deleteCount=this.urlCursor-(i+1);this.urlSegments.splice(i+1,deleteCount);this.urlCursor=i+1;this.render(false)}return}if(char==="\b"||char===""){if(this.urlCursor>0){this.urlSegments.splice(this.urlCursor-1,1);this.urlCursor--;this.render(false)}return}if(char==="\x1b[3~"){if(this.urlCursor<this.urlSegments.length){this.urlSegments.splice(this.urlCursor,1);this.render(false)}return}if(this.isLeft(char)){if(this.urlCursor>0){this.urlCursor--;this.render(false)}return}if(this.isRight(char)){if(this.urlCursor<this.urlSegments.length){this.urlCursor++;this.render(false)}return}if(!/^[\x00-\x1F]/.test(char)&&!char.startsWith("\x1b")){const newSegments=(0,_utils.safeSplit)(char);this.urlSegments.splice(this.urlCursor,0,...newSegments);this.urlCursor+=newSegments.length;this.render(false)}}cycleSection(direction){let next=this.section+direction;if(next>3)next=0;if(next<0)next=3;if(next===3&&!this.hasBody){next=direction===1?0:2}this.section=next}clear(){if(this.lastLinesUp>0){this.print(`\x1b[${this.lastLinesUp}B`);this.lastLinesUp=0}if(this.lastRenderHeight>0){this.print(`\x1b[${this.lastRenderHeight-1}A`);this.print("\r");this.print(_ansi.ANSI.ERASE_DOWN);this.lastRenderLines=[];this.lastRenderHeight=0}}async editHeaders(){this.clear();this.pauseInput();try{const result=await new _map.MapPrompt({message:"Edit Headers",initial:this.headers,suggestions:COMMON_HEADERS}).run();this.headers=result}catch(_e){}this.resumeInput();this.render(true)}async editBody(){this.clear();this.pauseInput();try{const result=await new _code.CodePrompt({message:"Edit Body (JSON)",template:"${json}",highlight:true,values:this.body?{json:this.body}:undefined}).run();this.body=result}catch(_e){}this.resumeInput();this.render(true)}submitResult(){this.submit({method:this.currentMethod,url:this.url,headers:this.headers,body:this.hasBody?this.body:undefined,command:this.generateCommand(false)})}constructor(options){super(options),_define_property(this,"section",0),_define_property(this,"methodIndex",0),_define_property(this,"urlSegments",[]),_define_property(this,"urlCursor",0),_define_property(this,"headers",{}),_define_property(this,"body",""),_define_property(this,"lastLinesUp",0),_define_property(this,"shell","bash"),_define_property(this,"strategies",{bash:new _curlutils.BashStrategy,powershell:new _curlutils.PowerShellStrategy,cmd:new _curlutils.CmdStrategy});if(process.platform==="win32"){this.shell="powershell"}if(options.defaultMethod){const idx=METHODS.indexOf(options.defaultMethod.toUpperCase());if(idx>=0)this.methodIndex=idx}const initialUrl=options.defaultUrl||"";this.urlSegments=(0,_utils.safeSplit)(initialUrl);this.urlCursor=this.urlSegments.length;this.headers={...options.defaultHeaders};this.body=options.defaultBody||"";if(this.methodIndex===0){this.section=1}}};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Prompt } from '../base';
|
|
2
|
+
import { DataInspectorOptions, MouseEvent } from '../types';
|
|
3
|
+
export declare class DataInspectorPrompt extends Prompt<any, DataInspectorOptions> {
|
|
4
|
+
private cursor;
|
|
5
|
+
private flatList;
|
|
6
|
+
private expandedPaths;
|
|
7
|
+
private scrollTop;
|
|
8
|
+
private readonly pageSize;
|
|
9
|
+
private editMode;
|
|
10
|
+
private editBuffer;
|
|
11
|
+
private rootData;
|
|
12
|
+
constructor(options: DataInspectorOptions);
|
|
13
|
+
private getType;
|
|
14
|
+
private recalculateFlatList;
|
|
15
|
+
private traverse;
|
|
16
|
+
private getValueColor;
|
|
17
|
+
private formatValue;
|
|
18
|
+
protected render(_firstRender: boolean): void;
|
|
19
|
+
protected handleInput(char: string, key: Buffer): void;
|
|
20
|
+
private handleEditInput;
|
|
21
|
+
protected handleMouse(event: MouseEvent): void;
|
|
22
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"DataInspectorPrompt",{enumerable:true,get:function(){return DataInspectorPrompt}});const _ansi=require("../ansi");const _base=require("../base");const _theme=require("../theme");const _utils=require("../utils");const _symbols=require("../symbols");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let DataInspectorPrompt=class DataInspectorPrompt extends _base.Prompt{getType(value){if(value===null)return"null";if(value===undefined)return"undefined";if(Array.isArray(value))return"array";if(value instanceof Date)return"date";return typeof value}recalculateFlatList(){this.flatList=[];this.traverse(this.rootData,"root",0,null,"root")}traverse(data,key,depth,parentRef,currentPath){const type=this.getType(data);const isLeaf=!["object","array"].includes(type)||data===null;const node={key:String(key),value:data,type,depth,path:currentPath,parentRef,refKey:key,isLeaf};this.flatList.push(node);if(!isLeaf&&this.expandedPaths.has(currentPath)){const keys=Object.keys(data);keys.forEach(k=>{this.traverse(data[k],k,depth+1,data,`${currentPath}.${k}`)})}}getValueColor(type){switch(type){case"string":return _ansi.ANSI.FG_GREEN;case"number":return _ansi.ANSI.FG_YELLOW;case"boolean":return _ansi.ANSI.FG_MAGENTA;case"null":case"undefined":return _ansi.ANSI.FG_GRAY;case"date":return _ansi.ANSI.FG_BLUE;default:return _ansi.ANSI.RESET}}formatValue(value,type){if(type==="string")return`"${value}"`;if(type==="date")return value.toISOString();if(type==="array")return`Array(${value.length})`;if(type==="object")return`Object{${Object.keys(value).length}}`;return String(value)}render(_firstRender){let output=`${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}
|
|
2
|
+
`;if(this.cursor<this.scrollTop){this.scrollTop=this.cursor}else if(this.cursor>=this.scrollTop+this.pageSize){this.scrollTop=this.cursor-this.pageSize+1}const visible=this.flatList.slice(this.scrollTop,this.scrollTop+this.pageSize);visible.forEach((node,index)=>{const actualIndex=this.scrollTop+index;const isSelected=actualIndex===this.cursor;const indent=" ".repeat(node.depth);const prefix=isSelected?`${_theme.theme.main}${_symbols.symbols.pointer} `:" ";let icon="";if(!node.isLeaf){icon=this.expandedPaths.has(node.path)?"▾ ":"▸ "}else{icon="• "}let keyStr=node.key;if(node.path==="root")keyStr="ROOT";let valueStr="";if(isSelected&&this.editMode){valueStr=`${_ansi.ANSI.BG_BLUE}${_ansi.ANSI.FG_WHITE} ${this.editBuffer}_ ${_ansi.ANSI.RESET}`}else{const color=this.getValueColor(node.type);const formatted=this.formatValue(node.value,node.type);valueStr=`${color}${formatted}${_ansi.ANSI.RESET}`}const typeLabel=`${_ansi.ANSI.FG_GRAY}(${node.type})${_ansi.ANSI.RESET}`;let line=`${indent}${icon}${_ansi.ANSI.BOLD}${keyStr}${_ansi.ANSI.RESET}: ${valueStr} ${typeLabel}`;if(isSelected&&!this.editMode){line=`${_theme.theme.main}${(0,_utils.stripAnsi)(line)}${_ansi.ANSI.RESET}`}else if(isSelected&&this.editMode){line=`${indent}${icon}${_ansi.ANSI.BOLD}${keyStr}${_ansi.ANSI.RESET}: ${valueStr} ${typeLabel}`}output+=`${prefix}${line}
|
|
3
|
+
`});if(this.editMode){output+=`
|
|
4
|
+
${_theme.theme.main}EDIT MODE${_ansi.ANSI.RESET} Enter: Save, Esc: Cancel`}else{output+=`
|
|
5
|
+
${_theme.theme.muted}(Arrows: Nav, Space: Toggle, Enter: Edit/Submit)${_ansi.ANSI.RESET}`}this.renderFrame(output)}handleInput(char,key){if(this.editMode){this.handleEditInput(char,key);return}const node=this.flatList[this.cursor];if(this.isUp(char)){this.cursor=(this.cursor-1+this.flatList.length)%this.flatList.length;this.render(false);return}if(this.isDown(char)){this.cursor=(this.cursor+1)%this.flatList.length;this.render(false);return}if(char===" "||this.isRight(char)||this.isLeft(char)){if(!node.isLeaf){const isExpanded=this.expandedPaths.has(node.path);if(this.isRight(char)&&!isExpanded){this.expandedPaths.add(node.path)}else if(this.isLeft(char)&&isExpanded){this.expandedPaths.delete(node.path)}else if(char===" "){if(isExpanded)this.expandedPaths.delete(node.path);else this.expandedPaths.add(node.path)}else if(this.isLeft(char)&&!isExpanded&&node.parentRef){}this.recalculateFlatList();this.render(false)}return}if(char==="\r"||char==="\n"){if(node.path==="root"){this.submit(this.rootData);return}if(node.type==="boolean"){const newVal=!node.value;node.parentRef[node.refKey]=newVal;this.recalculateFlatList();this.render(false);return}if(["string","number"].includes(node.type)){this.editMode=true;this.editBuffer=String(node.value);this.render(false);return}this.submit(this.rootData)}}handleEditInput(char,key){const node=this.flatList[this.cursor];if(char==="\r"||char==="\n"){let newValue=this.editBuffer;if(node.type==="number"){newValue=Number(this.editBuffer);if(isNaN(newValue))newValue=0}node.parentRef[node.refKey]=newValue;this.editMode=false;this.recalculateFlatList();this.render(false);return}if(key[0]===27&&key.length===1){this.editMode=false;this.render(false);return}if(key.toString()===""||char==="\b"){this.editBuffer=this.editBuffer.slice(0,-1);this.render(false);return}if(char&&char.length===1&&char.charCodeAt(0)>=32){this.editBuffer+=char;this.render(false)}}handleMouse(event){if(this.editMode)return;if(event.action==="scroll"){if(event.scroll==="up"){this.cursor=(this.cursor-1+this.flatList.length)%this.flatList.length}else if(event.scroll==="down"){this.cursor=(this.cursor+1)%this.flatList.length}this.render(false)}}constructor(options){super(options),_define_property(this,"cursor",0),_define_property(this,"flatList",[]),_define_property(this,"expandedPaths",new Set),_define_property(this,"scrollTop",0),_define_property(this,"pageSize",15),_define_property(this,"editMode",false),_define_property(this,"editBuffer",""),_define_property(this,"rootData",void 0);this.rootData=options.data;this.expandedPaths.add("root");this.recalculateFlatList()}};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Prompt } from '../base';
|
|
2
|
+
import { DateOptions, MouseEvent } from '../types';
|
|
3
|
+
export declare class DatePrompt extends Prompt<Date, DateOptions> {
|
|
4
|
+
private selectedField;
|
|
5
|
+
private errorMsg;
|
|
6
|
+
private inputBuffer;
|
|
7
|
+
constructor(options: DateOptions);
|
|
8
|
+
protected render(_firstRender: boolean): void;
|
|
9
|
+
protected handleInput(char: string): void;
|
|
10
|
+
protected handleMouse(event: MouseEvent): void;
|
|
11
|
+
private adjustDate;
|
|
12
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"DatePrompt",{enumerable:true,get:function(){return DatePrompt}});const _ansi=require("../ansi");const _base=require("../base");const _theme=require("../theme");const _symbols=require("../symbols");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let DatePrompt=class DatePrompt extends _base.Prompt{render(_firstRender){const y=this.value.getFullYear();const m=(this.value.getMonth()+1).toString().padStart(2,"0");const d=this.value.getDate().toString().padStart(2,"0");const h=this.value.getHours().toString().padStart(2,"0");const min=this.value.getMinutes().toString().padStart(2,"0");const fields=[y,m,d,h,min];const display=fields.map((val,i)=>{if(i===this.selectedField)return`${_theme.theme.main}${_ansi.ANSI.UNDERLINE}${val}${_ansi.ANSI.RESET}`;return val});const icon=this.errorMsg?`${_theme.theme.error}${_symbols.symbols.cross}`:`${_theme.theme.success}?`;const dateStr=`${display[0]}-${display[1]}-${display[2]} ${display[3]}:${display[4]}`;let output=`${icon} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} ${dateStr} ${_theme.theme.muted}(Use arrows or type)${_ansi.ANSI.RESET}`;if(this.errorMsg){output+=`
|
|
2
|
+
${_theme.theme.error}>> ${this.errorMsg}${_ansi.ANSI.RESET}`}this.renderFrame(output)}handleInput(char){if(char==="\r"||char==="\n"){if(this.options.min&&this.value<this.options.min){this.errorMsg="Date cannot be before minimum allowed.";this.render(false);return}if(this.options.max&&this.value>this.options.max){this.errorMsg="Date cannot be after maximum allowed.";this.render(false);return}this.submit(this.value);return}if(char===" "||this.isRight(char)){if(char===" "){this.selectedField=(this.selectedField+1)%5}else{this.selectedField=Math.min(4,this.selectedField+1)}this.inputBuffer="";this.errorMsg="";this.render(false);return}if(char==="\x1b[Z"||this.isLeft(char)){if(char==="\x1b[Z"){this.selectedField=(this.selectedField-1+5)%5}else{this.selectedField=Math.max(0,this.selectedField-1)}this.inputBuffer="";this.errorMsg="";this.render(false);return}if(/^\d$/.test(char)){const maxLen=this.selectedField===0?4:2;let nextBuffer=this.inputBuffer+char;if(nextBuffer.length>maxLen){nextBuffer=char}const val=parseInt(nextBuffer,10);let valid=true;if(this.selectedField===1&&(val<1||val>12))valid=false;if(this.selectedField===2&&(val<1||val>31))valid=false;if(this.selectedField===3&&val>23)valid=false;if(this.selectedField===4&&val>59)valid=false;if(!valid){nextBuffer=char}this.inputBuffer=nextBuffer;const finalVal=parseInt(this.inputBuffer,10);const d=new Date(this.value);if(this.selectedField===0){d.setFullYear(finalVal)}else if(this.selectedField===1)d.setMonth(Math.max(0,Math.min(11,finalVal-1)));else if(this.selectedField===2)d.setDate(Math.max(1,Math.min(31,finalVal)));else if(this.selectedField===3)d.setHours(Math.max(0,Math.min(23,finalVal)));else if(this.selectedField===4)d.setMinutes(Math.max(0,Math.min(59,finalVal)));this.value=d;if(this.options.min&&this.value<this.options.min){this.errorMsg="Warning: Date is before minimum."}else if(this.options.max&&this.value>this.options.max){this.errorMsg="Warning: Date is after maximum."}else{this.errorMsg=""}this.render(false);return}const isUp=this.isUp(char);const isDown=this.isDown(char);if(isUp||isDown){this.inputBuffer="";const dir=isUp?1:-1;this.adjustDate(dir)}}handleMouse(event){if(event.action==="scroll"){if(event.scroll==="up"){this.adjustDate(1)}else if(event.scroll==="down"){this.adjustDate(-1)}}}adjustDate(dir){const d=new Date(this.value);switch(this.selectedField){case 0:d.setFullYear(d.getFullYear()+dir);break;case 1:d.setMonth(d.getMonth()+dir);break;case 2:d.setDate(d.getDate()+dir);break;case 3:d.setHours(d.getHours()+dir);break;case 4:d.setMinutes(d.getMinutes()+dir);break}this.value=d;if(this.options.min&&this.value<this.options.min){this.errorMsg="Date cannot be before minimum allowed."}else if(this.options.max&&this.value>this.options.max){this.errorMsg="Date cannot be after maximum allowed."}else{this.errorMsg=""}this.render(false)}constructor(options){super(options),_define_property(this,"selectedField",0),_define_property(this,"errorMsg",""),_define_property(this,"inputBuffer","");this.value=options.initial||new Date}};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Prompt } from '../base';
|
|
2
|
+
import { DependencyOptions, MouseEvent } from '../types';
|
|
3
|
+
export declare class DependencyPrompt<V> extends Prompt<V[], DependencyOptions<V>> {
|
|
4
|
+
private selectedIndex;
|
|
5
|
+
private checkedState;
|
|
6
|
+
private errorMsg;
|
|
7
|
+
private warningMsg;
|
|
8
|
+
private scrollTop;
|
|
9
|
+
private readonly pageSize;
|
|
10
|
+
constructor(options: DependencyOptions<V>);
|
|
11
|
+
private resolveDependencies;
|
|
12
|
+
protected render(_firstRender: boolean): void;
|
|
13
|
+
protected handleMouse(event: MouseEvent): void;
|
|
14
|
+
protected handleInput(char: string): void;
|
|
15
|
+
private validateDependencies;
|
|
16
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"DependencyPrompt",{enumerable:true,get:function(){return DependencyPrompt}});const _ansi=require("../ansi");const _base=require("../base");const _theme=require("../theme");const _symbols=require("../symbols");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let DependencyPrompt=class DependencyPrompt extends _base.Prompt{resolveDependencies(index,value){if(this.options.autoResolve===false)return;const choices=this.options.choices;const visited=new Set;const queue=[];queue.push({idx:index,val:value});let loops=0;while(queue.length>0&&loops<1e3){loops++;const current=queue.shift();if(visited.has(current.idx))continue;if(this.checkedState[current.idx]!==current.val){this.checkedState[current.idx]=current.val;if(current.reason){this.warningMsg=current.reason}}visited.add(current.idx);const currentItem=choices[current.idx];if(current.val){if(currentItem.conflictsWith){currentItem.conflictsWith.forEach(conflictVal=>{const conflictIdx=choices.findIndex(c=>c.value===conflictVal);if(conflictIdx!==-1&&this.checkedState[conflictIdx]){queue.push({idx:conflictIdx,val:false,reason:`Disabled ${choices[conflictIdx].title} due to conflict with ${currentItem.title}`})}})}choices.forEach((other,otherIdx)=>{if(otherIdx===current.idx||!this.checkedState[otherIdx])return;if(other.conflictsWith&&other.conflictsWith.includes(currentItem.value)){queue.push({idx:otherIdx,val:false,reason:`Disabled ${other.title} because it conflicts with ${currentItem.title}`})}});if(currentItem.dependsOn){currentItem.dependsOn.forEach(depVal=>{const depIdx=choices.findIndex(c=>c.value===depVal);if(depIdx!==-1&&!this.checkedState[depIdx]){queue.push({idx:depIdx,val:true,reason:`Enabled ${choices[depIdx].title} because ${currentItem.title} requires it`})}})}if(currentItem.triggers){currentItem.triggers.forEach(trigVal=>{const trigIdx=choices.findIndex(c=>c.value===trigVal);if(trigIdx!==-1&&!this.checkedState[trigIdx]){queue.push({idx:trigIdx,val:true,reason:`Triggered ${choices[trigIdx].title} from ${currentItem.title}`})}})}}else{choices.forEach((other,otherIdx)=>{if(this.checkedState[otherIdx]&&other.dependsOn&&other.dependsOn.includes(currentItem.value)){queue.push({idx:otherIdx,val:false,reason:`Disabled ${other.title} because it depends on ${currentItem.title}`})}})}}}render(_firstRender){if(this.selectedIndex<this.scrollTop){this.scrollTop=this.selectedIndex}else if(this.selectedIndex>=this.scrollTop+this.pageSize){this.scrollTop=this.selectedIndex-this.pageSize+1}if(this.options.choices.length<=this.pageSize){this.scrollTop=0}let output="";const icon=this.errorMsg?`${_theme.theme.error}${_symbols.symbols.cross}`:`${_theme.theme.success}?`;output+=`${icon} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} ${_theme.theme.muted}(Space: toggle, Enter: submit)${_ansi.ANSI.RESET}`;const choices=this.options.choices;const visibleChoices=choices.slice(this.scrollTop,this.scrollTop+this.pageSize);visibleChoices.forEach((choice,index)=>{const actualIndex=this.scrollTop+index;output+="\n";const cursor=actualIndex===this.selectedIndex?`${_theme.theme.main}${_symbols.symbols.pointer}${_ansi.ANSI.RESET}`:" ";const isChecked=this.checkedState[actualIndex];const checkbox=isChecked?`${_theme.theme.success}${_symbols.symbols.checked}${_ansi.ANSI.RESET}`:`${_theme.theme.muted}${_symbols.symbols.unchecked}${_ansi.ANSI.RESET}`;let title=actualIndex===this.selectedIndex?`${_theme.theme.main}${choice.title}${_ansi.ANSI.RESET}`:choice.title;if(choice.dependsOn&&choice.dependsOn.length>0){title+=` ${_theme.theme.muted}[Req: ${choice.dependsOn.length}]${_ansi.ANSI.RESET}`}if(choice.conflictsWith&&choice.conflictsWith.length>0){title+=` ${_theme.theme.error}[Con: ${choice.conflictsWith.length}]${_ansi.ANSI.RESET}`}output+=`${cursor} ${checkbox} ${title}`});if(this.errorMsg){output+=`
|
|
2
|
+
${_theme.theme.error}>> ${this.errorMsg}${_ansi.ANSI.RESET}`}else if(this.warningMsg){output+=`
|
|
3
|
+
${_theme.theme.main}>> ${this.warningMsg}${_ansi.ANSI.RESET}`}this.renderFrame(output)}handleMouse(event){if(event.action==="scroll"){if(event.scroll==="up"){this.selectedIndex=this.selectedIndex>0?this.selectedIndex-1:this.options.choices.length-1;this.render(false)}else if(event.scroll==="down"){this.selectedIndex=this.selectedIndex<this.options.choices.length-1?this.selectedIndex+1:0;this.render(false)}}}handleInput(char){if(char==="\r"||char==="\n"){const selectedCount=this.checkedState.filter(Boolean).length;const{min=0,max}=this.options;if(selectedCount<min){this.errorMsg=`You must select at least ${min} options.`;this.render(false);return}if(max&&selectedCount>max){this.errorMsg=`You can only select up to ${max} options.`;this.render(false);return}if(this.options.autoResolve===false){const invalid=this.validateDependencies();if(invalid){this.errorMsg=invalid;this.render(false);return}}this.cleanup();const results=this.options.choices.filter((_,i)=>this.checkedState[i]).map(c=>c.value);this.submit(results);return}if(char===" "){const currentChecked=this.checkedState[this.selectedIndex];const newState=!currentChecked;if(newState){const selectedCount=this.checkedState.filter(Boolean).length;const{max}=this.options;if(max&&selectedCount>=max){this.errorMsg=`Max ${max} selections allowed.`;this.render(false);return}}this.errorMsg="";this.warningMsg="";if(this.options.autoResolve!==false){this.resolveDependencies(this.selectedIndex,newState)}else{this.checkedState[this.selectedIndex]=newState}this.render(false)}if(this.isUp(char)){this.selectedIndex=this.selectedIndex>0?this.selectedIndex-1:this.options.choices.length-1;this.render(false)}if(this.isDown(char)){this.selectedIndex=this.selectedIndex<this.options.choices.length-1?this.selectedIndex+1:0;this.render(false)}}validateDependencies(){const choices=this.options.choices;for(let i=0;i<choices.length;i++){if(!this.checkedState[i])continue;const item=choices[i];if(item.dependsOn){for(const depVal of item.dependsOn){const depIdx=choices.findIndex(c=>c.value===depVal);if(depIdx===-1||!this.checkedState[depIdx]){return`${item.title} requires ${depVal}`}}}if(item.conflictsWith){for(const conVal of item.conflictsWith){const conIdx=choices.findIndex(c=>c.value===conVal);if(conIdx!==-1&&this.checkedState[conIdx]){return`${item.title} conflicts with ${choices[conIdx].title}`}}}}return null}constructor(options){super(options),_define_property(this,"selectedIndex",0),_define_property(this,"checkedState",void 0),_define_property(this,"errorMsg",""),_define_property(this,"warningMsg",""),_define_property(this,"scrollTop",0),_define_property(this,"pageSize",10);this.checkedState=options.choices.map(c=>!!c.selected);if(options.autoResolve!==false){this.checkedState.forEach((isChecked,i)=>{if(isChecked){this.resolveDependencies(i,true)}})}}};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Prompt } from '../base';
|
|
2
|
+
import { DialOptions, MouseEvent } from '../types';
|
|
3
|
+
export declare class DialPrompt extends Prompt<number, DialOptions> {
|
|
4
|
+
private currentValue;
|
|
5
|
+
constructor(options: DialOptions);
|
|
6
|
+
protected render(_firstRender: boolean): void;
|
|
7
|
+
protected handleInput(char: string, _key: Buffer): void;
|
|
8
|
+
protected handleMouse(event: MouseEvent): void;
|
|
9
|
+
private updateValue;
|
|
10
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"DialPrompt",{enumerable:true,get:function(){return DialPrompt}});const _base=require("../base");const _theme=require("../theme");const _ansi=require("../ansi");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let DialPrompt=class DialPrompt extends _base.Prompt{render(_firstRender){const displayValue=Math.round(this.currentValue*100)/100;let output=`${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} ${_theme.theme.main}${displayValue}${_ansi.ANSI.RESET}
|
|
2
|
+
`;const radius=this.options.radius||5;const centerX=radius*2;const centerY=radius;const width=centerX*2+1;const height=centerY*2+1;const grid=[];for(let y=0;y<height;y++){const row=[];for(let x=0;x<width;x++){row.push(" ")}grid.push(row)}for(let a=135;a<=405;a+=10){const rad=a*Math.PI/180;const rX=Math.round(centerX+radius*Math.cos(rad)*2);const rY=Math.round(centerY+radius*Math.sin(rad));if(rY>=0&&rY<height&&rX>=0&&rX<width){grid[rY][rX]=`${_ansi.ANSI.FG_GRAY}\xb7${_ansi.ANSI.RESET}`}}const totalRange=this.options.max-this.options.min;const percent=totalRange===0?0:(this.currentValue-this.options.min)/totalRange;const angleDeg=135+percent*270;const rad=angleDeg*Math.PI/180;const ptrX=Math.round(centerX+radius*Math.cos(rad)*2);const ptrY=Math.round(centerY+radius*Math.sin(rad));if(ptrY>=0&&ptrY<height&&ptrX>=0&&ptrX<width){grid[ptrY][ptrX]=`${_theme.theme.main}${this.options.pointerSymbol||"●"}${_ansi.ANSI.RESET}`}for(let y=0;y<height;y++){output+=" "+grid[y].join("")+"\n"}output+=`
|
|
3
|
+
${_ansi.ANSI.FG_GRAY}(Arrows/Scroll to adjust, Enter to submit)${_ansi.ANSI.RESET}`;this.renderFrame(output)}handleInput(char,_key){const step=this.options.step||1;if(this.isLeft(char)||this.isDown(char)){this.updateValue(this.currentValue-step)}else if(this.isRight(char)||this.isUp(char)){this.updateValue(this.currentValue+step)}else if(char==="\r"||char==="\n"){this.submit(this.currentValue)}}handleMouse(event){const step=this.options.step||1;if(event.action==="scroll"){if(event.scroll==="up"){this.updateValue(this.currentValue+step)}else{this.updateValue(this.currentValue-step)}}}updateValue(val){if(val<this.options.min)val=this.options.min;if(val>this.options.max)val=this.options.max;if(this.currentValue!==val){this.currentValue=val;this.render(false)}}constructor(options){super(options),_define_property(this,"currentValue",void 0);this.currentValue=options.initial!==undefined?options.initial:options.min;if(this.currentValue<this.options.min)this.currentValue=this.options.min;if(this.currentValue>this.options.max)this.currentValue=this.options.max}};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Prompt } from '../base';
|
|
2
|
+
import { DiffOptions } from '../types';
|
|
3
|
+
export declare class DiffPrompt extends Prompt<string, DiffOptions> {
|
|
4
|
+
private activeAction;
|
|
5
|
+
private actions;
|
|
6
|
+
constructor(options: DiffOptions);
|
|
7
|
+
protected render(_firstRender: boolean): void;
|
|
8
|
+
protected handleInput(char: string, _key: Buffer): void;
|
|
9
|
+
private handleSubmit;
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"DiffPrompt",{enumerable:true,get:function(){return DiffPrompt}});const _base=require("../base");const _theme=require("../theme");const _ansi=require("../ansi");const _editor=require("./editor");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let DiffPrompt=class DiffPrompt extends _base.Prompt{render(_firstRender){let output=`${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}
|
|
2
|
+
`;const originalLines=this.options.original?this.options.original.split("\n"):[];const modifiedLines=this.options.modified?this.options.modified.split("\n"):[];const width=Math.max(40,(this.stdout.columns||80)-4);const borderTop=`${_ansi.ANSI.FG_GRAY}┌${"─".repeat(width)}┐${_ansi.ANSI.RESET}`;const borderMid=`${_ansi.ANSI.FG_GRAY}├${"─".repeat(width)}┤${_ansi.ANSI.RESET}`;const borderBot=`${_ansi.ANSI.FG_GRAY}└${"─".repeat(width)}┘${_ansi.ANSI.RESET}`;output+=borderTop+"\n";if(originalLines.length===0){output+=`${_ansi.ANSI.FG_GRAY}│ ${_ansi.ANSI.DIM}(empty)${_ansi.ANSI.RESET}
|
|
3
|
+
`}else{originalLines.forEach(line=>{const truncated=this.truncate(line,width-4);output+=`${_ansi.ANSI.FG_GRAY}│ ${_ansi.ANSI.FG_RED}- ${truncated}${_ansi.ANSI.RESET}
|
|
4
|
+
`})}output+=borderMid+"\n";if(modifiedLines.length===0){output+=`${_ansi.ANSI.FG_GRAY}│ ${_ansi.ANSI.DIM}(empty)${_ansi.ANSI.RESET}
|
|
5
|
+
`}else{modifiedLines.forEach(line=>{const truncated=this.truncate(line,width-4);output+=`${_ansi.ANSI.FG_GRAY}│ ${_ansi.ANSI.FG_GREEN}+ ${truncated}${_ansi.ANSI.RESET}
|
|
6
|
+
`})}output+=borderBot+"\n";output+="\n";this.actions.forEach((action,index)=>{if(index===this.activeAction){output+=`${_ansi.ANSI.REVERSE} ${action} ${_ansi.ANSI.RESET} `}else{output+=`[ ${action} ] `}});this.renderFrame(output)}handleInput(char,_key){if(this.isLeft(char)){this.activeAction=(this.activeAction-1+this.actions.length)%this.actions.length;this.render(false)}else if(this.isRight(char)){this.activeAction=(this.activeAction+1)%this.actions.length;this.render(false)}else if(char==="\r"||char==="\n"){this.handleSubmit()}}handleSubmit(){if(this.activeAction===0){this.submit(this.options.original)}else if(this.activeAction===1){this.submit(this.options.modified)}else{this.cleanup();const initial=`<<<<<<< ORIGINAL
|
|
7
|
+
${this.options.original}
|
|
8
|
+
=======
|
|
9
|
+
${this.options.modified}
|
|
10
|
+
>>>>>>> MODIFIED`;new _editor.EditorPrompt({message:"Resolve conflict (Edit)",initial:initial,extension:".txt",waitUserInput:false}).run().then(result=>{this.submit(result)}).catch(_err=>{this.submit(initial)})}}constructor(options){super(options),_define_property(this,"activeAction",0),_define_property(this,"actions",["Use Original","Use Modified","Edit"])}};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Prompt } from '../base';
|
|
2
|
+
import { DrawOptions, MouseEvent } from '../types';
|
|
3
|
+
export declare class DrawPrompt extends Prompt<string | boolean[][], DrawOptions> {
|
|
4
|
+
private grid;
|
|
5
|
+
private cursorX;
|
|
6
|
+
private cursorY;
|
|
7
|
+
private gridWidth;
|
|
8
|
+
private gridHeight;
|
|
9
|
+
private lastMouse;
|
|
10
|
+
constructor(options: DrawOptions);
|
|
11
|
+
private getBrailleChar;
|
|
12
|
+
private getPixel;
|
|
13
|
+
private setPixel;
|
|
14
|
+
protected render(_firstRender: boolean): void;
|
|
15
|
+
protected handleInput(char: string, _key: Buffer): void;
|
|
16
|
+
protected handleMouse(event: MouseEvent): void;
|
|
17
|
+
private clearGrid;
|
|
18
|
+
private invertGrid;
|
|
19
|
+
private handleSubmit;
|
|
20
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"DrawPrompt",{enumerable:true,get:function(){return DrawPrompt}});const _base=require("../base");const _theme=require("../theme");const _ansi=require("../ansi");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let DrawPrompt=class DrawPrompt extends _base.Prompt{getBrailleChar(x,y){const baseX=x*2;const baseY=y*4;let code=10240;if(this.getPixel(baseX,baseY))code|=1;if(this.getPixel(baseX,baseY+1))code|=2;if(this.getPixel(baseX,baseY+2))code|=4;if(this.getPixel(baseX,baseY+3))code|=64;if(this.getPixel(baseX+1,baseY))code|=8;if(this.getPixel(baseX+1,baseY+1))code|=16;if(this.getPixel(baseX+1,baseY+2))code|=32;if(this.getPixel(baseX+1,baseY+3))code|=128;return String.fromCharCode(code)}getPixel(x,y){if(y>=0&&y<this.gridHeight&&x>=0&&x<this.gridWidth){return this.grid[y][x]}return false}setPixel(x,y,val){if(y>=0&&y<this.gridHeight&&x>=0&&x<this.gridWidth){this.grid[y][x]=val}}render(_firstRender){let output=`${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}
|
|
2
|
+
`;output+=`${_ansi.ANSI.FG_GRAY}┌${"─".repeat(this.options.width+2)}┐${_ansi.ANSI.RESET}
|
|
3
|
+
`;for(let y=0;y<this.options.height;y++){let line="";for(let x=0;x<this.options.width;x++){const char=this.getBrailleChar(x,y);const containsCursor=Math.floor(this.cursorX/2)===x&&Math.floor(this.cursorY/4)===y;if(containsCursor){line+=_ansi.ANSI.REVERSE+char+_ansi.ANSI.RESET}else{line+=char}}output+=`${_ansi.ANSI.FG_GRAY}│ ${_ansi.ANSI.RESET}${line} ${_ansi.ANSI.FG_GRAY}│${_ansi.ANSI.RESET}
|
|
4
|
+
`}output+=`${_ansi.ANSI.FG_GRAY}└${"─".repeat(this.options.width+2)}┘${_ansi.ANSI.RESET}
|
|
5
|
+
`;output+=`
|
|
6
|
+
${_ansi.ANSI.FG_GRAY}(Arrows: move, Space: toggle, Mouse: drag, 'c': clear, 'i': invert, Enter: done)${_ansi.ANSI.RESET}`;this.renderFrame(output)}handleInput(char,_key){if(this.isLeft(char)){this.cursorX=Math.max(0,this.cursorX-1);this.render(false)}else if(this.isRight(char)){this.cursorX=Math.min(this.gridWidth-1,this.cursorX+1);this.render(false)}else if(this.isUp(char)){this.cursorY=Math.max(0,this.cursorY-1);this.render(false)}else if(this.isDown(char)){this.cursorY=Math.min(this.gridHeight-1,this.cursorY+1);this.render(false)}else if(char===" "){const current=this.getPixel(this.cursorX,this.cursorY);this.setPixel(this.cursorX,this.cursorY,!current);this.render(false)}else if(char==="c"){this.clearGrid();this.render(false)}else if(char==="i"){this.invertGrid();this.render(false)}else if(char==="\r"||char==="\n"){this.handleSubmit()}}handleMouse(event){if(event.action==="release"){this.lastMouse=null;return}if(this.lastMouse){const dx=event.x-this.lastMouse.x;const dy=event.y-this.lastMouse.y;if(dx!==0||dy!==0){this.cursorX+=dx*2;this.cursorY+=dy*4;this.cursorX=Math.max(0,Math.min(this.gridWidth-1,this.cursorX));this.cursorY=Math.max(0,Math.min(this.gridHeight-1,this.cursorY));if(event.action==="press"||event.action==="move"&&event.button===0){this.setPixel(this.cursorX,this.cursorY,true)}if((event.action==="press"||event.action==="move")&&event.button===2){this.setPixel(this.cursorX,this.cursorY,false)}this.render(false)}}else{if(event.action==="press"&&event.button===0){this.setPixel(this.cursorX,this.cursorY,true);this.render(false)}}this.lastMouse={x:event.x,y:event.y}}clearGrid(){for(let y=0;y<this.gridHeight;y++){for(let x=0;x<this.gridWidth;x++){this.grid[y][x]=false}}}invertGrid(){for(let y=0;y<this.gridHeight;y++){for(let x=0;x<this.gridWidth;x++){this.grid[y][x]=!this.grid[y][x]}}}handleSubmit(){if(this.options.exportType==="text"){let result="";for(let y=0;y<this.options.height;y++){for(let x=0;x<this.options.width;x++){result+=this.getBrailleChar(x,y)}result+="\n"}this.submit(result.trim())}else{this.submit(this.grid)}}constructor(options){super(options),_define_property(this,"grid",void 0),_define_property(this,"cursorX",0),_define_property(this,"cursorY",0),_define_property(this,"gridWidth",void 0),_define_property(this,"gridHeight",void 0),_define_property(this,"lastMouse",null);this.gridWidth=options.width*2;this.gridHeight=options.height*4;if(options.initial){this.grid=options.initial.map(row=>[...row])}else{this.grid=[];for(let y=0;y<this.gridHeight;y++){const row=new Array(this.gridWidth).fill(false);this.grid.push(row)}}}};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Prompt } from '../base';
|
|
2
|
+
import { EditorOptions } from '../types';
|
|
3
|
+
export declare class EditorPrompt extends Prompt<string, EditorOptions> {
|
|
4
|
+
private errorMsg;
|
|
5
|
+
private status;
|
|
6
|
+
private tempFilePath;
|
|
7
|
+
constructor(options: EditorOptions);
|
|
8
|
+
protected cleanup(): void;
|
|
9
|
+
protected render(firstRender: boolean): void;
|
|
10
|
+
protected handleInput(char: string): void;
|
|
11
|
+
private resolveEditor;
|
|
12
|
+
private spawnEditor;
|
|
13
|
+
private restoreMep;
|
|
14
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"EditorPrompt",{enumerable:true,get:function(){return EditorPrompt}});const _fs=/*#__PURE__*/_interop_require_wildcard(require("fs"));const _os=/*#__PURE__*/_interop_require_wildcard(require("os"));const _path=/*#__PURE__*/_interop_require_wildcard(require("path"));const _child_process=require("child_process");const _base=require("../base");const _theme=require("../theme");const _symbols=require("../symbols");const _ansi=require("../ansi");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap;var cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interop_require_wildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj}}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj)}var newObj={__proto__:null};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc)}else{newObj[key]=obj[key]}}}newObj.default=obj;if(cache){cache.set(obj,newObj)}return newObj}let EditorPrompt=class EditorPrompt extends _base.Prompt{cleanup(){if(this.tempFilePath){try{if(_fs.existsSync(this.tempFilePath)){_fs.unlinkSync(this.tempFilePath)}}catch(_error){}}super.cleanup()}render(firstRender){if(this.status==="editing"){return}const icon=this.status==="done"?_theme.theme.success+_symbols.symbols.tick:_theme.theme.main+"?";const message=`${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}`;const hint=this.options.waitUserInput?` ${_theme.theme.muted}[Press <Enter> to launch editor]${_ansi.ANSI.RESET}`:` ${_theme.theme.muted}[Launching editor...]${_ansi.ANSI.RESET}`;let output=`${icon} ${_ansi.ANSI.BOLD}${message}${_ansi.ANSI.RESET}${hint}`;if(this.errorMsg){output+=`
|
|
2
|
+
${_theme.theme.error}>> ${this.errorMsg}${_ansi.ANSI.RESET}`}this.renderFrame(output);if(firstRender&&this.options.waitUserInput===false){setTimeout(()=>{this.spawnEditor()},50)}}handleInput(char){if(this.status!=="pending")return;if(char==="\r"||char==="\n"){this.spawnEditor()}}resolveEditor(){const envEditor=process.env.VISUAL||process.env.EDITOR;if(envEditor){const parts=envEditor.split(" ");return{cmd:parts[0],args:parts.slice(1)}}if(process.platform==="win32"){return{cmd:"notepad",args:[]}}else{return{cmd:"vim",args:[]}}}spawnEditor(){this.status="editing";const ext=this.options.extension||".txt";const safeExt=ext.startsWith(".")?ext:"."+ext;const filename=`mep-editor-${Date.now()}-${Math.floor(Math.random()*1e3)}${safeExt}`;this.tempFilePath=_path.join(_os.tmpdir(),filename);const initialContent=this.options.initial||"";try{_fs.writeFileSync(this.tempFilePath,initialContent,"utf8")}catch(e){this.errorMsg=`Failed to create temp file: ${e.message}`;this.status="pending";this.render(false);return}const{cmd,args}=this.resolveEditor();const editorArgs=[...args,this.tempFilePath];const shouldEnableMouse=this.options.mouse!==false&&this.capabilities.hasMouse;if(shouldEnableMouse){this.print(_ansi.ANSI.DISABLE_MOUSE)}this.stdin.setRawMode(false);this.stdin.pause();const child=(0,_child_process.spawn)(cmd,editorArgs,{stdio:"inherit",shell:true});child.on("error",err=>{this.restoreMep();this.status="pending";this.errorMsg=`Could not launch editor '${cmd}': ${err.message}`;this.render(false)});child.on("exit",code=>{let content=initialContent;try{if(this.tempFilePath&&_fs.existsSync(this.tempFilePath)){content=_fs.readFileSync(this.tempFilePath,"utf8");_fs.unlinkSync(this.tempFilePath);this.tempFilePath=null}}catch(_e){}this.restoreMep();if(code!==0){this.status="pending";this.errorMsg=`Editor exited with code ${code}`;this.render(false);return}this.status="done";if(content.endsWith("\n")){content=content.slice(0,-1)}if(content.endsWith("\r")){content=content.slice(0,-1)}this.submit(content)})}restoreMep(){this.stdin.resume();this.stdin.setRawMode(true);const shouldEnableMouse=this.options.mouse!==false&&this.capabilities.hasMouse;if(shouldEnableMouse){this.print(_ansi.ANSI.SET_ANY_EVENT_MOUSE+_ansi.ANSI.SET_SGR_EXT_MODE_MOUSE)}this.print(_ansi.ANSI.HIDE_CURSOR)}constructor(options){super(options),_define_property(this,"errorMsg",""),_define_property(this,"status","pending"),_define_property(this,"tempFilePath",null);if(this.options.waitUserInput===undefined){this.options.waitUserInput=true}}};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Prompt } from '../base';
|
|
2
|
+
import { EmojiOptions, MouseEvent } from '../types';
|
|
3
|
+
export declare class EmojiPrompt extends Prompt<string, EmojiOptions> {
|
|
4
|
+
private search;
|
|
5
|
+
private cursor;
|
|
6
|
+
private filtered;
|
|
7
|
+
private sortedEmojis;
|
|
8
|
+
private cols;
|
|
9
|
+
private scrollTop;
|
|
10
|
+
private pageSize;
|
|
11
|
+
constructor(options: EmojiOptions);
|
|
12
|
+
private calculateLayout;
|
|
13
|
+
private updateFilter;
|
|
14
|
+
protected render(_firstRender: boolean): void;
|
|
15
|
+
protected handleInput(char: string): void;
|
|
16
|
+
protected handleMouse(event: MouseEvent): void;
|
|
17
|
+
private adjustScroll;
|
|
18
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"EmojiPrompt",{enumerable:true,get:function(){return EmojiPrompt}});const _ansi=require("../ansi");const _base=require("../base");const _theme=require("../theme");const _utils=require("../utils");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let EmojiPrompt=class EmojiPrompt extends _base.Prompt{calculateLayout(){if(this.options.cols){this.cols=this.options.cols}else{const termWidth=process.stdout.columns||80;this.cols=Math.floor((termWidth-4)/4);if(this.cols<1)this.cols=1}}updateFilter(){if(!this.search){this.filtered=this.sortedEmojis}else{const lowerSearch=this.search.toLowerCase();this.filtered=this.sortedEmojis.filter(e=>e.name.toLowerCase().includes(lowerSearch)||e.description&&e.description.toLowerCase().includes(lowerSearch)||e.char===this.search)}this.cursor=0;this.scrollTop=0}render(_firstRender){const icon=`${_theme.theme.success}?`;const title=`${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}`;const searchDisplay=this.search?`${_theme.theme.main}${this.search}${_ansi.ANSI.RESET}`:`${_theme.theme.muted}Type to search...${_ansi.ANSI.RESET}`;let output=`${icon} ${title} ${searchDisplay}
|
|
2
|
+
`;if(this.filtered.length===0){output+=`
|
|
3
|
+
${_theme.theme.error}No results found.${_ansi.ANSI.RESET}
|
|
4
|
+
`}else{const totalRows=Math.ceil(this.filtered.length/this.cols);const startRow=this.scrollTop;const endRow=Math.min(totalRows,startRow+this.pageSize);for(let r=startRow;r<endRow;r++){let rowStr=" ";for(let c=0;c<this.cols;c++){const idx=r*this.cols+c;if(idx>=this.filtered.length)break;const item=this.filtered[idx];const isSelected=idx===this.cursor;const emoji=item.char;const width=(0,_utils.stringWidth)(emoji);const padding=4-width;const leftPad=Math.floor(padding/2);const rightPad=padding-leftPad;let cell=`${" ".repeat(leftPad)}${emoji}${" ".repeat(rightPad)}`;if(isSelected){cell=`${_ansi.ANSI.REVERSE}${cell}${_ansi.ANSI.RESET}`}rowStr+=cell}output+=rowStr+"\n"}if(this.filtered.length>0){const selectedItem=this.filtered[this.cursor];output+=`
|
|
5
|
+
${_ansi.ANSI.BOLD}${selectedItem.char} ${selectedItem.name}${_ansi.ANSI.RESET}`;if(selectedItem.description){output+=` - ${_theme.theme.muted}${selectedItem.description}${_ansi.ANSI.RESET}`}}else{output+="\n"}}this.renderFrame(output)}handleInput(char){if(this.isUp(char)){if(this.filtered.length===0)return;const newCursor=this.cursor-this.cols;if(newCursor>=0){this.cursor=newCursor}this.adjustScroll();this.render(false);return}if(this.isDown(char)){if(this.filtered.length===0)return;const newCursor=this.cursor+this.cols;if(newCursor<this.filtered.length){this.cursor=newCursor}this.adjustScroll();this.render(false);return}if(this.isLeft(char)){if(this.filtered.length===0)return;if(this.cursor>0){this.cursor--}else{this.cursor=this.filtered.length-1}this.adjustScroll();this.render(false);return}if(this.isRight(char)){if(this.filtered.length===0)return;if(this.cursor<this.filtered.length-1){this.cursor++}else{this.cursor=0}this.adjustScroll();this.render(false);return}if(char==="\r"||char==="\n"){if(this.filtered.length>0){this.submit(this.filtered[this.cursor].char)}return}if(char==="\b"||char===""){if(this.search.length>0){this.search=this.search.slice(0,-1);this.updateFilter();this.render(false)}return}if(!/^[\x00-\x1F]/.test(char)&&!char.startsWith("\x1b")){this.search+=char;this.updateFilter();this.render(false)}}handleMouse(event){if(event.action==="scroll"&&this.filtered.length>0){if(event.scroll==="up"){if(this.cursor>0){this.cursor--}else{this.cursor=this.filtered.length-1}}else{if(this.cursor<this.filtered.length-1){this.cursor++}else{this.cursor=0}}this.adjustScroll();this.render(false)}}adjustScroll(){const cursorRow=Math.floor(this.cursor/this.cols);if(cursorRow<this.scrollTop){this.scrollTop=cursorRow}else if(cursorRow>=this.scrollTop+this.pageSize){this.scrollTop=cursorRow-this.pageSize+1}}constructor(options){super(options),_define_property(this,"search",""),_define_property(this,"cursor",0),_define_property(this,"filtered",[]),_define_property(this,"sortedEmojis",[]),_define_property(this,"cols",0),_define_property(this,"scrollTop",0),_define_property(this,"pageSize",8);this.sortedEmojis=[...options.emojis];if(options.recent&&options.recent.length>0){const recentSet=new Set(options.recent);this.sortedEmojis.sort((a,b)=>{const aRecent=recentSet.has(a.name);const bRecent=recentSet.has(b.name);if(aRecent&&!bRecent)return-1;if(!aRecent&&bRecent)return 1;return 0})}this.checkWindowsAttention();this.filtered=this.sortedEmojis;this.calculateLayout()}};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Prompt } from '../base';
|
|
2
|
+
import { ExecOptions } from '../types';
|
|
3
|
+
export declare class ExecPrompt extends Prompt<void, ExecOptions> {
|
|
4
|
+
private child?;
|
|
5
|
+
private status;
|
|
6
|
+
private timer?;
|
|
7
|
+
private stdoutBuffer;
|
|
8
|
+
private stderrBuffer;
|
|
9
|
+
private lastLogLine;
|
|
10
|
+
constructor(options: ExecOptions);
|
|
11
|
+
run(): Promise<void>;
|
|
12
|
+
private updateLastLogLine;
|
|
13
|
+
private killChild;
|
|
14
|
+
protected cleanup(): void;
|
|
15
|
+
protected render(_firstRender: boolean): void;
|
|
16
|
+
protected handleInput(_char: string, _key: Buffer): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"ExecPrompt",{enumerable:true,get:function(){return ExecPrompt}});const _child_process=require("child_process");const _base=require("../base");const _theme=require("../theme");const _symbols=require("../symbols");const _ansi=require("../ansi");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let ExecPrompt=class ExecPrompt extends _base.Prompt{run(){this.child=(0,_child_process.spawn)(this.options.command,[],{cwd:this.options.cwd||process.cwd(),shell:true,stdio:["ignore","pipe","pipe"]});if(this.child.stdout){this.child.stdout.on("data",data=>{const chunk=data.toString();this.stdoutBuffer+=chunk;this.updateLastLogLine(chunk)})}if(this.child.stderr){this.child.stderr.on("data",data=>{const chunk=data.toString();this.stderrBuffer+=chunk;this.updateLastLogLine(chunk)})}if(this.options.timeout&&this.options.timeout>0){this.timer=setTimeout(()=>{if(this.status!=="running")return;this.status="error";this.render(false);this.killChild();this.cancel(new Error(`Timeout after ${this.options.timeout}ms`))},this.options.timeout)}this.child.on("exit",code=>{if(this.status!=="running")return;if(code===0){this.status="done";this.render(false);this.submit()}else{this.status="error";this.render(false);const errorMessage=this.stderrBuffer.trim()||`Command failed with exit code ${code}`;const err=new Error(errorMessage);Object.assign(err,{code,stdout:this.stdoutBuffer,stderr:this.stderrBuffer});this.cancel(err)}});this.child.on("error",err=>{if(this.status!=="running")return;this.status="error";this.render(false);this.cancel(err)});return super.run()}updateLastLogLine(chunk){const lines=chunk.split("\n");for(let i=lines.length-1;i>=0;i--){const line=lines[i].trim();if(line){this.lastLogLine=line;this.render(false);break}}}killChild(){if(this.child&&!this.child.killed){this.child.kill()}}cleanup(){this.status="done";if(this.timer)clearTimeout(this.timer);this.killChild();super.cleanup()}render(_firstRender){let symbol="";if(this.status==="running"){symbol=_theme.theme.muted+"..."+_ansi.ANSI.RESET}else if(this.status==="done"){symbol=_theme.theme.success+_symbols.symbols.tick+_ansi.ANSI.RESET}else if(this.status==="error"){symbol=_theme.theme.error+_symbols.symbols.cross+_ansi.ANSI.RESET}let details="";if(this.status==="running"&&this.lastLogLine){const maxLen=50;let line=this.stripAnsi(this.lastLogLine);if(line.length>maxLen){line=line.substring(0,maxLen-3)+"..."}details=` ${_theme.theme.muted}${line}${_ansi.ANSI.RESET}`}const output=`${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} ${symbol}${details}`;this.renderFrame(output)}handleInput(_char,_key){}constructor(options){super(options),_define_property(this,"child",void 0),_define_property(this,"status","running"),_define_property(this,"timer",void 0),_define_property(this,"stdoutBuffer",""),_define_property(this,"stderrBuffer",""),_define_property(this,"lastLogLine","")}};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Prompt } from '../base';
|
|
2
|
+
import { FileOptions } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Implementation of FilePrompt with autocomplete.
|
|
5
|
+
*/
|
|
6
|
+
export declare class FilePrompt extends Prompt<string, FileOptions> {
|
|
7
|
+
private input;
|
|
8
|
+
private cursor;
|
|
9
|
+
private suggestions;
|
|
10
|
+
private selectedSuggestion;
|
|
11
|
+
private errorMsg;
|
|
12
|
+
private lastLinesUp;
|
|
13
|
+
constructor(options: FileOptions);
|
|
14
|
+
/**
|
|
15
|
+
* Updates the suggestions list based on the current input path.
|
|
16
|
+
*/
|
|
17
|
+
private updateSuggestions;
|
|
18
|
+
protected render(firstRender: boolean): void;
|
|
19
|
+
protected cleanup(): void;
|
|
20
|
+
protected handleInput(char: string): void;
|
|
21
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"FilePrompt",{enumerable:true,get:function(){return FilePrompt}});const _ansi=require("../ansi");const _base=require("../base");const _theme=require("../theme");const _symbols=require("../symbols");const _fs=/*#__PURE__*/_interop_require_wildcard(require("fs"));const _path=/*#__PURE__*/_interop_require_wildcard(require("path"));function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap;var cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interop_require_wildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj}}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj)}var newObj={__proto__:null};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc)}else{newObj[key]=obj[key]}}}newObj.default=obj;if(cache){cache.set(obj,newObj)}return newObj}let FilePrompt=class FilePrompt extends _base.Prompt{updateSuggestions(){try{const isDirQuery=this.input.endsWith("/")||this.input.endsWith("\\");const dir=isDirQuery?this.input:_path.dirname(this.input)||".";const partial=isDirQuery?"":_path.basename(this.input);if(_fs.existsSync(dir)&&_fs.statSync(dir).isDirectory()){const files=_fs.readdirSync(dir);this.suggestions=files.filter(f=>f.toLowerCase().startsWith(partial.toLowerCase())).filter(f=>{const fullPath=_path.join(dir,f);try{const stats=_fs.statSync(fullPath);const isDir=stats.isDirectory();if(this.options.onlyDirectories&&!isDir)return false;if(this.options.extensions&&!isDir){return this.options.extensions.some(ext=>f.endsWith(ext))}return true}catch(_e){return false}}).map(f=>{const fullPath=_path.join(dir,f);try{if(_fs.statSync(fullPath).isDirectory())return f+_path.sep}catch(_e){}return f})}else{this.suggestions=[]}}catch(_e){this.suggestions=[]}this.selectedSuggestion=-1}render(firstRender){if(!firstRender&&this.lastLinesUp>0){this.print(`\x1b[${this.lastLinesUp}B`);this.lastLinesUp=0}const icon=this.errorMsg?`${_theme.theme.error}${_symbols.symbols.cross}`:`${_theme.theme.success}?`;let output=`${icon} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} ${this.input}`;if(this.suggestions.length>0){output+="\n";const maxShow=5;const displayed=this.suggestions.slice(0,maxShow);displayed.forEach((s,i)=>{if(i>0)output+="\n";if(i===this.selectedSuggestion){output+=`${_theme.theme.main}${_symbols.symbols.pointer} ${s}${_ansi.ANSI.RESET}`}else{output+=` ${s}`}});if(this.suggestions.length>maxShow){output+=`
|
|
2
|
+
${_theme.theme.muted}...and ${this.suggestions.length-maxShow} more${_ansi.ANSI.RESET}`}}this.renderFrame(output);const totalLines=this.lastRenderHeight;if(totalLines>1){this.lastLinesUp=totalLines-1;this.print(`\x1b[${this.lastLinesUp}A`)}const prefix=`${icon} ${_theme.theme.title}${this.options.message} `;const prefixLen=this.stripAnsi(prefix).length;const targetCol=prefixLen+this.input.length;this.print(_ansi.ANSI.CURSOR_LEFT);if(targetCol>0)this.print(`\x1b[${targetCol}C`);this.print(_ansi.ANSI.SHOW_CURSOR)}cleanup(){if(this.lastLinesUp>0){this.print(`\x1b[${this.lastLinesUp}B`);this.lastLinesUp=0}super.cleanup()}handleInput(char){if(char===" "){if(this.suggestions.length>0){const idx=this.selectedSuggestion===-1?0:this.selectedSuggestion;const suggestion=this.suggestions[idx];const isDir=this.input.endsWith("/")||this.input.endsWith("\\");const dir=isDir?this.input:_path.dirname(this.input);const baseDir=dir==="."&&!this.input.startsWith(".")?"":dir;this.input=_path.join(baseDir,suggestion);this.cursor=this.input.length;this.updateSuggestions();this.render(false)}return}if(char==="\r"||char==="\n"){this.submit(this.input);return}if(this.isDown(char)){if(this.suggestions.length>0){const count=Math.min(this.suggestions.length,5);this.selectedSuggestion=(this.selectedSuggestion+1)%count;this.render(false)}return}if(this.isUp(char)){if(this.suggestions.length>0){const count=Math.min(this.suggestions.length,5);this.selectedSuggestion=(this.selectedSuggestion-1+count)%count;this.render(false)}return}if(char==="\b"||char===""){if(this.input.length>0){this.input=this.input.slice(0,-1);this.updateSuggestions();this.render(false)}return}if(!/^[\x00-\x1F]/.test(char)&&!char.startsWith("\x1b")){this.input+=char;this.updateSuggestions();this.render(false)}}constructor(options){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);this.input=options.basePath||"";this.cursor=this.input.length;this.updateSuggestions()}};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Prompt } from '../base';
|
|
2
|
+
import { FormOptions, MouseEvent } from '../types';
|
|
3
|
+
export declare class FormPrompt extends Prompt<Record<string, string>, FormOptions> {
|
|
4
|
+
private values;
|
|
5
|
+
private activeIndex;
|
|
6
|
+
private fieldErrors;
|
|
7
|
+
private globalError;
|
|
8
|
+
private cursor;
|
|
9
|
+
private lastLinesUp;
|
|
10
|
+
constructor(options: FormOptions);
|
|
11
|
+
protected render(firstRender: boolean): void;
|
|
12
|
+
protected handleInput(char: string, key: Buffer): void;
|
|
13
|
+
protected handleMouse(event: MouseEvent): void;
|
|
14
|
+
private moveFocus;
|
|
15
|
+
private validateCurrentField;
|
|
16
|
+
protected cleanup(): void;
|
|
17
|
+
private submitForm;
|
|
18
|
+
}
|