Test improvements: - Capture titles for all macOS windows, not just the frontmost. - Incorporate missing application log files. - Improve log clarity with enriched context. - Improve application termination on macOS by reducing grace period. - Ensure complete application termination on macOS. - Validate Vue application loading through an initial log. - Support ignoring environment-specific `stderr` errors. - Do not fail the test if working directory cannot be deleted. - Use retry pattern when installing dependencies due to network errors. Refactorings: - Migrate the test code to TypeScript. - Replace deprecated `rmdir` with `rm` for error-resistant directory removal. - Improve sanity checking by shifting from App.vue to Vue bootstrapper. - Centralize environment variable management with `EnvironmentVariables` construct. - Rename infrastructure/Environment to RuntimeEnvironment for clarity. - Isolate WindowVariables and SystemOperations from RuntimeEnvironment. - Inject logging via preloader. - Correct mislabeled RuntimeSanity tests. Configuration: - Introduce `npm run check:desktop` for simplified execution. - Omit `console.log` override due to `nodeIntegration` restrictions and reveal logging functionality using context-bridging.
69 lines
1.5 KiB
TypeScript
69 lines
1.5 KiB
TypeScript
export enum LogLevel {
|
|
Info,
|
|
Warn,
|
|
Error,
|
|
}
|
|
|
|
export function log(message: string, level = LogLevel.Info): void {
|
|
const timestamp = new Date().toISOString();
|
|
const config = LOG_LEVEL_CONFIG[level] || LOG_LEVEL_CONFIG[LogLevel.Info];
|
|
const logLevelText = `${getColorCode(config.color)}${LOG_LEVEL_LABELS[level]}${getColorCode(TextColor.Reset)}`;
|
|
const formattedMessage = `[${timestamp}][${logLevelText}] ${message}`;
|
|
config.method(formattedMessage);
|
|
}
|
|
|
|
export function die(message: string): never {
|
|
log(message, LogLevel.Error);
|
|
return process.exit(1);
|
|
}
|
|
|
|
enum TextColor {
|
|
Reset,
|
|
LightRed,
|
|
Yellow,
|
|
LightBlue,
|
|
}
|
|
|
|
function getColorCode(color: TextColor): string {
|
|
return COLOR_CODE_MAPPING[color];
|
|
}
|
|
|
|
const LOG_LEVEL_LABELS: {
|
|
readonly [K in LogLevel]: string;
|
|
} = {
|
|
[LogLevel.Info]: 'INFO',
|
|
[LogLevel.Error]: 'ERROR',
|
|
[LogLevel.Warn]: 'WARN',
|
|
};
|
|
|
|
const COLOR_CODE_MAPPING: {
|
|
readonly [K in TextColor]: string;
|
|
} = {
|
|
[TextColor.Reset]: '\x1b[0m',
|
|
[TextColor.LightRed]: '\x1b[91m',
|
|
[TextColor.Yellow]: '\x1b[33m',
|
|
[TextColor.LightBlue]: '\x1b[94m',
|
|
};
|
|
|
|
interface ColorLevelConfig {
|
|
readonly color: TextColor;
|
|
readonly method: (...data: unknown[]) => void;
|
|
}
|
|
|
|
const LOG_LEVEL_CONFIG: {
|
|
readonly [K in LogLevel]: ColorLevelConfig;
|
|
} = {
|
|
[LogLevel.Info]: {
|
|
color: TextColor.LightBlue,
|
|
method: console.log,
|
|
},
|
|
[LogLevel.Warn]: {
|
|
color: TextColor.Yellow,
|
|
method: console.warn,
|
|
},
|
|
[LogLevel.Error]: {
|
|
color: TextColor.LightRed,
|
|
method: console.error,
|
|
},
|
|
};
|