Function installConsoleInterceptor

  • Installs console interceptors to capture all log output; wraps methods to forward to LogCollector. Preserves normal console output and group hierarchy tracking. No-op if already installed.

    Returns () => void

    Cleanup function to restore original console methods.

    export function installConsoleInterceptor(): () => void {
    if (interceptorInstalled) {
    return () => {
    // no-op cleanup when already installed by another consumer
    };
    }

    if (globalThis.window === undefined) {
    return () => {
    // no console interception in non-browser environments (Main process, Node.js)
    // This is intentional and safe - logging in Main process goes directly to DevTools
    };
    }

    for (const level of LOG_LEVELS) {
    const original =
    assignableConsole[level]?.bind(console) ?? console.log.bind(console);
    originalConsoleMethods.set(level, original);

    assignableConsole[level] = (...args: unknown[]) => {
    logCollector.addEntry(level, args);
    original(...args);
    };
    }

    // Wrap console group methods to track hierarchy
    const originalGroupCollapsed = console.groupCollapsed.bind(console);
    const originalGroup = console.group.bind(console);
    const originalGroupEnd = console.groupEnd.bind(console);

    console.groupCollapsed = (...args: unknown[]) => {
    // Extract label from first argument
    const label = args.length > 0 ? String(args[0]) : "Group";
    logCollector.enterGroup(label);
    originalGroupCollapsed(...args);
    };

    console.group = (...args: unknown[]) => {
    // Extract label from first argument
    const label = args.length > 0 ? String(args[0]) : "Group";
    logCollector.enterGroup(label);
    originalGroup(...args);
    };

    console.groupEnd = () => {
    logCollector.exitGroup();
    originalGroupEnd();
    };

    interceptorInstalled = true;

    return () => {
    if (!interceptorInstalled) return;
    for (const level of LOG_LEVELS) {
    const original = originalConsoleMethods.get(level);
    if (original) {
    assignableConsole[level] = original;
    }
    }

    // Restore group methods
    console.groupCollapsed = originalGroupCollapsed;
    console.group = originalGroup;
    console.groupEnd = originalGroupEnd;

    interceptorInstalled = false;
    originalConsoleMethods.clear();
    };
    }