diff --git a/eslint.config.js b/eslint.config.js index 8f982b646..5726533d5 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -124,4 +124,15 @@ export default tseslint.config( ], }, }, + // Scripts internos (CLI tools) e testes E2E: console.* é apropriado + { + files: [ + "scripts/**/*.{ts,tsx,js,mjs}", + "e2e/**/*.{ts,tsx}", + "tests/e2e/**/*.{ts,tsx}", + ], + rules: { + "no-console": "off", + }, + }, ); diff --git a/src/components/system/IntegrationMigrationMount.tsx b/src/components/system/IntegrationMigrationMount.tsx index b6265e387..da03928b2 100644 --- a/src/components/system/IntegrationMigrationMount.tsx +++ b/src/components/system/IntegrationMigrationMount.tsx @@ -1,6 +1,9 @@ import { useEffect, useRef } from "react"; import { supabase } from "@/integrations/supabase/client"; import { invalidateWhatsAppModeCache } from "@/lib/whatsappAdapter"; +import { getLogger } from '@/lib/logger'; + +const log = getLogger('IntegrationMigration'); /** * Roda `rpc_migrate_whatsapp_integration` uma vez por sessão. @@ -31,7 +34,7 @@ export function IntegrationMigrationMount() { sessionStorage.setItem(SESSION_KEY, "1"); invalidateWhatsAppModeCache(); if (import.meta.env.DEV) { - console.info("[integration-migration] result:", data); + log.info("result:", data); } } catch (e) { console.warn("[integration-migration] error:", e); diff --git a/src/hooks/useContactsRealtime.ts b/src/hooks/useContactsRealtime.ts index e7ac8223a..68fb1ff9d 100644 --- a/src/hooks/useContactsRealtime.ts +++ b/src/hooks/useContactsRealtime.ts @@ -15,6 +15,11 @@ import { supabase } from '@/integrations/supabase/client'; import { DEFAULT_WHATSAPP_INSTANCE } from '@/lib/constants/whatsappInstances'; import type { RealtimeChannel } from '@supabase/supabase-js'; import type { Contact } from '@/hooks/useContacts'; +import { getLogger } from '@/lib/logger'; + +const log = getLogger('useContactsRealtime'); + + type ContactPayload = Record; @@ -94,7 +99,7 @@ export function useContactsRealtime({ ) .subscribe((status) => { if (import.meta.env.DEV) { - console.debug(`[useContactsRealtime] Channel "${channelName}" status: ${status}`); + log.debug(`Channel "${channelName}" status: ${status}`); } }); diff --git a/src/hooks/useEmail.ts b/src/hooks/useEmail.ts index 2f151e178..5b73bd5c5 100644 --- a/src/hooks/useEmail.ts +++ b/src/hooks/useEmail.ts @@ -18,6 +18,9 @@ import { useCallback, useEffect, useRef, useState, useMemo } from 'react'; import { supabase as _supabase } from '@/integrations/supabase/client'; import { safeClient } from '@/integrations/supabase/safeClient'; import { emailMappers } from '@/utils/emailMappers'; +import { getLogger } from '@/lib/logger'; + +const log = getLogger('useEmail'); import { type EmailMessage } from './gmail/gmailTypes'; import { GMAIL_MOCKS } from './gmail/gmailMocks'; import { @@ -80,7 +83,7 @@ export function useEmail() { if (dbErr) { if (dbErr.message.includes('disponível') || dbErr.message.includes('not found')) { - console.info('[useEmail] Usando dados mock para contas (schema não disponível)'); + log.info('Usando dados mock para contas (schema não disponível)'); setAccounts(GMAIL_MOCKS.accounts); if (GMAIL_MOCKS.accounts.length > 0 && !activeAccountId) { setActiveAccountId(GMAIL_MOCKS.accounts[0].id); @@ -134,7 +137,7 @@ export function useEmail() { if (rpcErr) { if (rpcErr.message.includes('disponível') || rpcErr.message.includes('not found')) { - console.info('[useEmail] Usando threads mock'); + log.info('Usando threads mock'); setThreads(GMAIL_MOCKS.threads); setHasMore(false); } else { diff --git a/src/hooks/useThemeAudit.ts b/src/hooks/useThemeAudit.ts index 3857b1e89..621ee0a72 100644 --- a/src/hooks/useThemeAudit.ts +++ b/src/hooks/useThemeAudit.ts @@ -77,8 +77,10 @@ export const useThemeAudit = () => { setResult({ oledPass, fontPass, colorPass, violations }); if (violations.length > 0) { + // eslint-disable-next-line no-console console.group('🔍 Relatório de Auditoria Visual'); violations.forEach(v => console.warn(v)); + // eslint-disable-next-line no-console console.groupEnd(); } }; diff --git a/src/integrations/supabase/safeClient.ts b/src/integrations/supabase/safeClient.ts index 05e646536..16d335311 100644 --- a/src/integrations/supabase/safeClient.ts +++ b/src/integrations/supabase/safeClient.ts @@ -206,7 +206,7 @@ export const safeClient = { } }); } catch (err) { - console.warn('[safeClient] Erro ao sincronizar estado de saúde', err); + _log.warn('Erro ao sincronizar estado de saúde', err); } }, @@ -218,11 +218,11 @@ export const safeClient = { const maskedDetail = this.maskSensitiveData(detail); if (level === 'error') { - console.error(prefix, message, maskedDetail || ''); + _log.error(`${prefix} ${message}`, maskedDetail || ''); } else if (level === 'warn') { - console.warn(prefix, message, maskedDetail || ''); + _log.warn(`${prefix} ${message}`, maskedDetail || ''); } else { - console.info(prefix, message, maskedDetail || ''); + _log.info(`${prefix} ${message}`, maskedDetail || ''); } }, @@ -313,7 +313,7 @@ export const safeClient = { }); } catch (dbErr) { // Ignorar erros de persistência para não travar a operação principal - console.warn('[safeClient] Falha ao persistir log de saúde', dbErr); + _log.warn('Falha ao persistir log de saúde', dbErr); } }, diff --git a/src/lib/logger.ts b/src/lib/logger.ts index 8d34519ad..b4ab66a43 100644 --- a/src/lib/logger.ts +++ b/src/lib/logger.ts @@ -55,11 +55,13 @@ class Logger { } debug(message: string, ...args: unknown[]): void { + // eslint-disable-next-line no-console if (this.shouldLog('debug')) console.debug(this.formatMessage('debug', message), ...args); this.addToSentryBreadcrumb('debug', message, ...args); } info(message: string, ...args: unknown[]): void { + // eslint-disable-next-line no-console if (this.shouldLog('info')) console.info(this.formatMessage('info', message), ...args); this.addToSentryBreadcrumb('info', message, ...args); } @@ -118,6 +120,7 @@ export function logPerformance(label: string, fn: () => void): void { const start = performance.now(); fn(); const end = performance.now(); + // eslint-disable-next-line no-console console.debug(`[PERF] [sid:${sessionId.slice(0, 8)}] ${label}: ${(end - start).toFixed(2)}ms`); } @@ -130,6 +133,7 @@ export async function logAsyncPerformance(label: string, fn: () => Promise const start = performance.now(); const result = await fn(); const end = performance.now(); + // eslint-disable-next-line no-console console.debug(`[PERF] [sid:${sessionId.slice(0, 8)}] ${label}: ${(end - start).toFixed(2)}ms`); return result; }