1 | import { inspect } from 'node:util'
|
2 |
|
3 | export function wrapInStyle(styles, text) {
|
4 | const starts = styles.map(([start]) => start)
|
5 | const endings = styles.map(([_, end]) => end)
|
6 | const ansiEscape = '\x1b['
|
7 | return `${ansiEscape}${starts.join(';')}m${text}${ansiEscape}${endings.join(';')}m`
|
8 | }
|
9 |
|
10 | const modifierDefinition = (mod, modifierSet) => ({
|
11 | get() {
|
12 | return createStyleFunction(new Set(modifierSet).add(mod))
|
13 | }
|
14 | })
|
15 |
|
16 | function createStyleFunction(styleSet = new Set()) {
|
17 | const styleFunction = (text) => {
|
18 | const styles = Array.from(styleSet)
|
19 | const inspectStyles = styles.map(style =>
|
20 | inspect.colors[style] ??
|
21 | console.warn(`Warning: style ${style} does not exist on inspect.colors.`)
|
22 | ).filter(style => style)
|
23 | if (inspectStyles.length > 0) {
|
24 | return wrapInStyle(inspectStyles, text)
|
25 | }
|
26 | return text
|
27 | }
|
28 |
|
29 |
|
30 | Object.defineProperty(styleFunction, 'dim', modifierDefinition('dim', styleSet))
|
31 | Object.defineProperty(styleFunction, 'bold', modifierDefinition('bold', styleSet))
|
32 | Object.defineProperty(styleFunction, 'italic', modifierDefinition('italic', styleSet))
|
33 | Object.defineProperty(styleFunction, 'underline', modifierDefinition('underline', styleSet))
|
34 | Object.defineProperty(styleFunction, 'red', modifierDefinition('red', styleSet))
|
35 | Object.defineProperty(styleFunction, 'green', modifierDefinition('green', styleSet))
|
36 | Object.defineProperty(styleFunction, 'blue', modifierDefinition('blue', styleSet))
|
37 | Object.defineProperty(styleFunction, 'gray', modifierDefinition('gray', styleSet))
|
38 | Object.defineProperty(styleFunction, 'cyan', modifierDefinition('cyan', styleSet))
|
39 |
|
40 | styleFunction.custom = (...styles) => createStyleFunction(new Set([...styleSet, ...styles]))
|
41 |
|
42 | return styleFunction
|
43 | }
|
44 |
|
45 | export default createStyleFunction()
|