mepcli 1.3.2 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -2
- package/dist/{ansi.js → src/ansi.js} +17 -9
- package/dist/src/ansi.js.map +1 -0
- package/dist/{base.js → src/base.js} +82 -70
- package/dist/src/base.js.map +1 -0
- package/dist/{core.js → src/core.js} +266 -320
- package/dist/src/core.js.map +1 -0
- package/dist/src/data/countries.js +569 -0
- package/dist/src/data/countries.js.map +1 -0
- package/dist/src/data/licenses.js +480 -0
- package/dist/src/data/licenses.js.map +1 -0
- package/dist/{highlight.js → src/highlight.js} +77 -69
- package/dist/src/highlight.js.map +1 -0
- package/dist/src/index.js +66 -0
- package/dist/src/index.js.map +1 -0
- package/dist/{input.js → src/input.js} +47 -41
- package/dist/src/input.js.map +1 -0
- package/dist/src/pipeline.js +273 -0
- package/dist/src/pipeline.js.map +1 -0
- package/dist/{prompts → src/prompts}/autocomplete.js +58 -57
- package/dist/src/prompts/autocomplete.js.map +1 -0
- package/dist/{prompts → src/prompts}/box.js +86 -53
- package/dist/src/prompts/box.js.map +1 -0
- package/dist/{prompts → src/prompts}/breadcrumb-search.js +110 -98
- package/dist/src/prompts/breadcrumb-search.js.map +1 -0
- package/dist/{prompts → src/prompts}/breadcrumb.js +126 -121
- package/dist/src/prompts/breadcrumb.js.map +1 -0
- package/dist/{prompts → src/prompts}/byte.js +69 -52
- package/dist/src/prompts/byte.js.map +1 -0
- package/dist/{prompts → src/prompts}/calculator.js +79 -56
- package/dist/src/prompts/calculator.js.map +1 -0
- package/dist/{prompts → src/prompts}/calendar.js +167 -127
- package/dist/src/prompts/calendar.js.map +1 -0
- package/dist/{prompts → src/prompts}/checkbox.js +53 -49
- package/dist/src/prompts/checkbox.js.map +1 -0
- package/dist/{prompts → src/prompts}/code.js +88 -76
- package/dist/src/prompts/code.js.map +1 -0
- package/dist/{prompts → src/prompts}/color.js +68 -50
- package/dist/src/prompts/color.js.map +1 -0
- package/dist/{prompts → src/prompts}/confirm.js +22 -15
- package/dist/src/prompts/confirm.js.map +1 -0
- package/dist/{prompts → src/prompts}/connection-string.js +59 -36
- package/dist/src/prompts/connection-string.js.map +1 -0
- package/dist/{prompts → src/prompts}/cron.js +90 -59
- package/dist/src/prompts/cron.js.map +1 -0
- package/dist/src/prompts/curl-utils.js +71 -0
- package/dist/src/prompts/curl-utils.js.map +1 -0
- package/dist/{prompts → src/prompts}/curl.js +153 -132
- package/dist/src/prompts/curl.js.map +1 -0
- package/dist/{prompts → src/prompts}/data-inspector.js +96 -91
- package/dist/src/prompts/data-inspector.js.map +1 -0
- package/dist/{prompts → src/prompts}/date.js +64 -57
- package/dist/src/prompts/date.js.map +1 -0
- package/dist/{prompts → src/prompts}/dependency.js +84 -80
- package/dist/src/prompts/dependency.js.map +1 -0
- package/dist/{prompts → src/prompts}/dial.js +49 -35
- package/dist/src/prompts/dial.js.map +1 -0
- package/dist/src/prompts/diff.js +118 -0
- package/dist/src/prompts/diff.js.map +1 -0
- package/dist/{prompts → src/prompts}/draw.js +83 -80
- package/dist/src/prompts/draw.js.map +1 -0
- package/dist/src/prompts/editor.js +234 -0
- package/dist/src/prompts/editor.js.map +1 -0
- package/dist/{prompts → src/prompts}/emoji.js +80 -82
- package/dist/src/prompts/emoji.js.map +1 -0
- package/dist/{prompts → src/prompts}/exec.js +60 -46
- package/dist/src/prompts/exec.js.map +1 -0
- package/dist/src/prompts/file.js +217 -0
- package/dist/src/prompts/file.js.map +1 -0
- package/dist/{prompts → src/prompts}/form.js +63 -54
- package/dist/src/prompts/form.js.map +1 -0
- package/dist/{prompts → src/prompts}/fuzzy-multi-column.js +65 -53
- package/dist/src/prompts/fuzzy-multi-column.js.map +1 -0
- package/dist/{prompts → src/prompts}/fuzzy.js +66 -55
- package/dist/src/prompts/fuzzy.js.map +1 -0
- package/dist/src/prompts/gauge.js +137 -0
- package/dist/src/prompts/gauge.js.map +1 -0
- package/dist/{prompts → src/prompts}/grid.js +70 -57
- package/dist/src/prompts/grid.js.map +1 -0
- package/dist/{prompts → src/prompts}/heatmap.js +70 -64
- package/dist/src/prompts/heatmap.js.map +1 -0
- package/dist/{prompts → src/prompts}/ip.js +56 -36
- package/dist/src/prompts/ip.js.map +1 -0
- package/dist/{prompts → src/prompts}/kanban.js +63 -58
- package/dist/src/prompts/kanban.js.map +1 -0
- package/dist/src/prompts/keypress.js +54 -0
- package/dist/src/prompts/keypress.js.map +1 -0
- package/dist/src/prompts/license.js +144 -0
- package/dist/src/prompts/license.js.map +1 -0
- package/dist/{prompts → src/prompts}/list.js +46 -31
- package/dist/src/prompts/list.js.map +1 -0
- package/dist/{prompts → src/prompts}/map.js +93 -77
- package/dist/src/prompts/map.js.map +1 -0
- package/dist/{prompts → src/prompts}/match.js +91 -95
- package/dist/src/prompts/match.js.map +1 -0
- package/dist/{prompts → src/prompts}/miller.js +74 -67
- package/dist/src/prompts/miller.js.map +1 -0
- package/dist/{prompts → src/prompts}/multi-column-select.js +54 -44
- package/dist/src/prompts/multi-column-select.js.map +1 -0
- package/dist/{prompts → src/prompts}/multi-range.js +70 -52
- package/dist/src/prompts/multi-range.js.map +1 -0
- package/dist/{prompts → src/prompts}/multi-select.js +67 -58
- package/dist/src/prompts/multi-select.js.map +1 -0
- package/dist/{prompts → src/prompts}/number.js +51 -39
- package/dist/src/prompts/number.js.map +1 -0
- package/dist/{prompts → src/prompts}/otp.js +43 -27
- package/dist/src/prompts/otp.js.map +1 -0
- package/dist/{prompts → src/prompts}/pattern.js +74 -71
- package/dist/src/prompts/pattern.js.map +1 -0
- package/dist/{prompts → src/prompts}/phone.js +107 -118
- package/dist/src/prompts/phone.js.map +1 -0
- package/dist/src/prompts/quiz-select.js +114 -0
- package/dist/src/prompts/quiz-select.js.map +1 -0
- package/dist/src/prompts/quiz-text.js +98 -0
- package/dist/src/prompts/quiz-text.js.map +1 -0
- package/dist/{prompts → src/prompts}/range.js +85 -61
- package/dist/src/prompts/range.js.map +1 -0
- package/dist/{prompts → src/prompts}/rating.js +29 -24
- package/dist/src/prompts/rating.js.map +1 -0
- package/dist/{prompts → src/prompts}/regex.js +50 -36
- package/dist/src/prompts/regex.js.map +1 -0
- package/dist/{prompts → src/prompts}/region.js +62 -56
- package/dist/src/prompts/region.js.map +1 -0
- package/dist/{prompts → src/prompts}/schedule.js +82 -75
- package/dist/src/prompts/schedule.js.map +1 -0
- package/dist/{prompts → src/prompts}/scroll.js +61 -58
- package/dist/src/prompts/scroll.js.map +1 -0
- package/dist/src/prompts/seat.js +164 -0
- package/dist/src/prompts/seat.js.map +1 -0
- package/dist/{prompts → src/prompts}/select-range.js +58 -46
- package/dist/src/prompts/select-range.js.map +1 -0
- package/dist/{prompts → src/prompts}/select.js +65 -66
- package/dist/src/prompts/select.js.map +1 -0
- package/dist/{prompts → src/prompts}/semver.js +24 -13
- package/dist/src/prompts/semver.js.map +1 -0
- package/dist/src/prompts/shortcut.js +133 -0
- package/dist/src/prompts/shortcut.js.map +1 -0
- package/dist/{prompts → src/prompts}/slider.js +28 -23
- package/dist/src/prompts/slider.js.map +1 -0
- package/dist/src/prompts/slot.js +117 -0
- package/dist/src/prompts/slot.js.map +1 -0
- package/dist/{prompts → src/prompts}/snippet.js +82 -61
- package/dist/src/prompts/snippet.js.map +1 -0
- package/dist/{prompts → src/prompts}/sort-grid.js +64 -59
- package/dist/src/prompts/sort-grid.js.map +1 -0
- package/dist/{prompts → src/prompts}/sort.js +59 -49
- package/dist/src/prompts/sort.js.map +1 -0
- package/dist/src/prompts/spam.js +80 -0
- package/dist/src/prompts/spam.js.map +1 -0
- package/dist/{prompts → src/prompts}/spreadsheet.js +71 -70
- package/dist/src/prompts/spreadsheet.js.map +1 -0
- package/dist/{prompts → src/prompts}/table.js +52 -38
- package/dist/src/prompts/table.js.map +1 -0
- package/dist/{prompts → src/prompts}/text.js +74 -70
- package/dist/src/prompts/text.js.map +1 -0
- package/dist/{prompts → src/prompts}/time.js +105 -96
- package/dist/src/prompts/time.js.map +1 -0
- package/dist/src/prompts/toggle.js +53 -0
- package/dist/src/prompts/toggle.js.map +1 -0
- package/dist/{prompts → src/prompts}/transfer.js +71 -67
- package/dist/src/prompts/transfer.js.map +1 -0
- package/dist/{prompts → src/prompts}/tree-select.js +83 -86
- package/dist/src/prompts/tree-select.js.map +1 -0
- package/dist/{prompts → src/prompts}/tree.js +69 -67
- package/dist/src/prompts/tree.js.map +1 -0
- package/dist/src/prompts/wait.js +79 -0
- package/dist/src/prompts/wait.js.map +1 -0
- package/dist/src/spinner.js +105 -0
- package/dist/src/spinner.js.map +1 -0
- package/dist/{symbols.js → src/symbols.js} +32 -7
- package/dist/src/symbols.js.map +1 -0
- package/dist/{tasks.js → src/tasks.js} +104 -79
- package/dist/src/tasks.js.map +1 -0
- package/dist/src/theme.js +29 -0
- package/dist/src/theme.js.map +1 -0
- package/dist/src/types.js +8 -0
- package/dist/src/types.js.map +1 -0
- package/dist/{utils.js → src/utils.js} +196 -152
- package/dist/src/utils.js.map +1 -0
- package/package.json +16 -13
- package/dist/ansi.d.ts +0 -36
- package/dist/base.d.ts +0 -60
- package/dist/core.d.ts +0 -1072
- package/dist/data/countries.d.ts +0 -2
- package/dist/data/countries.js +0 -105
- package/dist/data/licenses.d.ts +0 -2
- package/dist/data/licenses.js +0 -109
- package/dist/highlight.d.ts +0 -7
- package/dist/index.d.ts +0 -48
- package/dist/index.js +0 -64
- package/dist/input.d.ts +0 -14
- package/dist/pipeline.d.ts +0 -39
- package/dist/pipeline.js +0 -54
- package/dist/prompts/autocomplete.d.ts +0 -22
- package/dist/prompts/box.d.ts +0 -21
- package/dist/prompts/breadcrumb-search.d.ts +0 -14
- package/dist/prompts/breadcrumb.d.ts +0 -32
- package/dist/prompts/byte.d.ts +0 -13
- package/dist/prompts/calculator.d.ts +0 -17
- package/dist/prompts/calendar.d.ts +0 -33
- package/dist/prompts/checkbox.d.ts +0 -13
- package/dist/prompts/code.d.ts +0 -19
- package/dist/prompts/color.d.ts +0 -14
- package/dist/prompts/confirm.d.ts +0 -8
- package/dist/prompts/connection-string.d.ts +0 -18
- package/dist/prompts/cron.d.ts +0 -13
- package/dist/prompts/curl-utils.d.ts +0 -25
- package/dist/prompts/curl-utils.js +0 -41
- package/dist/prompts/curl.d.ts +0 -41
- package/dist/prompts/data-inspector.d.ts +0 -22
- package/dist/prompts/date.d.ts +0 -12
- package/dist/prompts/dependency.d.ts +0 -16
- package/dist/prompts/dial.d.ts +0 -10
- package/dist/prompts/diff.d.ts +0 -10
- package/dist/prompts/diff.js +0 -101
- package/dist/prompts/draw.d.ts +0 -20
- package/dist/prompts/editor.d.ts +0 -14
- package/dist/prompts/editor.js +0 -203
- package/dist/prompts/emoji.d.ts +0 -18
- package/dist/prompts/exec.d.ts +0 -17
- package/dist/prompts/file.d.ts +0 -21
- package/dist/prompts/file.js +0 -210
- package/dist/prompts/form.d.ts +0 -18
- package/dist/prompts/fuzzy-multi-column.d.ts +0 -12
- package/dist/prompts/fuzzy.d.ts +0 -12
- package/dist/prompts/gauge.d.ts +0 -21
- package/dist/prompts/gauge.js +0 -130
- package/dist/prompts/grid.d.ts +0 -14
- package/dist/prompts/heatmap.d.ts +0 -13
- package/dist/prompts/ip.d.ts +0 -11
- package/dist/prompts/kanban.d.ts +0 -17
- package/dist/prompts/keypress.d.ts +0 -7
- package/dist/prompts/keypress.js +0 -55
- package/dist/prompts/license.d.ts +0 -9
- package/dist/prompts/license.js +0 -105
- package/dist/prompts/list.d.ts +0 -9
- package/dist/prompts/map.d.ts +0 -17
- package/dist/prompts/match.d.ts +0 -19
- package/dist/prompts/miller.d.ts +0 -15
- package/dist/prompts/multi-column-select.d.ts +0 -10
- package/dist/prompts/multi-range.d.ts +0 -9
- package/dist/prompts/multi-select.d.ts +0 -15
- package/dist/prompts/number.d.ts +0 -11
- package/dist/prompts/otp.d.ts +0 -10
- package/dist/prompts/pattern.d.ts +0 -22
- package/dist/prompts/phone.d.ts +0 -41
- package/dist/prompts/quiz-select.d.ts +0 -10
- package/dist/prompts/quiz-select.js +0 -104
- package/dist/prompts/quiz-text.d.ts +0 -11
- package/dist/prompts/quiz-text.js +0 -82
- package/dist/prompts/range.d.ts +0 -9
- package/dist/prompts/rating.d.ts +0 -8
- package/dist/prompts/regex.d.ts +0 -13
- package/dist/prompts/region.d.ts +0 -11
- package/dist/prompts/schedule.d.ts +0 -20
- package/dist/prompts/scroll.d.ts +0 -13
- package/dist/prompts/seat.d.ts +0 -17
- package/dist/prompts/seat.js +0 -165
- package/dist/prompts/select-range.d.ts +0 -8
- package/dist/prompts/select.d.ts +0 -15
- package/dist/prompts/semver.d.ts +0 -6
- package/dist/prompts/shortcut.d.ts +0 -9
- package/dist/prompts/shortcut.js +0 -135
- package/dist/prompts/slider.d.ts +0 -8
- package/dist/prompts/slot.d.ts +0 -16
- package/dist/prompts/slot.js +0 -107
- package/dist/prompts/snippet.d.ts +0 -19
- package/dist/prompts/sort-grid.d.ts +0 -16
- package/dist/prompts/sort.d.ts +0 -14
- package/dist/prompts/spam.d.ts +0 -17
- package/dist/prompts/spam.js +0 -62
- package/dist/prompts/spreadsheet.d.ts +0 -21
- package/dist/prompts/table.d.ts +0 -14
- package/dist/prompts/text.d.ts +0 -17
- package/dist/prompts/time.d.ts +0 -12
- package/dist/prompts/toggle.d.ts +0 -8
- package/dist/prompts/toggle.js +0 -47
- package/dist/prompts/transfer.d.ts +0 -18
- package/dist/prompts/tree-select.d.ts +0 -31
- package/dist/prompts/tree.d.ts +0 -20
- package/dist/prompts/wait.d.ts +0 -18
- package/dist/prompts/wait.js +0 -62
- package/dist/spinner.d.ts +0 -33
- package/dist/spinner.js +0 -89
- package/dist/symbols.d.ts +0 -33
- package/dist/tasks.d.ts +0 -57
- package/dist/theme.d.ts +0 -2
- package/dist/theme.js +0 -20
- package/dist/types.d.ts +0 -503
- package/dist/types.js +0 -5
- package/dist/utils.d.ts +0 -81
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/diff.ts"],"sourcesContent":["import { Prompt } from '../base';\nimport { DiffOptions } from '../types';\nimport { theme } from '../theme';\nimport { ANSI } from '../ansi';\nimport { EditorPrompt } from './editor';\n\nexport class DiffPrompt extends Prompt<string, DiffOptions> {\n private activeAction: number = 0; // 0: Original, 1: Modified, 2: Edit\n private actions = ['Use Original', 'Use Modified', 'Edit'];\n\n constructor(options: DiffOptions) {\n super(options);\n }\n\n protected render(_firstRender: boolean) {\n let output = `${theme.title}${this.options.message}${ANSI.RESET}\\n`;\n\n // Render Diff\n const originalLines = this.options.original ? this.options.original.split('\\n') : [];\n const modifiedLines = this.options.modified ? this.options.modified.split('\\n') : [];\n\n const width = Math.max(40, (this.stdout.columns || 80) - 4);\n const borderTop = `${ANSI.FG_GRAY}┌${'─'.repeat(width)}┐${ANSI.RESET}`;\n const borderMid = `${ANSI.FG_GRAY}├${'─'.repeat(width)}┤${ANSI.RESET}`;\n const borderBot = `${ANSI.FG_GRAY}└${'─'.repeat(width)}┘${ANSI.RESET}`;\n\n output += borderTop + '\\n';\n\n // Original (Red)\n if (originalLines.length === 0) {\n output += `${ANSI.FG_GRAY}│ ${ANSI.DIM}(empty)${ANSI.RESET}\\n`;\n } else {\n originalLines.forEach(line => {\n const truncated = this.truncate(line, width - 4);\n output += `${ANSI.FG_GRAY}│ ${ANSI.FG_RED}- ${truncated}${ANSI.RESET}\\n`;\n });\n }\n\n output += borderMid + '\\n';\n\n // Modified (Green)\n if (modifiedLines.length === 0) {\n output += `${ANSI.FG_GRAY}│ ${ANSI.DIM}(empty)${ANSI.RESET}\\n`;\n } else {\n modifiedLines.forEach(line => {\n const truncated = this.truncate(line, width - 4);\n output += `${ANSI.FG_GRAY}│ ${ANSI.FG_GREEN}+ ${truncated}${ANSI.RESET}\\n`;\n });\n }\n\n output += borderBot + '\\n';\n\n // Render Actions\n output += '\\n';\n this.actions.forEach((action, index) => {\n if (index === this.activeAction) {\n output += `${ANSI.REVERSE} ${action} ${ANSI.RESET} `;\n } else {\n output += `[ ${action} ] `;\n }\n });\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string, _key: Buffer) {\n if (this.isLeft(char)) {\n this.activeAction = (this.activeAction - 1 + this.actions.length) % this.actions.length;\n this.render(false);\n } else if (this.isRight(char)) {\n this.activeAction = (this.activeAction + 1) % this.actions.length;\n this.render(false);\n } else if (char === '\\r' || char === '\\n') {\n this.handleSubmit();\n }\n }\n\n private handleSubmit() {\n if (this.activeAction === 0) {\n this.submit(this.options.original);\n } else if (this.activeAction === 1) {\n this.submit(this.options.modified);\n } else {\n // Edit\n this.cleanup(); // Stop listening to input for this prompt\n\n // Prepare initial content for editor\n const initial = `<<<<<<< ORIGINAL\n${this.options.original}\n=======\n${this.options.modified}\n>>>>>>> MODIFIED`;\n\n // We delegate to EditorPrompt\n new EditorPrompt({\n message: 'Resolve conflict (Edit)',\n initial: initial,\n extension: '.txt',\n waitUserInput: false // Launch immediately\n }).run().then(result => {\n this.submit(result);\n }).catch(_err => {\n this.submit(initial);\n });\n }\n }\n}\n"],"names":["DiffPrompt","Prompt","render","_firstRender","output","theme","title","options","message","ANSI","RESET","originalLines","original","split","modifiedLines","modified","width","Math","max","stdout","columns","borderTop","FG_GRAY","repeat","borderMid","borderBot","length","DIM","forEach","line","truncated","truncate","FG_RED","FG_GREEN","actions","action","index","activeAction","REVERSE","renderFrame","handleInput","char","_key","isLeft","isRight","handleSubmit","submit","cleanup","initial","EditorPrompt","extension","waitUserInput","run","then","result","catch","_err"],"mappings":"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"}
|
|
@@ -1,51 +1,44 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
}
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "DrawPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return DrawPrompt;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _base = require("../base");
|
|
12
|
+
const _theme = require("../theme");
|
|
13
|
+
const _ansi = require("../ansi");
|
|
14
|
+
function _define_property(obj, key, value) {
|
|
15
|
+
if (key in obj) {
|
|
16
|
+
Object.defineProperty(obj, key, {
|
|
17
|
+
value: value,
|
|
18
|
+
enumerable: true,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true
|
|
21
|
+
});
|
|
22
|
+
} else {
|
|
23
|
+
obj[key] = value;
|
|
26
24
|
}
|
|
25
|
+
return obj;
|
|
26
|
+
}
|
|
27
|
+
let DrawPrompt = class DrawPrompt extends _base.Prompt {
|
|
27
28
|
getBrailleChar(x, y) {
|
|
28
29
|
const baseX = x * 2;
|
|
29
30
|
const baseY = y * 4;
|
|
30
31
|
let code = 0x2800; // Base Braille
|
|
31
32
|
// Column 0
|
|
32
|
-
if (this.getPixel(baseX, baseY))
|
|
33
|
-
|
|
34
|
-
if (this.getPixel(baseX, baseY +
|
|
35
|
-
|
|
36
|
-
if (this.getPixel(baseX, baseY + 2))
|
|
37
|
-
code |= 0x4; // Dot 3
|
|
38
|
-
if (this.getPixel(baseX, baseY + 3))
|
|
39
|
-
code |= 0x40; // Dot 7 (Bottom-left)
|
|
33
|
+
if (this.getPixel(baseX, baseY)) code |= 0x1; // Dot 1
|
|
34
|
+
if (this.getPixel(baseX, baseY + 1)) code |= 0x2; // Dot 2
|
|
35
|
+
if (this.getPixel(baseX, baseY + 2)) code |= 0x4; // Dot 3
|
|
36
|
+
if (this.getPixel(baseX, baseY + 3)) code |= 0x40; // Dot 7 (Bottom-left)
|
|
40
37
|
// Column 1
|
|
41
|
-
if (this.getPixel(baseX + 1, baseY))
|
|
42
|
-
|
|
43
|
-
if (this.getPixel(baseX + 1, baseY +
|
|
44
|
-
|
|
45
|
-
if (this.getPixel(baseX + 1, baseY + 2))
|
|
46
|
-
code |= 0x20; // Dot 6
|
|
47
|
-
if (this.getPixel(baseX + 1, baseY + 3))
|
|
48
|
-
code |= 0x80; // Dot 8 (Bottom-right)
|
|
38
|
+
if (this.getPixel(baseX + 1, baseY)) code |= 0x8; // Dot 4
|
|
39
|
+
if (this.getPixel(baseX + 1, baseY + 1)) code |= 0x10; // Dot 5
|
|
40
|
+
if (this.getPixel(baseX + 1, baseY + 2)) code |= 0x20; // Dot 6
|
|
41
|
+
if (this.getPixel(baseX + 1, baseY + 3)) code |= 0x80; // Dot 8 (Bottom-right)
|
|
49
42
|
return String.fromCharCode(code);
|
|
50
43
|
}
|
|
51
44
|
getPixel(x, y) {
|
|
@@ -60,60 +53,51 @@ class DrawPrompt extends base_1.Prompt {
|
|
|
60
53
|
}
|
|
61
54
|
}
|
|
62
55
|
render(_firstRender) {
|
|
63
|
-
let output = `${
|
|
64
|
-
output += `${
|
|
65
|
-
for
|
|
56
|
+
let output = `${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}\n`;
|
|
57
|
+
output += `${_ansi.ANSI.FG_GRAY}┌${'─'.repeat(this.options.width + 2)}┐${_ansi.ANSI.RESET}\n`;
|
|
58
|
+
for(let y = 0; y < this.options.height; y++){
|
|
66
59
|
let line = '';
|
|
67
|
-
for
|
|
60
|
+
for(let x = 0; x < this.options.width; x++){
|
|
68
61
|
const char = this.getBrailleChar(x, y);
|
|
69
62
|
// Highlight cursor position (pixel level approximation)
|
|
70
63
|
// If cursor is within this character block
|
|
71
|
-
const containsCursor = Math.floor(this.cursorX / 2) === x &&
|
|
72
|
-
Math.floor(this.cursorY / 4) === y;
|
|
64
|
+
const containsCursor = Math.floor(this.cursorX / 2) === x && Math.floor(this.cursorY / 4) === y;
|
|
73
65
|
if (containsCursor) {
|
|
74
|
-
line +=
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
66
|
+
line += _ansi.ANSI.REVERSE + char + _ansi.ANSI.RESET;
|
|
67
|
+
} else {
|
|
77
68
|
line += char;
|
|
78
69
|
}
|
|
79
70
|
}
|
|
80
|
-
output += `${
|
|
71
|
+
output += `${_ansi.ANSI.FG_GRAY}│ ${_ansi.ANSI.RESET}${line} ${_ansi.ANSI.FG_GRAY}│${_ansi.ANSI.RESET}\n`;
|
|
81
72
|
}
|
|
82
|
-
output += `${
|
|
83
|
-
output += `\n${
|
|
73
|
+
output += `${_ansi.ANSI.FG_GRAY}└${'─'.repeat(this.options.width + 2)}┘${_ansi.ANSI.RESET}\n`;
|
|
74
|
+
output += `\n${_ansi.ANSI.FG_GRAY}(Arrows: move, Space: toggle, Mouse: drag, 'c': clear, 'i': invert, Enter: done)${_ansi.ANSI.RESET}`;
|
|
84
75
|
this.renderFrame(output);
|
|
85
76
|
}
|
|
86
77
|
handleInput(char, _key) {
|
|
87
78
|
if (this.isLeft(char)) {
|
|
88
79
|
this.cursorX = Math.max(0, this.cursorX - 1);
|
|
89
80
|
this.render(false);
|
|
90
|
-
}
|
|
91
|
-
else if (this.isRight(char)) {
|
|
81
|
+
} else if (this.isRight(char)) {
|
|
92
82
|
this.cursorX = Math.min(this.gridWidth - 1, this.cursorX + 1);
|
|
93
83
|
this.render(false);
|
|
94
|
-
}
|
|
95
|
-
else if (this.isUp(char)) {
|
|
84
|
+
} else if (this.isUp(char)) {
|
|
96
85
|
this.cursorY = Math.max(0, this.cursorY - 1);
|
|
97
86
|
this.render(false);
|
|
98
|
-
}
|
|
99
|
-
else if (this.isDown(char)) {
|
|
87
|
+
} else if (this.isDown(char)) {
|
|
100
88
|
this.cursorY = Math.min(this.gridHeight - 1, this.cursorY + 1);
|
|
101
89
|
this.render(false);
|
|
102
|
-
}
|
|
103
|
-
else if (char === ' ') {
|
|
90
|
+
} else if (char === ' ') {
|
|
104
91
|
const current = this.getPixel(this.cursorX, this.cursorY);
|
|
105
92
|
this.setPixel(this.cursorX, this.cursorY, !current);
|
|
106
93
|
this.render(false);
|
|
107
|
-
}
|
|
108
|
-
else if (char === 'c') {
|
|
94
|
+
} else if (char === 'c') {
|
|
109
95
|
this.clearGrid();
|
|
110
96
|
this.render(false);
|
|
111
|
-
}
|
|
112
|
-
else if (char === 'i') {
|
|
97
|
+
} else if (char === 'i') {
|
|
113
98
|
this.invertGrid();
|
|
114
99
|
this.render(false);
|
|
115
|
-
}
|
|
116
|
-
else if (char === '\r' || char === '\n') {
|
|
100
|
+
} else if (char === '\r' || char === '\n') {
|
|
117
101
|
this.handleSubmit();
|
|
118
102
|
}
|
|
119
103
|
}
|
|
@@ -135,7 +119,7 @@ class DrawPrompt extends base_1.Prompt {
|
|
|
135
119
|
this.cursorX = Math.max(0, Math.min(this.gridWidth - 1, this.cursorX));
|
|
136
120
|
this.cursorY = Math.max(0, Math.min(this.gridHeight - 1, this.cursorY));
|
|
137
121
|
// Draw if pressing (Left Button = 0)
|
|
138
|
-
if (event.action === 'press' ||
|
|
122
|
+
if (event.action === 'press' || event.action === 'move' && event.button === 0) {
|
|
139
123
|
this.setPixel(this.cursorX, this.cursorY, true);
|
|
140
124
|
}
|
|
141
125
|
// Eraser (Right Button = 2)
|
|
@@ -144,25 +128,27 @@ class DrawPrompt extends base_1.Prompt {
|
|
|
144
128
|
}
|
|
145
129
|
this.render(false);
|
|
146
130
|
}
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
131
|
+
} else {
|
|
149
132
|
if (event.action === 'press' && event.button === 0) {
|
|
150
133
|
this.setPixel(this.cursorX, this.cursorY, true);
|
|
151
134
|
this.render(false);
|
|
152
135
|
}
|
|
153
136
|
}
|
|
154
|
-
this.lastMouse = {
|
|
137
|
+
this.lastMouse = {
|
|
138
|
+
x: event.x,
|
|
139
|
+
y: event.y
|
|
140
|
+
};
|
|
155
141
|
}
|
|
156
142
|
clearGrid() {
|
|
157
|
-
for
|
|
158
|
-
for
|
|
143
|
+
for(let y = 0; y < this.gridHeight; y++){
|
|
144
|
+
for(let x = 0; x < this.gridWidth; x++){
|
|
159
145
|
this.grid[y][x] = false;
|
|
160
146
|
}
|
|
161
147
|
}
|
|
162
148
|
}
|
|
163
149
|
invertGrid() {
|
|
164
|
-
for
|
|
165
|
-
for
|
|
150
|
+
for(let y = 0; y < this.gridHeight; y++){
|
|
151
|
+
for(let x = 0; x < this.gridWidth; x++){
|
|
166
152
|
this.grid[y][x] = !this.grid[y][x];
|
|
167
153
|
}
|
|
168
154
|
}
|
|
@@ -171,18 +157,35 @@ class DrawPrompt extends base_1.Prompt {
|
|
|
171
157
|
if (this.options.exportType === 'text') {
|
|
172
158
|
// Render to string
|
|
173
159
|
let result = '';
|
|
174
|
-
for
|
|
175
|
-
for
|
|
160
|
+
for(let y = 0; y < this.options.height; y++){
|
|
161
|
+
for(let x = 0; x < this.options.width; x++){
|
|
176
162
|
result += this.getBrailleChar(x, y);
|
|
177
163
|
}
|
|
178
164
|
result += '\n';
|
|
179
165
|
}
|
|
180
166
|
this.submit(result.trim());
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
167
|
+
} else {
|
|
183
168
|
// Default: return matrix
|
|
184
169
|
this.submit(this.grid);
|
|
185
170
|
}
|
|
186
171
|
}
|
|
187
|
-
|
|
188
|
-
|
|
172
|
+
constructor(options){
|
|
173
|
+
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);
|
|
174
|
+
this.gridWidth = options.width * 2;
|
|
175
|
+
this.gridHeight = options.height * 4;
|
|
176
|
+
if (options.initial) {
|
|
177
|
+
// Deep copy to avoid mutating original if passed
|
|
178
|
+
this.grid = options.initial.map((row)=>[
|
|
179
|
+
...row
|
|
180
|
+
]);
|
|
181
|
+
} else {
|
|
182
|
+
this.grid = [];
|
|
183
|
+
for(let y = 0; y < this.gridHeight; y++){
|
|
184
|
+
const row = new Array(this.gridWidth).fill(false);
|
|
185
|
+
this.grid.push(row);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
//# sourceMappingURL=draw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/draw.ts"],"sourcesContent":["import { Prompt } from '../base';\nimport { DrawOptions, MouseEvent } from '../types';\nimport { theme } from '../theme';\nimport { ANSI } from '../ansi';\n\nexport class DrawPrompt extends Prompt<string | boolean[][], DrawOptions> {\n private grid: boolean[][];\n private cursorX: number = 0;\n private cursorY: number = 0;\n private gridWidth: number;\n private gridHeight: number;\n private lastMouse: { x: number, y: number } | null = null;\n\n constructor(options: DrawOptions) {\n super(options);\n this.gridWidth = options.width * 2;\n this.gridHeight = options.height * 4;\n\n if (options.initial) {\n // Deep copy to avoid mutating original if passed\n this.grid = options.initial.map(row => [...row]);\n } else {\n this.grid = [];\n for (let y = 0; y < this.gridHeight; y++) {\n const row = new Array(this.gridWidth).fill(false);\n this.grid.push(row);\n }\n }\n }\n\n private getBrailleChar(x: number, y: number): string {\n const baseX = x * 2;\n const baseY = y * 4;\n let code = 0x2800; // Base Braille\n\n // Column 0\n if (this.getPixel(baseX, baseY)) code |= 0x1; // Dot 1\n if (this.getPixel(baseX, baseY + 1)) code |= 0x2; // Dot 2\n if (this.getPixel(baseX, baseY + 2)) code |= 0x4; // Dot 3\n if (this.getPixel(baseX, baseY + 3)) code |= 0x40; // Dot 7 (Bottom-left)\n\n // Column 1\n if (this.getPixel(baseX + 1, baseY)) code |= 0x8; // Dot 4\n if (this.getPixel(baseX + 1, baseY + 1)) code |= 0x10; // Dot 5\n if (this.getPixel(baseX + 1, baseY + 2)) code |= 0x20; // Dot 6\n if (this.getPixel(baseX + 1, baseY + 3)) code |= 0x80; // Dot 8 (Bottom-right)\n\n return String.fromCharCode(code);\n }\n\n private getPixel(x: number, y: number): boolean {\n if (y >= 0 && y < this.gridHeight && x >= 0 && x < this.gridWidth) {\n return this.grid[y][x];\n }\n return false;\n }\n\n private setPixel(x: number, y: number, val: boolean) {\n if (y >= 0 && y < this.gridHeight && x >= 0 && x < this.gridWidth) {\n this.grid[y][x] = val;\n }\n }\n\n protected render(_firstRender: boolean) {\n let output = `${theme.title}${this.options.message}${ANSI.RESET}\\n`;\n\n output += `${ANSI.FG_GRAY}┌${'─'.repeat(this.options.width + 2)}┐${ANSI.RESET}\\n`;\n\n for (let y = 0; y < this.options.height; y++) {\n let line = '';\n for (let x = 0; x < this.options.width; x++) {\n const char = this.getBrailleChar(x, y);\n\n // Highlight cursor position (pixel level approximation)\n // If cursor is within this character block\n const containsCursor =\n Math.floor(this.cursorX / 2) === x &&\n Math.floor(this.cursorY / 4) === y;\n\n if (containsCursor) {\n line += ANSI.REVERSE + char + ANSI.RESET;\n } else {\n line += char;\n }\n }\n output += `${ANSI.FG_GRAY}│ ${ANSI.RESET}${line} ${ANSI.FG_GRAY}│${ANSI.RESET}\\n`;\n }\n\n output += `${ANSI.FG_GRAY}└${'─'.repeat(this.options.width + 2)}┘${ANSI.RESET}\\n`;\n\n output += `\\n${ANSI.FG_GRAY}(Arrows: move, Space: toggle, Mouse: drag, 'c': clear, 'i': invert, Enter: done)${ANSI.RESET}`;\n this.renderFrame(output);\n }\n\n protected handleInput(char: string, _key: Buffer) {\n if (this.isLeft(char)) {\n this.cursorX = Math.max(0, this.cursorX - 1);\n this.render(false);\n } else if (this.isRight(char)) {\n this.cursorX = Math.min(this.gridWidth - 1, this.cursorX + 1);\n this.render(false);\n } else if (this.isUp(char)) {\n this.cursorY = Math.max(0, this.cursorY - 1);\n this.render(false);\n } else if (this.isDown(char)) {\n this.cursorY = Math.min(this.gridHeight - 1, this.cursorY + 1);\n this.render(false);\n } else if (char === ' ') {\n const current = this.getPixel(this.cursorX, this.cursorY);\n this.setPixel(this.cursorX, this.cursorY, !current);\n this.render(false);\n } else if (char === 'c') {\n this.clearGrid();\n this.render(false);\n } else if (char === 'i') {\n this.invertGrid();\n this.render(false);\n } else if (char === '\\r' || char === '\\n') {\n this.handleSubmit();\n }\n }\n\n protected handleMouse(event: MouseEvent) {\n if (event.action === 'release') {\n this.lastMouse = null;\n return;\n }\n\n if (this.lastMouse) {\n const dx = event.x - this.lastMouse.x;\n const dy = event.y - this.lastMouse.y;\n\n // Relative movement: scale to grid density\n // X: 1 char = 2 pixels\n // Y: 1 char = 4 pixels\n if (dx !== 0 || dy !== 0) {\n this.cursorX += dx * 2;\n this.cursorY += dy * 4;\n\n // Clamp\n this.cursorX = Math.max(0, Math.min(this.gridWidth - 1, this.cursorX));\n this.cursorY = Math.max(0, Math.min(this.gridHeight - 1, this.cursorY));\n\n // Draw if pressing (Left Button = 0)\n if (event.action === 'press' || (event.action === 'move' && event.button === 0)) {\n this.setPixel(this.cursorX, this.cursorY, true);\n }\n // Eraser (Right Button = 2)\n if ((event.action === 'press' || event.action === 'move') && event.button === 2) {\n this.setPixel(this.cursorX, this.cursorY, false);\n }\n\n this.render(false);\n }\n } else {\n if (event.action === 'press' && event.button === 0) {\n this.setPixel(this.cursorX, this.cursorY, true);\n this.render(false);\n }\n }\n\n this.lastMouse = { x: event.x, y: event.y };\n }\n\n private clearGrid() {\n for (let y = 0; y < this.gridHeight; y++) {\n for (let x = 0; x < this.gridWidth; x++) {\n this.grid[y][x] = false;\n }\n }\n }\n\n private invertGrid() {\n for (let y = 0; y < this.gridHeight; y++) {\n for (let x = 0; x < this.gridWidth; x++) {\n this.grid[y][x] = !this.grid[y][x];\n }\n }\n }\n\n private handleSubmit() {\n if (this.options.exportType === 'text') {\n // Render to string\n let result = '';\n for (let y = 0; y < this.options.height; y++) {\n for (let x = 0; x < this.options.width; x++) {\n result += this.getBrailleChar(x, y);\n }\n result += '\\n';\n }\n this.submit(result.trim());\n } else {\n // Default: return matrix\n this.submit(this.grid);\n }\n }\n}\n"],"names":["DrawPrompt","Prompt","getBrailleChar","x","y","baseX","baseY","code","getPixel","String","fromCharCode","gridHeight","gridWidth","grid","setPixel","val","render","_firstRender","output","theme","title","options","message","ANSI","RESET","FG_GRAY","repeat","width","height","line","char","containsCursor","Math","floor","cursorX","cursorY","REVERSE","renderFrame","handleInput","_key","isLeft","max","isRight","min","isUp","isDown","current","clearGrid","invertGrid","handleSubmit","handleMouse","event","action","lastMouse","dx","dy","button","exportType","result","submit","trim","initial","map","row","Array","fill","push"],"mappings":"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"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "EditorPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return EditorPrompt;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _fs = /*#__PURE__*/ _interop_require_wildcard(require("fs"));
|
|
12
|
+
const _os = /*#__PURE__*/ _interop_require_wildcard(require("os"));
|
|
13
|
+
const _path = /*#__PURE__*/ _interop_require_wildcard(require("path"));
|
|
14
|
+
const _child_process = require("child_process");
|
|
15
|
+
const _base = require("../base");
|
|
16
|
+
const _theme = require("../theme");
|
|
17
|
+
const _symbols = require("../symbols");
|
|
18
|
+
const _ansi = require("../ansi");
|
|
19
|
+
function _define_property(obj, key, value) {
|
|
20
|
+
if (key in obj) {
|
|
21
|
+
Object.defineProperty(obj, key, {
|
|
22
|
+
value: value,
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
writable: true
|
|
26
|
+
});
|
|
27
|
+
} else {
|
|
28
|
+
obj[key] = value;
|
|
29
|
+
}
|
|
30
|
+
return obj;
|
|
31
|
+
}
|
|
32
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
33
|
+
if (typeof WeakMap !== "function") return null;
|
|
34
|
+
var cacheBabelInterop = new WeakMap();
|
|
35
|
+
var cacheNodeInterop = new WeakMap();
|
|
36
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
37
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
38
|
+
})(nodeInterop);
|
|
39
|
+
}
|
|
40
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
41
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
42
|
+
return obj;
|
|
43
|
+
}
|
|
44
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
45
|
+
return {
|
|
46
|
+
default: obj
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
50
|
+
if (cache && cache.has(obj)) {
|
|
51
|
+
return cache.get(obj);
|
|
52
|
+
}
|
|
53
|
+
var newObj = {
|
|
54
|
+
__proto__: null
|
|
55
|
+
};
|
|
56
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
57
|
+
for(var key in obj){
|
|
58
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
59
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
60
|
+
if (desc && (desc.get || desc.set)) {
|
|
61
|
+
Object.defineProperty(newObj, key, desc);
|
|
62
|
+
} else {
|
|
63
|
+
newObj[key] = obj[key];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
newObj.default = obj;
|
|
68
|
+
if (cache) {
|
|
69
|
+
cache.set(obj, newObj);
|
|
70
|
+
}
|
|
71
|
+
return newObj;
|
|
72
|
+
}
|
|
73
|
+
let EditorPrompt = class EditorPrompt extends _base.Prompt {
|
|
74
|
+
cleanup() {
|
|
75
|
+
if (this.tempFilePath) {
|
|
76
|
+
try {
|
|
77
|
+
if (_fs.existsSync(this.tempFilePath)) {
|
|
78
|
+
_fs.unlinkSync(this.tempFilePath);
|
|
79
|
+
}
|
|
80
|
+
} catch (_error) {
|
|
81
|
+
// Ignore cleanup errors
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
super.cleanup();
|
|
85
|
+
}
|
|
86
|
+
render(firstRender) {
|
|
87
|
+
if (this.status === 'editing') {
|
|
88
|
+
return; // Don't render while editor is open (stdio inherited)
|
|
89
|
+
}
|
|
90
|
+
const icon = this.status === 'done' ? _theme.theme.success + _symbols.symbols.tick : _theme.theme.main + '?';
|
|
91
|
+
const message = `${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}`;
|
|
92
|
+
const hint = this.options.waitUserInput ? ` ${_theme.theme.muted}[Press <Enter> to launch editor]${_ansi.ANSI.RESET}` : ` ${_theme.theme.muted}[Launching editor...]${_ansi.ANSI.RESET}`;
|
|
93
|
+
let output = `${icon} ${_ansi.ANSI.BOLD}${message}${_ansi.ANSI.RESET}${hint}`;
|
|
94
|
+
if (this.errorMsg) {
|
|
95
|
+
output += `\n${_theme.theme.error}>> ${this.errorMsg}${_ansi.ANSI.RESET}`;
|
|
96
|
+
}
|
|
97
|
+
this.renderFrame(output);
|
|
98
|
+
// Auto-launch handling
|
|
99
|
+
if (firstRender && this.options.waitUserInput === false) {
|
|
100
|
+
// We need to delay slightly to ensure the render frame is flushed
|
|
101
|
+
// and raw mode setup is complete from .run()
|
|
102
|
+
setTimeout(()=>{
|
|
103
|
+
this.spawnEditor();
|
|
104
|
+
}, 50);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
handleInput(char) {
|
|
108
|
+
if (this.status !== 'pending') return;
|
|
109
|
+
// Enter
|
|
110
|
+
if (char === '\r' || char === '\n') {
|
|
111
|
+
this.spawnEditor();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
resolveEditor() {
|
|
115
|
+
// 1. Env vars
|
|
116
|
+
const envEditor = process.env.VISUAL || process.env.EDITOR;
|
|
117
|
+
if (envEditor) {
|
|
118
|
+
const parts = envEditor.split(' ');
|
|
119
|
+
return {
|
|
120
|
+
cmd: parts[0],
|
|
121
|
+
args: parts.slice(1)
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
// 2. OS specific
|
|
125
|
+
if (process.platform === 'win32') {
|
|
126
|
+
// Priority: notepad -> code -> wordpad
|
|
127
|
+
return {
|
|
128
|
+
cmd: 'notepad',
|
|
129
|
+
args: []
|
|
130
|
+
};
|
|
131
|
+
} else {
|
|
132
|
+
// Unix/Linux/Mac
|
|
133
|
+
// Priority: vim -> nano -> vi
|
|
134
|
+
// We'll stick to 'vim' as the default safe bet if we can't detect.
|
|
135
|
+
// A more robust solution would check paths, but for now we assume 'vim'.
|
|
136
|
+
return {
|
|
137
|
+
cmd: 'vim',
|
|
138
|
+
args: []
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
spawnEditor() {
|
|
143
|
+
this.status = 'editing';
|
|
144
|
+
// 1. Prepare Temp File
|
|
145
|
+
const ext = this.options.extension || '.txt';
|
|
146
|
+
// Ensure extension has dot
|
|
147
|
+
const safeExt = ext.startsWith('.') ? ext : '.' + ext;
|
|
148
|
+
const filename = `mep-editor-${Date.now()}-${Math.floor(Math.random() * 1000)}${safeExt}`;
|
|
149
|
+
this.tempFilePath = _path.join(_os.tmpdir(), filename);
|
|
150
|
+
const initialContent = this.options.initial || '';
|
|
151
|
+
try {
|
|
152
|
+
_fs.writeFileSync(this.tempFilePath, initialContent, 'utf8');
|
|
153
|
+
} catch (e) {
|
|
154
|
+
this.errorMsg = `Failed to create temp file: ${e.message}`;
|
|
155
|
+
this.status = 'pending';
|
|
156
|
+
this.render(false);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// 2. Resolve Editor
|
|
160
|
+
const { cmd, args } = this.resolveEditor();
|
|
161
|
+
const editorArgs = [
|
|
162
|
+
...args,
|
|
163
|
+
this.tempFilePath
|
|
164
|
+
];
|
|
165
|
+
// 3. Pause Mep
|
|
166
|
+
// Temporarily disable mouse tracking if it was enabled
|
|
167
|
+
const shouldEnableMouse = this.options.mouse !== false && this.capabilities.hasMouse;
|
|
168
|
+
if (shouldEnableMouse) {
|
|
169
|
+
this.print(_ansi.ANSI.DISABLE_MOUSE);
|
|
170
|
+
}
|
|
171
|
+
// Pause stdin and raw mode to allow child process to take over TTY
|
|
172
|
+
this.stdin.setRawMode(false);
|
|
173
|
+
this.stdin.pause();
|
|
174
|
+
// 4. Spawn
|
|
175
|
+
const child = (0, _child_process.spawn)(cmd, editorArgs, {
|
|
176
|
+
stdio: 'inherit',
|
|
177
|
+
shell: true
|
|
178
|
+
});
|
|
179
|
+
child.on('error', (err)=>{
|
|
180
|
+
this.restoreMep();
|
|
181
|
+
this.status = 'pending';
|
|
182
|
+
this.errorMsg = `Could not launch editor '${cmd}': ${err.message}`;
|
|
183
|
+
this.render(false);
|
|
184
|
+
});
|
|
185
|
+
child.on('exit', (code)=>{
|
|
186
|
+
// 5. Read Result
|
|
187
|
+
let content = initialContent;
|
|
188
|
+
try {
|
|
189
|
+
if (this.tempFilePath && _fs.existsSync(this.tempFilePath)) {
|
|
190
|
+
content = _fs.readFileSync(this.tempFilePath, 'utf8');
|
|
191
|
+
_fs.unlinkSync(this.tempFilePath); // Cleanup
|
|
192
|
+
this.tempFilePath = null; // Mark as cleaned
|
|
193
|
+
}
|
|
194
|
+
} catch (_e) {
|
|
195
|
+
// Ignore read/delete errors
|
|
196
|
+
}
|
|
197
|
+
this.restoreMep();
|
|
198
|
+
if (code !== 0) {
|
|
199
|
+
this.status = 'pending';
|
|
200
|
+
this.errorMsg = `Editor exited with code ${code}`;
|
|
201
|
+
this.render(false);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
// Success
|
|
205
|
+
this.status = 'done';
|
|
206
|
+
if (content.endsWith('\n')) {
|
|
207
|
+
content = content.slice(0, -1);
|
|
208
|
+
}
|
|
209
|
+
if (content.endsWith('\r')) {
|
|
210
|
+
content = content.slice(0, -1);
|
|
211
|
+
}
|
|
212
|
+
this.submit(content);
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
restoreMep() {
|
|
216
|
+
this.stdin.resume();
|
|
217
|
+
this.stdin.setRawMode(true);
|
|
218
|
+
// Re-enable mouse if it was enabled
|
|
219
|
+
const shouldEnableMouse = this.options.mouse !== false && this.capabilities.hasMouse;
|
|
220
|
+
if (shouldEnableMouse) {
|
|
221
|
+
this.print(_ansi.ANSI.SET_ANY_EVENT_MOUSE + _ansi.ANSI.SET_SGR_EXT_MODE_MOUSE);
|
|
222
|
+
}
|
|
223
|
+
this.print(_ansi.ANSI.HIDE_CURSOR); // Ensure cursor is hidden again for Mep
|
|
224
|
+
}
|
|
225
|
+
constructor(options){
|
|
226
|
+
super(options), _define_property(this, "errorMsg", ''), _define_property(this, "status", 'pending'), _define_property(this, "tempFilePath", null);
|
|
227
|
+
// Default waitUserInput to true if not specified
|
|
228
|
+
if (this.options.waitUserInput === undefined) {
|
|
229
|
+
this.options.waitUserInput = true;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
//# sourceMappingURL=editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/editor.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { spawn } from 'child_process';\nimport { Prompt } from '../base';\nimport { EditorOptions } from '../types';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { ANSI } from '../ansi';\n\nexport class EditorPrompt extends Prompt<string, EditorOptions> {\n private errorMsg: string = '';\n private status: 'pending' | 'editing' | 'done' = 'pending';\n private tempFilePath: string | null = null;\n\n constructor(options: EditorOptions) {\n super(options);\n // Default waitUserInput to true if not specified\n if (this.options.waitUserInput === undefined) {\n this.options.waitUserInput = true;\n }\n }\n\n protected cleanup() {\n if (this.tempFilePath) {\n try {\n if (fs.existsSync(this.tempFilePath)) {\n fs.unlinkSync(this.tempFilePath);\n }\n } catch (_error) {\n // Ignore cleanup errors\n }\n }\n super.cleanup();\n }\n\n protected render(firstRender: boolean) {\n if (this.status === 'editing') {\n return; // Don't render while editor is open (stdio inherited)\n }\n\n const icon = this.status === 'done' ? theme.success + symbols.tick : theme.main + '?';\n const message = `${theme.title}${this.options.message}${ANSI.RESET}`;\n const hint = this.options.waitUserInput\n ? ` ${theme.muted}[Press <Enter> to launch editor]${ANSI.RESET}`\n : ` ${theme.muted}[Launching editor...]${ANSI.RESET}`;\n\n let output = `${icon} ${ANSI.BOLD}${message}${ANSI.RESET}${hint}`;\n\n if (this.errorMsg) {\n output += `\\n${theme.error}>> ${this.errorMsg}${ANSI.RESET}`;\n }\n\n this.renderFrame(output);\n\n // Auto-launch handling\n if (firstRender && this.options.waitUserInput === false) {\n // We need to delay slightly to ensure the render frame is flushed\n // and raw mode setup is complete from .run()\n setTimeout(() => {\n this.spawnEditor();\n }, 50);\n }\n }\n\n protected handleInput(char: string) {\n if (this.status !== 'pending') return;\n\n // Enter\n if (char === '\\r' || char === '\\n') {\n this.spawnEditor();\n }\n }\n\n private resolveEditor(): { cmd: string, args: string[] } {\n // 1. Env vars\n const envEditor = process.env.VISUAL || process.env.EDITOR;\n if (envEditor) {\n const parts = envEditor.split(' ');\n return { cmd: parts[0], args: parts.slice(1) };\n }\n\n // 2. OS specific\n if (process.platform === 'win32') {\n // Priority: notepad -> code -> wordpad\n return { cmd: 'notepad', args: [] };\n } else {\n // Unix/Linux/Mac\n // Priority: vim -> nano -> vi\n // We'll stick to 'vim' as the default safe bet if we can't detect.\n // A more robust solution would check paths, but for now we assume 'vim'.\n return { cmd: 'vim', args: [] };\n }\n }\n\n private spawnEditor() {\n this.status = 'editing';\n\n // 1. Prepare Temp File\n const ext = this.options.extension || '.txt';\n // Ensure extension has dot\n const safeExt = ext.startsWith('.') ? ext : '.' + ext;\n const filename = `mep-editor-${Date.now()}-${Math.floor(Math.random() * 1000)}${safeExt}`;\n this.tempFilePath = path.join(os.tmpdir(), filename);\n const initialContent = this.options.initial || '';\n\n try {\n fs.writeFileSync(this.tempFilePath, initialContent, 'utf8');\n } catch (e) {\n this.errorMsg = `Failed to create temp file: ${(e as Error).message}`;\n this.status = 'pending';\n this.render(false);\n return;\n }\n\n // 2. Resolve Editor\n const { cmd, args } = this.resolveEditor();\n const editorArgs = [...args, this.tempFilePath];\n\n // 3. Pause Mep\n // Temporarily disable mouse tracking if it was enabled\n const shouldEnableMouse = (this.options as any).mouse !== false && this.capabilities.hasMouse;\n if (shouldEnableMouse) {\n this.print(ANSI.DISABLE_MOUSE);\n }\n\n // Pause stdin and raw mode to allow child process to take over TTY\n this.stdin.setRawMode(false);\n this.stdin.pause();\n\n // 4. Spawn\n const child = spawn(cmd, editorArgs, {\n stdio: 'inherit',\n shell: true\n });\n\n child.on('error', (err) => {\n this.restoreMep();\n this.status = 'pending';\n this.errorMsg = `Could not launch editor '${cmd}': ${err.message}`;\n this.render(false);\n });\n\n child.on('exit', (code) => {\n // 5. Read Result\n let content = initialContent;\n try {\n if (this.tempFilePath && fs.existsSync(this.tempFilePath)) {\n content = fs.readFileSync(this.tempFilePath, 'utf8');\n fs.unlinkSync(this.tempFilePath); // Cleanup\n this.tempFilePath = null; // Mark as cleaned\n }\n } catch (_e) {\n // Ignore read/delete errors\n }\n\n this.restoreMep();\n\n if (code !== 0) {\n this.status = 'pending';\n this.errorMsg = `Editor exited with code ${code}`;\n this.render(false);\n return;\n }\n\n // Success\n this.status = 'done';\n\n if (content.endsWith('\\n')) {\n content = content.slice(0, -1);\n }\n if (content.endsWith('\\r')) {\n content = content.slice(0, -1);\n }\n\n this.submit(content);\n });\n }\n\n private restoreMep() {\n this.stdin.resume();\n this.stdin.setRawMode(true);\n\n // Re-enable mouse if it was enabled\n const shouldEnableMouse = (this.options as any).mouse !== false && this.capabilities.hasMouse;\n if (shouldEnableMouse) {\n this.print(ANSI.SET_ANY_EVENT_MOUSE + ANSI.SET_SGR_EXT_MODE_MOUSE);\n }\n this.print(ANSI.HIDE_CURSOR); // Ensure cursor is hidden again for Mep\n }\n}\n"],"names":["EditorPrompt","Prompt","cleanup","tempFilePath","fs","existsSync","unlinkSync","_error","render","firstRender","status","icon","theme","success","symbols","tick","main","message","title","options","ANSI","RESET","hint","waitUserInput","muted","output","BOLD","errorMsg","error","renderFrame","setTimeout","spawnEditor","handleInput","char","resolveEditor","envEditor","process","env","VISUAL","EDITOR","parts","split","cmd","args","slice","platform","ext","extension","safeExt","startsWith","filename","Date","now","Math","floor","random","path","join","os","tmpdir","initialContent","initial","writeFileSync","e","editorArgs","shouldEnableMouse","mouse","capabilities","hasMouse","print","DISABLE_MOUSE","stdin","setRawMode","pause","child","spawn","stdio","shell","on","err","restoreMep","code","content","readFileSync","_e","endsWith","submit","resume","SET_ANY_EVENT_MOUSE","SET_SGR_EXT_MODE_MOUSE","HIDE_CURSOR","undefined"],"mappings":"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"}
|