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