UNPKG

1.82 kBJavaScriptView Raw
1import { inspect } from 'node:util'
2
3export 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
10const modifierDefinition = (mod, modifierSet) => ({
11 get() {
12 return createStyleFunction(new Set(modifierSet).add(mod))
13 }
14})
15
16function 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 // vscode intellisense understands this, but not a loop or object assign
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
45export default createStyleFunction()