Release v1.01 Enhanced: Vi Control, TUI Gen5, Core Stability
This commit is contained in:
134
bin/terminal-profile.mjs
Normal file
134
bin/terminal-profile.mjs
Normal file
@@ -0,0 +1,134 @@
|
||||
/**
|
||||
* Terminal Profile Detection
|
||||
* Detects terminal capabilities and returns one of three rendering profiles:
|
||||
* - SAFE_ASCII: PowerShell/legacy-safe (ASCII borders, 16-color, no backgrounds)
|
||||
* - ANSI_256: 256-color, conservative backgrounds
|
||||
* - TRUECOLOR_UNICODE: Full Unicode + truecolor when reliable
|
||||
*/
|
||||
|
||||
// Rendering profile constants
|
||||
export const PROFILE = {
|
||||
SAFE_ASCII: 'SAFE_ASCII',
|
||||
ANSI_256: 'ANSI_256',
|
||||
TRUECOLOR_UNICODE: 'TRUECOLOR_UNICODE'
|
||||
};
|
||||
|
||||
/**
|
||||
* Detect terminal capabilities
|
||||
* Returns { profile, unicodeOK, truecolorOK, backgroundOK, dimOK }
|
||||
*/
|
||||
export function detectCapabilities() {
|
||||
const env = process.env;
|
||||
const term = env.TERM || '';
|
||||
const colorterm = env.COLORTERM || '';
|
||||
const termProgram = env.TERM_PROGRAM || '';
|
||||
const wtSession = env.WT_SESSION; // Windows Terminal
|
||||
const isWindows = process.platform === 'win32';
|
||||
const isMac = process.platform === 'darwin';
|
||||
|
||||
// Detect truecolor support
|
||||
const truecolorOK = (
|
||||
colorterm === 'truecolor' ||
|
||||
colorterm === '24bit' ||
|
||||
termProgram === 'iTerm.app' ||
|
||||
termProgram === 'Hyper' ||
|
||||
term.includes('256color') ||
|
||||
wtSession !== undefined // Windows Terminal supports truecolor
|
||||
);
|
||||
|
||||
// Detect Unicode support
|
||||
const unicodeOK = (
|
||||
!isWindows || // Unix terminals generally support Unicode
|
||||
wtSession !== undefined || // Windows Terminal
|
||||
termProgram === 'vscode' || // VS Code integrated terminal
|
||||
env.LANG?.includes('UTF-8') ||
|
||||
env.LC_ALL?.includes('UTF-8')
|
||||
);
|
||||
|
||||
// Detect 256-color support
|
||||
const color256OK = (
|
||||
term.includes('256color') ||
|
||||
truecolorOK ||
|
||||
wtSession !== undefined
|
||||
);
|
||||
|
||||
// Background colors work reliably in most modern terminals
|
||||
const backgroundOK = truecolorOK || color256OK || isMac;
|
||||
|
||||
// Dim text support (not reliable in all terminals)
|
||||
const dimOK = !isWindows || wtSession !== undefined || termProgram === 'vscode';
|
||||
|
||||
// Determine profile
|
||||
let profile;
|
||||
if (truecolorOK && unicodeOK) {
|
||||
profile = PROFILE.TRUECOLOR_UNICODE;
|
||||
} else if (color256OK) {
|
||||
profile = PROFILE.ANSI_256;
|
||||
} else {
|
||||
profile = PROFILE.SAFE_ASCII;
|
||||
}
|
||||
|
||||
return {
|
||||
profile,
|
||||
unicodeOK,
|
||||
truecolorOK,
|
||||
color256OK,
|
||||
backgroundOK,
|
||||
dimOK,
|
||||
isWindows,
|
||||
isMac,
|
||||
termProgram,
|
||||
wtSession: !!wtSession
|
||||
};
|
||||
}
|
||||
|
||||
// Cache the detection result
|
||||
let _cachedCapabilities = null;
|
||||
|
||||
/**
|
||||
* Get cached terminal capabilities (call once at startup)
|
||||
*/
|
||||
export function getCapabilities() {
|
||||
if (!_cachedCapabilities) {
|
||||
_cachedCapabilities = detectCapabilities();
|
||||
}
|
||||
return _cachedCapabilities;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get current rendering profile
|
||||
*/
|
||||
export function getProfile() {
|
||||
return getCapabilities().profile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if Unicode is safe to use
|
||||
*/
|
||||
export function isUnicodeOK() {
|
||||
return getCapabilities().unicodeOK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if backgrounds are safe to use
|
||||
*/
|
||||
export function isBackgroundOK() {
|
||||
return getCapabilities().backgroundOK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if dim text is safe
|
||||
*/
|
||||
export function isDimOK() {
|
||||
return getCapabilities().dimOK;
|
||||
}
|
||||
|
||||
export default {
|
||||
PROFILE,
|
||||
detectCapabilities,
|
||||
getCapabilities,
|
||||
getProfile,
|
||||
isUnicodeOK,
|
||||
isBackgroundOK,
|
||||
isDimOK
|
||||
};
|
||||
Reference in New Issue
Block a user