forked from colbymchenry/codegraph
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathglyphs.ts
More file actions
138 lines (129 loc) · 4.48 KB
/
Copy pathglyphs.ts
File metadata and controls
138 lines (129 loc) · 4.48 KB
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
/**
* Glyph selection for CLI output.
*
* On Windows, console output is interpreted via the active output
* codepage. PowerShell 5.1 and cmd.exe in legacy conhost default to
* OEM codepages (CP437, CP936, ...), so UTF-8 bytes written to the
* console render as mojibake (see #168). The shimmer worker is hit
* hardest because it uses `fs.writeSync(1, ...)` (raw bytes, no
* TTY-aware encoding conversion) to keep animation smooth while the
* main thread is blocked in SQLite. To stay readable everywhere, we
* fall back to ASCII glyphs whenever the terminal is not known to
* handle UTF-8.
*
* The Windows branch must agree with @clack/prompts (which bundles
* `is-unicode-supported`): clack draws the outer `┌ │ └` frame around
* init/index/sync output, and if it decides Unicode while we decide
* ASCII, one block mixes `│` and `|` rails (#398). The terminals the
* list recognizes (Windows Terminal, VS Code, ConEmu/Cmder, Alacritty,
* JetBrains, Terminus, CI log viewers) all run with a UTF-8-capable
* output path, so the raw-byte shimmer writes render correctly there
* too; unrecognized Windows consoles keep the safe ASCII fallback —
* and clack falls back to ASCII in those as well, so output stays
* consistent in both directions.
*
* Detection:
* - `CODEGRAPH_ASCII=1` -> ASCII (escape hatch for any terminal)
* - `CODEGRAPH_UNICODE=1` -> Unicode (opt-in on any terminal)
* - Windows -> mirror is-unicode-supported (see above)
* - Linux kernel console (`TERM=linux`) -> ASCII
* - Everything else -> Unicode
*/
export function supportsUnicode(): boolean {
if (process.env.CODEGRAPH_ASCII === '1') return false;
if (process.env.CODEGRAPH_UNICODE === '1') return true;
if (process.platform === 'win32') {
const env = process.env;
return Boolean(
env.CI ||
env.WT_SESSION || // Windows Terminal
env.TERMINUS_SUBLIME ||
env.ConEmuTask === '{cmd::Cmder}' || // ConEmu and cmder
env.TERM_PROGRAM === 'Terminus-Sublime' ||
env.TERM_PROGRAM === 'vscode' ||
env.TERM === 'xterm-256color' ||
env.TERM === 'alacritty' ||
env.TERMINAL_EMULATOR === 'JetBrains-JediTerm'
);
}
return process.env.TERM !== 'linux';
}
export interface Glyphs {
ok: string;
err: string;
info: string;
warn: string;
spinner: string[];
barFilled: string;
barEmpty: string;
rail: string;
phaseDone: string;
dash: string;
hLine: string;
treeBranch: string;
treeLast: string;
treePipe: string;
}
export const UNICODE_GLYPHS: Glyphs = {
ok: '✓',
err: '✗',
info: 'ℹ',
warn: '⚠',
spinner: ['·', '✢', '✳', '✶', '✻', '✽'],
barFilled: '█',
barEmpty: '░',
rail: '│',
phaseDone: '◆',
dash: '—',
hLine: '─',
treeBranch: '├── ',
treeLast: '└── ',
treePipe: '│ ',
};
export const ASCII_GLYPHS: Glyphs = {
ok: '[OK]',
err: '[ERR]',
info: '[i]',
warn: '[!]',
spinner: ['.', '*', '+', 'x', 'o', 'O'],
barFilled: '#',
barEmpty: '-',
rail: '|',
phaseDone: '*',
dash: '-',
hLine: '-',
treeBranch: '|-- ',
treeLast: '`-- ',
treePipe: '| ',
};
let cached: Glyphs | null = null;
export function getGlyphs(): Glyphs {
if (cached === null) {
cached = supportsUnicode() ? UNICODE_GLYPHS : ASCII_GLYPHS;
}
return cached;
}
/**
* Unicode support for the RAW console write path — `fs.writeSync(1, ...)`,
* used only by the shimmer worker's transient animation frames. Raw bytes
* bypass Node's TTY-aware conversion and get decoded by the ACTIVE CONSOLE
* CODEPAGE on Windows; OEM codepages (CP437, CP936, ...) mojibake UTF-8
* there even inside Windows Terminal, whose ConPTY still decodes app output
* with the session codepage (#168). So the raw path stays ASCII on every
* Windows terminal unless the user opts in via CODEGRAPH_UNICODE=1 —
* independent of `supportsUnicode()`, which governs the codepage-immune
* main-thread writes (`process.stdout` uses the wide-char console API).
*/
export function supportsUnicodeRawWrites(): boolean {
if (process.env.CODEGRAPH_ASCII === '1') return false;
if (process.env.CODEGRAPH_UNICODE === '1') return true;
if (process.platform === 'win32') return false;
return process.env.TERM !== 'linux';
}
export function getRawWriteGlyphs(): Glyphs {
return supportsUnicodeRawWrites() ? UNICODE_GLYPHS : ASCII_GLYPHS;
}
/** Reset the cached glyph set. Test-only; production code should call `getGlyphs()`. */
export function _resetGlyphsCache(): void {
cached = null;
}