-
-
Notifications
You must be signed in to change notification settings - Fork 4
/
index.ts
142 lines (127 loc) · 3.64 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
* @poppinss/cliui
*
* (c) Poppinss
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
import supportsColor from 'supports-color'
import { Colors } from '@poppinss/colors/types'
import { default as poppinssColors } from '@poppinss/colors'
import { icons } from './src/icons.js'
import { Table } from './src/table.js'
import { useColors } from './src/colors.js'
import { Logger } from './src/logger/main.js'
import { Instructions } from './src/instructions.js'
import { TaskManager } from './src/tasks/manager.js'
import { MemoryRenderer } from './src/renderers/memory.js'
import { ConsoleRenderer } from './src/renderers/console.js'
import type { RendererContract, TableOptions, TaskManagerOptions } from './src/types.js'
export {
icons,
Table,
Logger,
TaskManager,
Instructions,
MemoryRenderer,
ConsoleRenderer,
poppinssColors as colors,
}
/**
* Create a new CLI UI instance.
*
* - The "raw" mode is tailored for testing
* - The "silent" mode should be used when the terminal does not support colors. We
* automatically perform the detection
*/
export function cliui(options: Partial<{ mode: 'raw' | 'silent' | 'normal' }> = {}) {
let mode = options.mode
/**
* Use silent mode when not explicit mode is defined
*/
if (!mode && !supportsColor.stdout) {
mode = 'silent'
}
/**
* Renderer to use
*/
let renderer: RendererContract = mode === 'raw' ? new MemoryRenderer() : new ConsoleRenderer()
/**
* Colors instance in use
*/
let colors = useColors({ silent: mode === 'silent', raw: mode === 'raw' })
/**
* Logger
*/
const logger = new Logger()
logger.useRenderer(renderer)
logger.useColors(colors)
/**
* Render instructions inside a box
*/
const instructions = () => {
const instructionsInstance = new Instructions({ icons: true, raw: mode === 'raw' })
instructionsInstance.useRenderer(renderer)
instructionsInstance.useColors(colors)
return instructionsInstance
}
/**
* Similar to instructions. But without the `pointer` icon
*/
const sticker = () => {
const instructionsInstance = new Instructions({ icons: false, raw: mode === 'raw' })
instructionsInstance.useRenderer(renderer)
instructionsInstance.useColors(colors)
return instructionsInstance
}
/**
* Initiates a group of tasks
*/
const tasks = (tasksOptions?: Partial<TaskManagerOptions>) => {
const manager = new TaskManager({ raw: mode === 'raw', ...tasksOptions })
manager.useRenderer(renderer)
manager.useColors(colors)
return manager
}
/**
* Instantiate a new table
*/
const table = (tableOptions?: Partial<TableOptions>) => {
const tableInstance = new Table({ raw: mode === 'raw', ...tableOptions })
tableInstance.useRenderer(renderer)
tableInstance.useColors(colors)
return tableInstance
}
return {
colors,
logger,
table,
tasks,
icons,
sticker,
instructions,
switchMode(modeToUse: 'raw' | 'silent' | 'normal') {
mode = modeToUse
/**
* Use memory renderer in raw mode, otherwise switch to
* console renderer
*/
if (mode === 'raw') {
this.useRenderer(new MemoryRenderer())
} else {
this.useRenderer(new ConsoleRenderer())
}
this.useColors(useColors({ silent: mode === 'silent', raw: mode === 'raw' }))
},
useRenderer(rendererToUse: RendererContract) {
renderer = rendererToUse
logger.useRenderer(renderer)
},
useColors(colorsToUse: Colors) {
colors = colorsToUse
logger.useColors(colors)
this.colors = colors
},
}
}