const PREFIX = "[RustPad]"; const LEVELS = Object.freeze({ off: 0, error: 1, warn: 2, info: 3, debug: 4 }); function configuredLevel() { const configured = window.__RUSTPAD_CONFIG__?.frontendLogLevel; return Object.prototype.hasOwnProperty.call(LEVELS, configured) ? configured : "warn"; } function enabled(level) { return LEVELS[configuredLevel()] >= LEVELS[level]; } function safeDetails(details) { if (!details || typeof details !== "object") return details; const blocked = /password|token|secret|authorization|cookie|email|content/i; return Object.fromEntries(Object.entries(details).map(([key, value]) => [key, blocked.test(key) ? "[redacted]" : value])); } export function logInfo(event, details = {}) { if (enabled("info")) console.info(PREFIX, event, safeDetails(details)); } export function logWarn(event, details = {}) { if (enabled("warn")) console.warn(PREFIX, event, safeDetails(details)); } export function logError(event, error, details = {}) { if (enabled("error")) console.error(PREFIX, event, { ...safeDetails(details), error: error instanceof Error ? error.message : String(error) }); } export function logDebug(event, details = {}) { if (enabled("debug")) console.debug(PREFIX, event, safeDetails(details)); } export function installGlobalDiagnostics() { logInfo("frontend.initialized", { path: location.pathname, assetVersion: document.body?.dataset.assetVersion || "unknown", logLevel: configuredLevel() }); window.addEventListener("error", (event) => logError("frontend.uncaught_error", event.error || event.message, { file: event.filename, line: event.lineno, column: event.colno })); window.addEventListener("unhandledrejection", (event) => logError("frontend.unhandled_rejection", event.reason)); window.addEventListener("online", () => logInfo("network.online")); window.addEventListener("offline", () => logWarn("network.offline")); }