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/tree.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { symbols } from '../symbols';\nimport { TreeOptions, TreeNode, MouseEvent } from '../types';\n\ninterface FlatNode<V> {\n node: TreeNode<V>;\n depth: number;\n parent: TreeNode<V> | null;\n}\n\nexport class TreePrompt<V> extends Prompt<V, TreeOptions<V>> {\n private cursor: number = 0;\n private expandedNodes: Set<TreeNode<V>> = new Set();\n private flatList: FlatNode<V>[] = [];\n private scrollTop: number = 0;\n private readonly pageSize: number = 15;\n\n // Icons\n private readonly ICON_CLOSED = symbols.pointer === '>' ? '+' : '▸';\n private readonly ICON_OPEN = symbols.pointer === '>' ? '-' : '▾';\n\n constructor(options: TreeOptions<V>) {\n super(options);\n this.initializeExpanded(this.options.data);\n if (this.options.initial !== undefined) {\n this.expandPathTo(this.options.initial);\n }\n this.recalculateFlatList();\n\n if (this.options.initial !== undefined) {\n const index = this.flatList.findIndex(item => item.node.value === this.options.initial);\n if (index !== -1) {\n this.cursor = index;\n }\n }\n }\n\n private expandPathTo(value: V) {\n const find = (nodes: TreeNode<V>[]): boolean => {\n for (const node of nodes) {\n if (node.value === value) return true;\n if (node.children) {\n if (find(node.children)) {\n this.expandedNodes.add(node);\n return true;\n }\n }\n }\n return false;\n };\n find(this.options.data);\n }\n\n private initializeExpanded(nodes: TreeNode<V>[]) {\n for (const node of nodes) {\n if (node.expanded) {\n this.expandedNodes.add(node);\n }\n if (node.children) {\n this.initializeExpanded(node.children);\n }\n }\n }\n\n private recalculateFlatList() {\n this.flatList = [];\n this.traverse(this.options.data, 0, null);\n if (this.cursor >= this.flatList.length) {\n this.cursor = Math.max(0, this.flatList.length - 1);\n }\n }\n\n private traverse(nodes: TreeNode<V>[], depth: number, parent: TreeNode<V> | null) {\n for (const node of nodes) {\n this.flatList.push({\n node,\n depth,\n parent\n });\n\n if (node.children && node.children.length > 0 && this.expandedNodes.has(node)) {\n this.traverse(node.children, depth + 1, node);\n }\n }\n }\n\n private toggleRecursive(node: TreeNode<V>, expand: boolean) {\n if (expand) this.expandedNodes.add(node);\n else this.expandedNodes.delete(node);\n\n if (node.children) {\n node.children.forEach(child => this.toggleRecursive(child, expand));\n }\n }\n\n protected render(_firstRender: boolean) {\n let output = `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}\\n`;\n\n if (this.flatList.length === 0) {\n output += ` ${theme.muted}No data${ANSI.RESET}`;\n this.renderFrame(output);\n return;\n }\n\n if (this.cursor < this.scrollTop) {\n this.scrollTop = this.cursor;\n } else if (this.cursor >= this.scrollTop + this.pageSize) {\n this.scrollTop = this.cursor - this.pageSize + 1;\n }\n\n const visible = this.flatList.slice(this.scrollTop, this.scrollTop + this.pageSize);\n\n visible.forEach((item, index) => {\n const actualIndex = this.scrollTop + index;\n const isSelected = actualIndex === this.cursor;\n\n const indentSize = this.options.indent || 2;\n const indentation = ' '.repeat(item.depth * indentSize);\n\n let linePrefix = '';\n if (isSelected) {\n linePrefix = `${theme.main}${symbols.pointer} `;\n } else {\n linePrefix = ' ';\n }\n\n let icon = ' ';\n const hasChildren = item.node.children && item.node.children.length > 0;\n\n if (hasChildren) {\n if (this.expandedNodes.has(item.node)) {\n icon = `${this.ICON_OPEN} `;\n } else {\n icon = `${this.ICON_CLOSED} `;\n }\n }\n\n let title = item.node.title;\n if (item.node.disabled) {\n title = `${theme.muted}${title} (disabled)${ANSI.RESET}`;\n }\n\n let line = `${indentation}${icon}${title}`;\n if (isSelected) {\n line = `${theme.main}${line}${ANSI.RESET}`;\n }\n\n output += linePrefix + line;\n if (index < visible.length - 1) output += '\\n';\n });\n\n output += `\\n${theme.muted}(Arrows: Nav, e: Expand All, c: Collapse All)${ANSI.RESET}`;\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string, _key: Buffer) {\n if (this.flatList.length === 0) return;\n\n if (this.isUp(char)) {\n this.cursor = (this.cursor - 1 + this.flatList.length) % this.flatList.length;\n this.render(false);\n return;\n }\n if (this.isDown(char)) {\n this.cursor = (this.cursor + 1) % this.flatList.length;\n this.render(false);\n return;\n }\n\n const currentItem = this.flatList[this.cursor];\n const node = currentItem.node;\n const hasChildren = node.children && node.children.length > 0;\n\n // Recursive Expand (e)\n if (char === 'e' && hasChildren) {\n this.toggleRecursive(node, true);\n this.recalculateFlatList();\n this.render(false);\n return;\n }\n\n // Recursive Collapse (c)\n if (char === 'c' && hasChildren) {\n this.toggleRecursive(node, false);\n this.recalculateFlatList();\n this.render(false);\n return;\n }\n\n if (this.isRight(char)) {\n if (hasChildren) {\n if (!this.expandedNodes.has(node)) {\n this.expandedNodes.add(node);\n this.recalculateFlatList();\n } else {\n if (this.cursor + 1 < this.flatList.length) {\n this.cursor++;\n }\n }\n this.render(false);\n return;\n }\n }\n\n if (this.isLeft(char)) {\n if (hasChildren && this.expandedNodes.has(node)) {\n this.expandedNodes.delete(node);\n this.recalculateFlatList();\n this.render(false);\n return;\n } else {\n if (currentItem.parent) {\n const parentIndex = this.flatList.findIndex(x => x.node === currentItem.parent);\n if (parentIndex !== -1) {\n this.cursor = parentIndex;\n this.render(false);\n return;\n }\n }\n }\n }\n\n if (char === ' ') {\n if (hasChildren) {\n if (this.expandedNodes.has(node)) {\n this.expandedNodes.delete(node);\n } else {\n this.expandedNodes.add(node);\n }\n this.recalculateFlatList();\n this.render(false);\n }\n return;\n }\n\n if (char === '\\r' || char === '\\n') {\n if (!node.disabled) {\n this.submit(node.value);\n }\n }\n }\n\n protected handleMouse(event: MouseEvent) {\n if (event.action === 'scroll') {\n if (event.scroll === 'up') {\n this.cursor = (this.cursor - 1 + this.flatList.length) % this.flatList.length;\n this.render(false);\n } else if (event.scroll === 'down') {\n this.cursor = (this.cursor + 1) % this.flatList.length;\n this.render(false);\n }\n }\n }\n}\n"],"names":["TreePrompt","Prompt","expandPathTo","value","find","nodes","node","children","expandedNodes","add","options","data","initializeExpanded","expanded","recalculateFlatList","flatList","traverse","cursor","length","Math","max","depth","parent","push","has","toggleRecursive","expand","delete","forEach","child","render","_firstRender","output","theme","success","ANSI","RESET","BOLD","title","message","muted","renderFrame","scrollTop","pageSize","visible","slice","item","index","actualIndex","isSelected","indentSize","indent","indentation","repeat","linePrefix","main","symbols","pointer","icon","hasChildren","ICON_OPEN","ICON_CLOSED","disabled","line","handleInput","char","_key","isUp","isDown","currentItem","isRight","isLeft","parentIndex","findIndex","x","submit","handleMouse","event","action","scroll","Set","initial","undefined"],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// src/prompts/wait.ts
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "WaitPrompt", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function() {
|
|
9
|
+
return WaitPrompt;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
const _ansi = require("../ansi");
|
|
13
|
+
const _base = require("../base");
|
|
14
|
+
const _theme = require("../theme");
|
|
15
|
+
function _define_property(obj, key, value) {
|
|
16
|
+
if (key in obj) {
|
|
17
|
+
Object.defineProperty(obj, key, {
|
|
18
|
+
value: value,
|
|
19
|
+
enumerable: true,
|
|
20
|
+
configurable: true,
|
|
21
|
+
writable: true
|
|
22
|
+
});
|
|
23
|
+
} else {
|
|
24
|
+
obj[key] = value;
|
|
25
|
+
}
|
|
26
|
+
return obj;
|
|
27
|
+
}
|
|
28
|
+
let WaitPrompt = class WaitPrompt extends _base.Prompt {
|
|
29
|
+
run() {
|
|
30
|
+
// Start the countdown immediately upon running
|
|
31
|
+
this.timer = setInterval(()=>{
|
|
32
|
+
this.remaining--;
|
|
33
|
+
if (this.remaining <= 0) {
|
|
34
|
+
this.isDone = true;
|
|
35
|
+
this.stopTimer();
|
|
36
|
+
if (this.options.autoSubmit) {
|
|
37
|
+
this.submit();
|
|
38
|
+
} else {
|
|
39
|
+
this.render(false);
|
|
40
|
+
}
|
|
41
|
+
} else {
|
|
42
|
+
this.render(false);
|
|
43
|
+
}
|
|
44
|
+
}, 1000);
|
|
45
|
+
return super.run();
|
|
46
|
+
}
|
|
47
|
+
stopTimer() {
|
|
48
|
+
if (this.timer) {
|
|
49
|
+
clearInterval(this.timer);
|
|
50
|
+
this.timer = undefined;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
cleanup() {
|
|
54
|
+
this.stopTimer();
|
|
55
|
+
super.cleanup();
|
|
56
|
+
}
|
|
57
|
+
render(_firstRender) {
|
|
58
|
+
let output = `${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} `;
|
|
59
|
+
if (this.isDone) {
|
|
60
|
+
output += `${_theme.theme.success}Done! Press Enter to continue.${_ansi.ANSI.RESET}`;
|
|
61
|
+
} else {
|
|
62
|
+
// Fun countdown visualization
|
|
63
|
+
output += `${_theme.theme.muted}Please wait... ${this.remaining}s${_ansi.ANSI.RESET}`;
|
|
64
|
+
}
|
|
65
|
+
this.renderFrame(output);
|
|
66
|
+
}
|
|
67
|
+
handleInput(char) {
|
|
68
|
+
if (this.isDone && (char === '\r' || char === '\n')) {
|
|
69
|
+
this.submit();
|
|
70
|
+
}
|
|
71
|
+
// Else: Ignore all input while waiting
|
|
72
|
+
}
|
|
73
|
+
constructor(options){
|
|
74
|
+
super(options), _define_property(this, "remaining", void 0), _define_property(this, "timer", void 0), _define_property(this, "isDone", false);
|
|
75
|
+
this.remaining = options.seconds;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
//# sourceMappingURL=wait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/wait.ts"],"sourcesContent":["// src/prompts/wait.ts\nimport { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { BaseOptions } from '../types';\n\ninterface WaitOptions extends BaseOptions {\n seconds: number;\n autoSubmit?: boolean; // If true, resolves automatically when time is up\n}\n\nexport class WaitPrompt extends Prompt<void, WaitOptions> {\n private remaining: number;\n private timer?: NodeJS.Timeout;\n private isDone: boolean = false;\n\n constructor(options: WaitOptions) {\n super(options);\n this.remaining = options.seconds;\n }\n\n public run(): Promise<void> {\n // Start the countdown immediately upon running\n this.timer = setInterval(() => {\n this.remaining--;\n if (this.remaining <= 0) {\n this.isDone = true;\n this.stopTimer();\n\n if (this.options.autoSubmit) {\n this.submit();\n } else {\n this.render(false);\n }\n } else {\n this.render(false);\n }\n }, 1000);\n\n return super.run();\n }\n\n private stopTimer() {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n }\n\n protected cleanup() {\n this.stopTimer();\n super.cleanup();\n }\n\n protected render(_firstRender: boolean) {\n let output = `${theme.title}${this.options.message}${ANSI.RESET} `;\n\n if (this.isDone) {\n output += `${theme.success}Done! Press Enter to continue.${ANSI.RESET}`;\n } else {\n // Fun countdown visualization\n output += `${theme.muted}Please wait... ${this.remaining}s${ANSI.RESET}`;\n }\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string) {\n if (this.isDone && (char === '\\r' || char === '\\n')) {\n this.submit();\n }\n // Else: Ignore all input while waiting\n }\n}"],"names":["WaitPrompt","Prompt","run","timer","setInterval","remaining","isDone","stopTimer","options","autoSubmit","submit","render","clearInterval","undefined","cleanup","_firstRender","output","theme","title","message","ANSI","RESET","success","muted","renderFrame","handleInput","char","seconds"],"mappings":"AAAA,sBAAsB;;;;;+BAWTA;;;eAAAA;;;sBAVQ;sBACE;uBACD;;;;;;;;;;;;;;AAQf,IAAA,AAAMA,aAAN,MAAMA,mBAAmBC,YAAM;IAU3BC,MAAqB;QACxB,+CAA+C;QAC/C,IAAI,CAACC,KAAK,GAAGC,YAAY;YACrB,IAAI,CAACC,SAAS;YACd,IAAI,IAAI,CAACA,SAAS,IAAI,GAAG;gBACrB,IAAI,CAACC,MAAM,GAAG;gBACd,IAAI,CAACC,SAAS;gBAEd,IAAI,IAAI,CAACC,OAAO,CAACC,UAAU,EAAE;oBACzB,IAAI,CAACC,MAAM;gBACf,OAAO;oBACH,IAAI,CAACC,MAAM,CAAC;gBAChB;YACJ,OAAO;gBACH,IAAI,CAACA,MAAM,CAAC;YAChB;QACJ,GAAG;QAEH,OAAO,KAAK,CAACT;IACjB;IAEQK,YAAY;QAChB,IAAI,IAAI,CAACJ,KAAK,EAAE;YACZS,cAAc,IAAI,CAACT,KAAK;YACxB,IAAI,CAACA,KAAK,GAAGU;QACjB;IACJ;IAEUC,UAAU;QAChB,IAAI,CAACP,SAAS;QACd,KAAK,CAACO;IACV;IAEUH,OAAOI,YAAqB,EAAE;QACpC,IAAIC,SAAS,GAAGC,YAAK,CAACC,KAAK,GAAG,IAAI,CAACV,OAAO,CAACW,OAAO,GAAGC,UAAI,CAACC,KAAK,CAAC,CAAC,CAAC;QAElE,IAAI,IAAI,CAACf,MAAM,EAAE;YACbU,UAAU,GAAGC,YAAK,CAACK,OAAO,CAAC,8BAA8B,EAAEF,UAAI,CAACC,KAAK,EAAE;QAC3E,OAAO;YACH,8BAA8B;YAC9BL,UAAU,GAAGC,YAAK,CAACM,KAAK,CAAC,eAAe,EAAE,IAAI,CAAClB,SAAS,CAAC,CAAC,EAAEe,UAAI,CAACC,KAAK,EAAE;QAC5E;QAEA,IAAI,CAACG,WAAW,CAACR;IACrB;IAEUS,YAAYC,IAAY,EAAE;QAChC,IAAI,IAAI,CAACpB,MAAM,IAAKoB,CAAAA,SAAS,QAAQA,SAAS,IAAG,GAAI;YACjD,IAAI,CAAChB,MAAM;QACf;IACA,uCAAuC;IAC3C;IAxDA,YAAYF,OAAoB,CAAE;QAC9B,KAAK,CAACA,UALV,uBAAQH,aAAR,KAAA,IACA,uBAAQF,SAAR,KAAA,IACA,uBAAQG,UAAkB;QAItB,IAAI,CAACD,SAAS,GAAGG,QAAQmB,OAAO;IACpC;AAsDJ"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "Spinner", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return Spinner;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _ansi = require("./ansi");
|
|
12
|
+
const _symbols = require("./symbols");
|
|
13
|
+
const _theme = require("./theme");
|
|
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;
|
|
24
|
+
}
|
|
25
|
+
return obj;
|
|
26
|
+
}
|
|
27
|
+
let Spinner = class Spinner {
|
|
28
|
+
/**
|
|
29
|
+
* Starts the spinner animation.
|
|
30
|
+
*/ start() {
|
|
31
|
+
if (this.isSpinning) return this;
|
|
32
|
+
this.isSpinning = true;
|
|
33
|
+
process.stdout.write(_ansi.ANSI.HIDE_CURSOR);
|
|
34
|
+
// Render immediately
|
|
35
|
+
this.render();
|
|
36
|
+
// Start loop
|
|
37
|
+
this.timer = setInterval(()=>{
|
|
38
|
+
this.render();
|
|
39
|
+
}, 80);
|
|
40
|
+
// Register signal handler to restore cursor on Ctrl+C
|
|
41
|
+
process.on('SIGINT', this.handleSignal);
|
|
42
|
+
return this;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Stops the spinner animation.
|
|
46
|
+
*/ stop() {
|
|
47
|
+
if (this.timer) {
|
|
48
|
+
clearInterval(this.timer);
|
|
49
|
+
this.timer = undefined;
|
|
50
|
+
}
|
|
51
|
+
if (this.isSpinning) {
|
|
52
|
+
this.isSpinning = false;
|
|
53
|
+
process.stdout.write(_ansi.ANSI.SHOW_CURSOR);
|
|
54
|
+
process.removeListener('SIGINT', this.handleSignal);
|
|
55
|
+
}
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Updates the spinner text.
|
|
60
|
+
*/ update(text) {
|
|
61
|
+
this.text = text;
|
|
62
|
+
return this;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Stops the spinner and shows a success message.
|
|
66
|
+
*/ success(message) {
|
|
67
|
+
this.stop();
|
|
68
|
+
const text = message ?? this.text;
|
|
69
|
+
process.stdout.write(`${_ansi.ANSI.ERASE_LINE}${_ansi.ANSI.CURSOR_LEFT}${_theme.theme.success}${_symbols.symbols.tick}${_ansi.ANSI.RESET} ${text}\n`);
|
|
70
|
+
return this;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Stops the spinner and shows an error message.
|
|
74
|
+
*/ error(message) {
|
|
75
|
+
this.stop();
|
|
76
|
+
const text = message ?? this.text;
|
|
77
|
+
process.stdout.write(`${_ansi.ANSI.ERASE_LINE}${_ansi.ANSI.CURSOR_LEFT}${_theme.theme.error}${_symbols.symbols.cross}${_ansi.ANSI.RESET} ${text}\n`);
|
|
78
|
+
return this;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Stops the spinner and clears the line.
|
|
82
|
+
*/ clear() {
|
|
83
|
+
this.stop();
|
|
84
|
+
process.stdout.write(`${_ansi.ANSI.ERASE_LINE}${_ansi.ANSI.CURSOR_LEFT}`);
|
|
85
|
+
return this;
|
|
86
|
+
}
|
|
87
|
+
render() {
|
|
88
|
+
const frame = _symbols.symbols.spinner[this.frameIndex];
|
|
89
|
+
process.stdout.write(`${_ansi.ANSI.ERASE_LINE}${_ansi.ANSI.CURSOR_LEFT}${_theme.theme.main}${frame}${_ansi.ANSI.RESET} ${this.text}`);
|
|
90
|
+
this.frameIndex = (this.frameIndex + 1) % _symbols.symbols.spinner.length;
|
|
91
|
+
}
|
|
92
|
+
constructor(text){
|
|
93
|
+
_define_property(this, "text", void 0);
|
|
94
|
+
_define_property(this, "timer", void 0);
|
|
95
|
+
_define_property(this, "frameIndex", 0);
|
|
96
|
+
_define_property(this, "isSpinning", false);
|
|
97
|
+
_define_property(this, "handleSignal", ()=>{
|
|
98
|
+
this.stop();
|
|
99
|
+
process.exit(0);
|
|
100
|
+
});
|
|
101
|
+
this.text = text;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
//# sourceMappingURL=spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/spinner.ts"],"sourcesContent":["import { ANSI } from './ansi';\nimport { symbols } from './symbols';\nimport { theme } from './theme';\n\nexport class Spinner {\n private text: string;\n private timer?: NodeJS.Timeout;\n private frameIndex: number = 0;\n private isSpinning: boolean = false;\n\n constructor(text: string) {\n this.text = text;\n }\n\n /**\n * Starts the spinner animation.\n */\n public start(): this {\n if (this.isSpinning) return this;\n\n this.isSpinning = true;\n process.stdout.write(ANSI.HIDE_CURSOR);\n\n // Render immediately\n this.render();\n\n // Start loop\n this.timer = setInterval(() => {\n this.render();\n }, 80);\n\n // Register signal handler to restore cursor on Ctrl+C\n process.on('SIGINT', this.handleSignal);\n\n return this;\n }\n\n /**\n * Stops the spinner animation.\n */\n public stop(): this {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n\n if (this.isSpinning) {\n this.isSpinning = false;\n process.stdout.write(ANSI.SHOW_CURSOR);\n process.removeListener('SIGINT', this.handleSignal);\n }\n\n return this;\n }\n\n /**\n * Updates the spinner text.\n */\n public update(text: string): this {\n this.text = text;\n return this;\n }\n\n /**\n * Stops the spinner and shows a success message.\n */\n public success(message?: string): this {\n this.stop();\n const text = message ?? this.text;\n process.stdout.write(`${ANSI.ERASE_LINE}${ANSI.CURSOR_LEFT}${theme.success}${symbols.tick}${ANSI.RESET} ${text}\\n`);\n return this;\n }\n\n /**\n * Stops the spinner and shows an error message.\n */\n public error(message?: string): this {\n this.stop();\n const text = message ?? this.text;\n process.stdout.write(`${ANSI.ERASE_LINE}${ANSI.CURSOR_LEFT}${theme.error}${symbols.cross}${ANSI.RESET} ${text}\\n`);\n return this;\n }\n\n /**\n * Stops the spinner and clears the line.\n */\n public clear(): this {\n this.stop();\n process.stdout.write(`${ANSI.ERASE_LINE}${ANSI.CURSOR_LEFT}`);\n return this;\n }\n\n private render(): void {\n const frame = symbols.spinner[this.frameIndex];\n process.stdout.write(`${ANSI.ERASE_LINE}${ANSI.CURSOR_LEFT}${theme.main}${frame}${ANSI.RESET} ${this.text}`);\n this.frameIndex = (this.frameIndex + 1) % symbols.spinner.length;\n }\n\n private handleSignal = () => {\n this.stop();\n process.exit(0);\n };\n}\n"],"names":["Spinner","start","isSpinning","process","stdout","write","ANSI","HIDE_CURSOR","render","timer","setInterval","on","handleSignal","stop","clearInterval","undefined","SHOW_CURSOR","removeListener","update","text","success","message","ERASE_LINE","CURSOR_LEFT","theme","symbols","tick","RESET","error","cross","clear","frame","spinner","frameIndex","main","length","exit"],"mappings":"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"}
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "symbols", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return symbols;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _utils = require("./utils");
|
|
5
12
|
const UnicodeSymbols = {
|
|
6
13
|
tick: '✔',
|
|
7
14
|
cross: '✖',
|
|
@@ -9,7 +16,18 @@ const UnicodeSymbols = {
|
|
|
9
16
|
line: '─',
|
|
10
17
|
checked: '◉',
|
|
11
18
|
unchecked: '◯',
|
|
12
|
-
spinner: [
|
|
19
|
+
spinner: [
|
|
20
|
+
'⠋',
|
|
21
|
+
'⠙',
|
|
22
|
+
'⠹',
|
|
23
|
+
'⠸',
|
|
24
|
+
'⠼',
|
|
25
|
+
'⠴',
|
|
26
|
+
'⠦',
|
|
27
|
+
'⠧',
|
|
28
|
+
'⠇',
|
|
29
|
+
'⠏'
|
|
30
|
+
],
|
|
13
31
|
star: '★',
|
|
14
32
|
starEmpty: '☆',
|
|
15
33
|
topLeft: '┌',
|
|
@@ -26,7 +44,12 @@ const AsciiSymbols = {
|
|
|
26
44
|
line: '-',
|
|
27
45
|
checked: '[x]',
|
|
28
46
|
unchecked: '[ ]',
|
|
29
|
-
spinner: [
|
|
47
|
+
spinner: [
|
|
48
|
+
'|',
|
|
49
|
+
'/',
|
|
50
|
+
'-',
|
|
51
|
+
'\\'
|
|
52
|
+
],
|
|
30
53
|
star: '*',
|
|
31
54
|
starEmpty: ' ',
|
|
32
55
|
topLeft: '+',
|
|
@@ -36,6 +59,8 @@ const AsciiSymbols = {
|
|
|
36
59
|
horizontal: '-',
|
|
37
60
|
vertical: '|'
|
|
38
61
|
};
|
|
39
|
-
const capabilities = (0,
|
|
62
|
+
const capabilities = (0, _utils.detectCapabilities)();
|
|
40
63
|
const useUnicode = capabilities.hasUnicode && process.env.MEP_NO_UNICODE !== '1';
|
|
41
|
-
|
|
64
|
+
const symbols = useUnicode ? UnicodeSymbols : AsciiSymbols;
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=symbols.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/symbols.ts"],"sourcesContent":["import { detectCapabilities } from './utils';\n\nexport interface SymbolDefinition {\n /** Used for success messages or valid states */\n tick: string;\n /** Used for error messages or invalid states */\n cross: string;\n /** Used to point to the current selection */\n pointer: string;\n /** Used for separators or sliders */\n line: string;\n /** Used for checked state in checkboxes/radio */\n checked: string;\n /** Used for unchecked state in checkboxes/radio */\n unchecked: string;\n /** Animation frames for the spinner */\n spinner: string[];\n /** Star symbol for rating */\n star: string;\n /** Empty star symbol for rating */\n starEmpty: string;\n /** Box drawing top-left corner */\n topLeft: string;\n /** Box drawing top-right corner */\n topRight: string;\n /** Box drawing bottom-left corner */\n bottomLeft: string;\n /** Box drawing bottom-right corner */\n bottomRight: string;\n /** Box drawing horizontal line */\n horizontal: string;\n /** Box drawing vertical line */\n vertical: string;\n}\n\nconst UnicodeSymbols: SymbolDefinition = {\n tick: '✔',\n cross: '✖',\n pointer: '❯',\n line: '─',\n checked: '◉',\n unchecked: '◯',\n spinner: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],\n star: '★',\n starEmpty: '☆',\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│'\n};\n\nconst AsciiSymbols: SymbolDefinition = {\n tick: '+',\n cross: 'x',\n pointer: '>',\n line: '-',\n checked: '[x]',\n unchecked: '[ ]',\n spinner: ['|', '/', '-', '\\\\'],\n star: '*',\n starEmpty: ' ',\n topLeft: '+',\n topRight: '+',\n bottomLeft: '+',\n bottomRight: '+',\n horizontal: '-',\n vertical: '|'\n};\n\nconst capabilities = detectCapabilities();\nconst useUnicode = capabilities.hasUnicode && process.env.MEP_NO_UNICODE !== '1';\n\nexport const symbols: SymbolDefinition = useUnicode ? UnicodeSymbols : AsciiSymbols;\n"],"names":["symbols","UnicodeSymbols","tick","cross","pointer","line","checked","unchecked","spinner","star","starEmpty","topLeft","topRight","bottomLeft","bottomRight","horizontal","vertical","AsciiSymbols","capabilities","detectCapabilities","useUnicode","hasUnicode","process","env","MEP_NO_UNICODE"],"mappings":";;;;+BA0EaA;;;eAAAA;;;uBA1EsB;AAmCnC,MAAMC,iBAAmC;IACrCC,MAAM;IACNC,OAAO;IACPC,SAAS;IACTC,MAAM;IACNC,SAAS;IACTC,WAAW;IACXC,SAAS;QAAC;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;KAAI;IAC3DC,MAAM;IACNC,WAAW;IACXC,SAAS;IACTC,UAAU;IACVC,YAAY;IACZC,aAAa;IACbC,YAAY;IACZC,UAAU;AACd;AAEA,MAAMC,eAAiC;IACnCf,MAAM;IACNC,OAAO;IACPC,SAAS;IACTC,MAAM;IACNC,SAAS;IACTC,WAAW;IACXC,SAAS;QAAC;QAAK;QAAK;QAAK;KAAK;IAC9BC,MAAM;IACNC,WAAW;IACXC,SAAS;IACTC,UAAU;IACVC,YAAY;IACZC,aAAa;IACbC,YAAY;IACZC,UAAU;AACd;AAEA,MAAME,eAAeC,IAAAA,yBAAkB;AACvC,MAAMC,aAAaF,aAAaG,UAAU,IAAIC,QAAQC,GAAG,CAACC,cAAc,KAAK;AAEtE,MAAMxB,UAA4BoB,aAAanB,iBAAiBgB"}
|
|
@@ -1,45 +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
|
-
this.options = options;
|
|
25
|
-
this.handleSigInt = this.handleSigInt.bind(this);
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "TaskRunner", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return TaskRunner;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _ansi = require("./ansi");
|
|
12
|
+
const _symbols = require("./symbols");
|
|
13
|
+
const _utils = require("./utils");
|
|
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 TaskRunner = class TaskRunner {
|
|
27
28
|
/**
|
|
28
29
|
* Registers a new task.
|
|
29
|
-
*/
|
|
30
|
-
add(id, config) {
|
|
30
|
+
*/ add(id, config) {
|
|
31
31
|
this.tasks.set(id, {
|
|
32
32
|
id,
|
|
33
33
|
...config,
|
|
34
34
|
status: 'pending',
|
|
35
|
-
current: 0
|
|
35
|
+
current: 0
|
|
36
36
|
});
|
|
37
37
|
return this;
|
|
38
38
|
}
|
|
39
39
|
/**
|
|
40
40
|
* Updates an existing task.
|
|
41
|
-
*/
|
|
42
|
-
update(id, updates) {
|
|
41
|
+
*/ update(id, updates) {
|
|
43
42
|
const task = this.tasks.get(id);
|
|
44
43
|
if (task) {
|
|
45
44
|
Object.assign(task, updates);
|
|
@@ -47,52 +46,56 @@ class TaskRunner {
|
|
|
47
46
|
}
|
|
48
47
|
/**
|
|
49
48
|
* Starts a task (sets status to loading).
|
|
50
|
-
*/
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
*/ start(id, message) {
|
|
50
|
+
this.update(id, {
|
|
51
|
+
status: 'loading',
|
|
52
|
+
message
|
|
53
|
+
});
|
|
53
54
|
}
|
|
54
55
|
/**
|
|
55
56
|
* Mark task as success.
|
|
56
|
-
*/
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
*/ success(id, message) {
|
|
58
|
+
this.update(id, {
|
|
59
|
+
status: 'success',
|
|
60
|
+
message
|
|
61
|
+
});
|
|
59
62
|
}
|
|
60
63
|
/**
|
|
61
64
|
* Mark task as error.
|
|
62
|
-
*/
|
|
63
|
-
|
|
64
|
-
|
|
65
|
+
*/ error(id, message) {
|
|
66
|
+
this.update(id, {
|
|
67
|
+
status: 'error',
|
|
68
|
+
message
|
|
69
|
+
});
|
|
65
70
|
}
|
|
66
71
|
/**
|
|
67
72
|
* Mark task as warning.
|
|
68
|
-
*/
|
|
69
|
-
|
|
70
|
-
|
|
73
|
+
*/ warning(id, message) {
|
|
74
|
+
this.update(id, {
|
|
75
|
+
status: 'warning',
|
|
76
|
+
message
|
|
77
|
+
});
|
|
71
78
|
}
|
|
72
79
|
/**
|
|
73
80
|
* Starts the rendering loop.
|
|
74
|
-
*/
|
|
75
|
-
|
|
76
|
-
if (this.isRunning)
|
|
77
|
-
return;
|
|
81
|
+
*/ run() {
|
|
82
|
+
if (this.isRunning) return;
|
|
78
83
|
this.isRunning = true;
|
|
79
|
-
this.stdout.write(
|
|
84
|
+
this.stdout.write(_ansi.ANSI.HIDE_CURSOR);
|
|
80
85
|
this.hijackConsole();
|
|
81
86
|
// Handle Ctrl+C gracefully to restore cursor
|
|
82
87
|
process.on('SIGINT', this.handleSigInt);
|
|
83
88
|
// Initial render
|
|
84
89
|
this.render();
|
|
85
|
-
this.timer = setInterval(()
|
|
90
|
+
this.timer = setInterval(()=>{
|
|
86
91
|
this.frameIndex++;
|
|
87
92
|
this.render();
|
|
88
93
|
}, 80);
|
|
89
94
|
}
|
|
90
95
|
/**
|
|
91
96
|
* Stops the rendering loop and finalizes output.
|
|
92
|
-
*/
|
|
93
|
-
|
|
94
|
-
if (!this.isRunning)
|
|
95
|
-
return;
|
|
97
|
+
*/ stop() {
|
|
98
|
+
if (!this.isRunning) return;
|
|
96
99
|
if (this.timer) {
|
|
97
100
|
clearInterval(this.timer);
|
|
98
101
|
this.timer = undefined;
|
|
@@ -101,7 +104,7 @@ class TaskRunner {
|
|
|
101
104
|
this.render();
|
|
102
105
|
this.isRunning = false;
|
|
103
106
|
this.restoreConsole();
|
|
104
|
-
this.stdout.write(
|
|
107
|
+
this.stdout.write(_ansi.ANSI.SHOW_CURSOR + '\n');
|
|
105
108
|
if (this.logBuffer.length > 0) {
|
|
106
109
|
this.stdout.write(this.logBuffer.join('\n') + '\n');
|
|
107
110
|
this.logBuffer = [];
|
|
@@ -114,13 +117,13 @@ class TaskRunner {
|
|
|
114
117
|
warn: console.warn,
|
|
115
118
|
error: console.error
|
|
116
119
|
};
|
|
117
|
-
const logger = (_type)
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
120
|
+
const logger = (_type)=>(...args)=>{
|
|
121
|
+
// Use util.format for proper string interpolation
|
|
122
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
123
|
+
const util = require('util');
|
|
124
|
+
const msg = util.format(...args);
|
|
125
|
+
this.logBuffer.push(msg);
|
|
126
|
+
};
|
|
124
127
|
console.log = logger('log');
|
|
125
128
|
console.warn = logger('warn');
|
|
126
129
|
console.error = logger('error');
|
|
@@ -135,8 +138,7 @@ class TaskRunner {
|
|
|
135
138
|
}
|
|
136
139
|
/**
|
|
137
140
|
* The core rendering logic using Linear Scan Diffing.
|
|
138
|
-
*/
|
|
139
|
-
render() {
|
|
141
|
+
*/ render() {
|
|
140
142
|
const lines = this.buildLines();
|
|
141
143
|
// 1. First Render
|
|
142
144
|
if (this.lastOutputLines.length === 0) {
|
|
@@ -151,17 +153,17 @@ class TaskRunner {
|
|
|
151
153
|
output += `\x1b[${this.lastOutputHeight - 1}A`; // Move up N-1 lines
|
|
152
154
|
}
|
|
153
155
|
output += '\r'; // Move to start of line
|
|
154
|
-
for
|
|
156
|
+
for(let i = 0; i < lines.length; i++){
|
|
155
157
|
const newLine = lines[i];
|
|
156
158
|
// Write line
|
|
157
|
-
output +=
|
|
159
|
+
output += _ansi.ANSI.ERASE_LINE + newLine;
|
|
158
160
|
if (i < lines.length - 1) {
|
|
159
161
|
output += '\n';
|
|
160
162
|
}
|
|
161
163
|
}
|
|
162
164
|
// Clear garbage if shrunk
|
|
163
165
|
if (lines.length < this.lastOutputLines.length) {
|
|
164
|
-
output +=
|
|
166
|
+
output += _ansi.ANSI.ERASE_DOWN;
|
|
165
167
|
}
|
|
166
168
|
this.stdout.write(output);
|
|
167
169
|
this.lastOutputLines = lines;
|
|
@@ -169,38 +171,61 @@ class TaskRunner {
|
|
|
169
171
|
}
|
|
170
172
|
buildLines() {
|
|
171
173
|
const lines = [];
|
|
172
|
-
for (const task of this.tasks.values())
|
|
174
|
+
for (const task of this.tasks.values()){
|
|
173
175
|
const icon = this.getIcon(task);
|
|
174
176
|
const title = task.title;
|
|
175
177
|
let line = `${icon} ${title}`;
|
|
176
178
|
if (task.type === 'progress' && task.total) {
|
|
177
|
-
const bar = (0,
|
|
178
|
-
line += ` ${
|
|
179
|
+
const bar = (0, _utils.generateProgressBar)(task.current, task.total);
|
|
180
|
+
line += ` ${_ansi.ANSI.FG_GRAY}${bar}${_ansi.ANSI.RESET}`;
|
|
179
181
|
}
|
|
180
182
|
if (task.message) {
|
|
181
|
-
line += ` ${
|
|
183
|
+
line += ` ${_ansi.ANSI.DIM}- ${task.message}${_ansi.ANSI.RESET}`;
|
|
182
184
|
}
|
|
183
185
|
lines.push(line);
|
|
184
186
|
}
|
|
185
187
|
return lines;
|
|
186
188
|
}
|
|
187
189
|
getIcon(task) {
|
|
188
|
-
switch
|
|
190
|
+
switch(task.status){
|
|
189
191
|
case 'pending':
|
|
190
|
-
return `${
|
|
191
|
-
case 'loading':
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
192
|
+
return `${_ansi.ANSI.FG_GRAY}${_symbols.symbols.unchecked}${_ansi.ANSI.RESET}`;
|
|
193
|
+
case 'loading':
|
|
194
|
+
{
|
|
195
|
+
const frame = _symbols.symbols.spinner[this.frameIndex % _symbols.symbols.spinner.length];
|
|
196
|
+
return `${_ansi.ANSI.FG_CYAN}${frame}${_ansi.ANSI.RESET}`;
|
|
197
|
+
}
|
|
195
198
|
case 'success':
|
|
196
|
-
return `${
|
|
199
|
+
return `${_ansi.ANSI.FG_GREEN}${_symbols.symbols.tick}${_ansi.ANSI.RESET}`;
|
|
197
200
|
case 'error':
|
|
198
|
-
return `${
|
|
201
|
+
return `${_ansi.ANSI.FG_RED}${_symbols.symbols.cross}${_ansi.ANSI.RESET}`;
|
|
199
202
|
case 'warning':
|
|
200
|
-
return `${
|
|
203
|
+
return `${_ansi.ANSI.FG_YELLOW}!${_ansi.ANSI.RESET}`;
|
|
201
204
|
default:
|
|
202
205
|
return ' ';
|
|
203
206
|
}
|
|
204
207
|
}
|
|
205
|
-
}
|
|
206
|
-
|
|
208
|
+
constructor(options = {}){
|
|
209
|
+
_define_property(this, "tasks", new Map());
|
|
210
|
+
_define_property(this, "options", void 0);
|
|
211
|
+
_define_property(this, "timer", void 0);
|
|
212
|
+
_define_property(this, "frameIndex", 0);
|
|
213
|
+
_define_property(this, "isRunning", false);
|
|
214
|
+
_define_property(this, "lastOutputLines", []);
|
|
215
|
+
_define_property(this, "lastOutputHeight", 0);
|
|
216
|
+
// Explicitly using stdout
|
|
217
|
+
_define_property(this, "stdout", process.stdout);
|
|
218
|
+
// Console Hijacking
|
|
219
|
+
_define_property(this, "originalConsole", null);
|
|
220
|
+
_define_property(this, "logBuffer", []);
|
|
221
|
+
_define_property(this, "handleSigInt", ()=>{
|
|
222
|
+
this.restoreConsole();
|
|
223
|
+
this.stdout.write(_ansi.ANSI.SHOW_CURSOR + '\n');
|
|
224
|
+
process.exit(0);
|
|
225
|
+
});
|
|
226
|
+
this.options = options;
|
|
227
|
+
this.handleSigInt = this.handleSigInt.bind(this);
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/tasks.ts"],"sourcesContent":["import { ANSI } from './ansi';\nimport { symbols } from './symbols';\nimport { TaskConfig, TaskGroupOptions, TaskState } from './types';\nimport { generateProgressBar } from './utils';\n\nexport class TaskRunner {\n private tasks: Map<string, TaskState> = new Map();\n private options: TaskGroupOptions;\n private timer?: NodeJS.Timeout;\n private frameIndex: number = 0;\n private isRunning: boolean = false;\n private lastOutputLines: string[] = [];\n private lastOutputHeight: number = 0;\n\n // Explicitly using stdout\n private stdout: NodeJS.WriteStream = process.stdout;\n\n // Console Hijacking\n private originalConsole: { log: any, warn: any, error: any } | null = null;\n private logBuffer: string[] = [];\n\n constructor(options: TaskGroupOptions = {}) {\n this.options = options;\n this.handleSigInt = this.handleSigInt.bind(this);\n }\n\n /**\n * Registers a new task.\n */\n public add(id: string, config: Omit<TaskConfig, 'id'>): TaskRunner {\n this.tasks.set(id, {\n id,\n ...config,\n status: 'pending',\n current: 0,\n });\n return this;\n }\n\n /**\n * Updates an existing task.\n */\n public update(id: string, updates: Partial<Omit<TaskState, 'id' | 'type' | 'title'>> & { title?: string }): void {\n const task = this.tasks.get(id);\n if (task) {\n Object.assign(task, updates);\n }\n }\n\n /**\n * Starts a task (sets status to loading).\n */\n public start(id: string, message?: string): void {\n this.update(id, { status: 'loading', message });\n }\n\n /**\n * Mark task as success.\n */\n public success(id: string, message?: string): void {\n this.update(id, { status: 'success', message });\n }\n\n /**\n * Mark task as error.\n */\n public error(id: string, message?: string): void {\n this.update(id, { status: 'error', message });\n }\n\n /**\n * Mark task as warning.\n */\n public warning(id: string, message?: string): void {\n this.update(id, { status: 'warning', message });\n }\n\n /**\n * Starts the rendering loop.\n */\n public run(): void {\n if (this.isRunning) return;\n this.isRunning = true;\n\n this.stdout.write(ANSI.HIDE_CURSOR);\n this.hijackConsole();\n\n // Handle Ctrl+C gracefully to restore cursor\n process.on('SIGINT', this.handleSigInt);\n\n // Initial render\n this.render();\n\n this.timer = setInterval(() => {\n this.frameIndex++;\n this.render();\n }, 80);\n }\n\n /**\n * Stops the rendering loop and finalizes output.\n */\n public stop(): void {\n if (!this.isRunning) return;\n\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n\n // Final render to ensure static state (ticks/crosses instead of spinner)\n this.render();\n\n this.isRunning = false;\n this.restoreConsole();\n this.stdout.write(ANSI.SHOW_CURSOR + '\\n');\n\n if (this.logBuffer.length > 0) {\n this.stdout.write(this.logBuffer.join('\\n') + '\\n');\n this.logBuffer = [];\n }\n\n process.removeListener('SIGINT', this.handleSigInt);\n }\n\n private handleSigInt = () => {\n this.restoreConsole();\n this.stdout.write(ANSI.SHOW_CURSOR + '\\n');\n process.exit(0);\n };\n\n private hijackConsole() {\n this.originalConsole = {\n log: console.log,\n warn: console.warn,\n error: console.error\n };\n\n const logger = (_type: string) => (...args: any[]) => {\n // Use util.format for proper string interpolation\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const util = require('util');\n const msg = util.format(...args);\n this.logBuffer.push(msg);\n };\n\n console.log = logger('log');\n console.warn = logger('warn');\n console.error = logger('error');\n }\n\n private restoreConsole() {\n if (this.originalConsole) {\n console.log = this.originalConsole.log;\n console.warn = this.originalConsole.warn;\n console.error = this.originalConsole.error;\n this.originalConsole = null;\n }\n }\n\n /**\n * The core rendering logic using Linear Scan Diffing.\n */\n private render(): void {\n const lines = this.buildLines();\n\n // 1. First Render\n if (this.lastOutputLines.length === 0) {\n this.stdout.write(lines.join('\\n'));\n this.lastOutputLines = lines;\n this.lastOutputHeight = lines.length;\n return;\n }\n\n let output = '';\n\n // 2. Return Cursor to Top\n if (this.lastOutputHeight > 1) {\n output += `\\x1b[${this.lastOutputHeight - 1}A`; // Move up N-1 lines\n }\n output += '\\r'; // Move to start of line\n\n for (let i = 0; i < lines.length; i++) {\n const newLine = lines[i];\n // Write line\n output += ANSI.ERASE_LINE + newLine;\n if (i < lines.length - 1) {\n output += '\\n';\n }\n }\n\n // Clear garbage if shrunk\n if (lines.length < this.lastOutputLines.length) {\n output += ANSI.ERASE_DOWN;\n }\n\n this.stdout.write(output);\n this.lastOutputLines = lines;\n this.lastOutputHeight = lines.length;\n }\n\n private buildLines(): string[] {\n const lines: string[] = [];\n\n for (const task of this.tasks.values()) {\n const icon = this.getIcon(task);\n const title = task.title;\n\n let line = `${icon} ${title}`;\n\n if (task.type === 'progress' && task.total) {\n const bar = generateProgressBar(task.current, task.total);\n line += ` ${ANSI.FG_GRAY}${bar}${ANSI.RESET}`;\n }\n\n if (task.message) {\n line += ` ${ANSI.DIM}- ${task.message}${ANSI.RESET}`;\n }\n\n lines.push(line);\n }\n\n return lines;\n }\n\n private getIcon(task: TaskState): string {\n switch (task.status) {\n case 'pending':\n return `${ANSI.FG_GRAY}${symbols.unchecked}${ANSI.RESET}`;\n case 'loading': {\n const frame = symbols.spinner[this.frameIndex % symbols.spinner.length];\n return `${ANSI.FG_CYAN}${frame}${ANSI.RESET}`;\n }\n case 'success':\n return `${ANSI.FG_GREEN}${symbols.tick}${ANSI.RESET}`;\n case 'error':\n return `${ANSI.FG_RED}${symbols.cross}${ANSI.RESET}`;\n case 'warning':\n return `${ANSI.FG_YELLOW}!${ANSI.RESET}`;\n default:\n return ' ';\n }\n }\n}\n"],"names":["TaskRunner","add","id","config","tasks","set","status","current","update","updates","task","get","Object","assign","start","message","success","error","warning","run","isRunning","stdout","write","ANSI","HIDE_CURSOR","hijackConsole","process","on","handleSigInt","render","timer","setInterval","frameIndex","stop","clearInterval","undefined","restoreConsole","SHOW_CURSOR","logBuffer","length","join","removeListener","originalConsole","log","console","warn","logger","_type","args","util","require","msg","format","push","lines","buildLines","lastOutputLines","lastOutputHeight","output","i","newLine","ERASE_LINE","ERASE_DOWN","values","icon","getIcon","title","line","type","total","bar","generateProgressBar","FG_GRAY","RESET","DIM","symbols","unchecked","frame","spinner","FG_CYAN","FG_GREEN","tick","FG_RED","cross","FG_YELLOW","options","Map","exit","bind"],"mappings":"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"}
|