Refactor: Complete codebase reorganization and modernization
- Split server.js routes into modular files (server/routes/) - departures.js: Departure data endpoints - sites.js: Site search and nearby sites - config.js: Configuration endpoints - Reorganized file structure following Node.js best practices: - Moved sites-config.json to config/sites.json - Moved API_RESPONSE_DOCUMENTATION.md to docs/ - Moved raspberry-pi-setup.sh to scripts/ - Archived legacy files to archive/ directory - Updated all code references to new file locations - Added archive/ to .gitignore to exclude legacy files from repo - Updated README.md with new structure and organization - All functionality tested and working correctly Version: 1.2.0
This commit is contained in:
100
public/js/utils/logger.js
Normal file
100
public/js/utils/logger.js
Normal file
@@ -0,0 +1,100 @@
|
||||
/**
|
||||
* Logger utility for consistent logging throughout the application
|
||||
* Supports different log levels and can be configured for production vs development
|
||||
*/
|
||||
|
||||
class Logger {
|
||||
constructor() {
|
||||
this.level = this.getLogLevel();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current log level from environment or default to 'info'
|
||||
* @returns {string} Log level ('debug', 'info', 'warn', 'error')
|
||||
*/
|
||||
getLogLevel() {
|
||||
// In production, you might want to check window.location.hostname
|
||||
// or a global config. For now, default to 'info'
|
||||
if (typeof window !== 'undefined' && window.LOG_LEVEL) {
|
||||
return window.LOG_LEVEL;
|
||||
}
|
||||
// Default to 'info' level
|
||||
return 'info';
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a log level should be output
|
||||
* @param {string} level - Log level to check
|
||||
* @returns {boolean} Whether to output this level
|
||||
*/
|
||||
shouldLog(level) {
|
||||
const levels = ['debug', 'info', 'warn', 'error'];
|
||||
const currentLevelIndex = levels.indexOf(this.level);
|
||||
const messageLevelIndex = levels.indexOf(level);
|
||||
return messageLevelIndex >= currentLevelIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Format a log message with timestamp
|
||||
* @param {string} level - Log level
|
||||
* @param {string} message - Message to log
|
||||
* @param {any[]} args - Additional arguments
|
||||
* @returns {string} Formatted message
|
||||
*/
|
||||
formatMessage(level, message, args = []) {
|
||||
const timestamp = new Date().toISOString();
|
||||
const prefix = `[${timestamp}] [${level.toUpperCase()}]`;
|
||||
return args.length > 0 ? [prefix, message, ...args] : [prefix, message];
|
||||
}
|
||||
|
||||
/**
|
||||
* Log a debug message
|
||||
* @param {string} message - Message to log
|
||||
* @param {...any} args - Additional arguments
|
||||
*/
|
||||
debug(message, ...args) {
|
||||
if (this.shouldLog('debug')) {
|
||||
console.debug(...this.formatMessage('debug', message, args));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Log an info message
|
||||
* @param {string} message - Message to log
|
||||
* @param {...any} args - Additional arguments
|
||||
*/
|
||||
info(message, ...args) {
|
||||
if (this.shouldLog('info')) {
|
||||
console.info(...this.formatMessage('info', message, args));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Log a warning message
|
||||
* @param {string} message - Message to log
|
||||
* @param {...any} args - Additional arguments
|
||||
*/
|
||||
warn(message, ...args) {
|
||||
if (this.shouldLog('warn')) {
|
||||
console.warn(...this.formatMessage('warn', message, args));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Log an error message
|
||||
* @param {string} message - Message to log
|
||||
* @param {...any} args - Additional arguments
|
||||
*/
|
||||
error(message, ...args) {
|
||||
if (this.shouldLog('error')) {
|
||||
console.error(...this.formatMessage('error', message, args));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Create a singleton instance
|
||||
const logger = new Logger();
|
||||
|
||||
// Export both the class and the singleton instance
|
||||
window.Logger = Logger;
|
||||
window.logger = logger;
|
||||
Reference in New Issue
Block a user