#!/usr/bin/env node /** * Stop Hook: Check for console.log statements in modified files * * Cross-platform (Windows, macOS, Linux) * * Runs after each response and checks if any modified JavaScript/TypeScript * files contain console.log statements. Provides warnings to help developers * remember to remove debug statements before committing. * * Exclusions: test files, config files, and scripts/ directory (where * console.log is often intentional). */ const fs = require('fs'); const { isGitRepo, getGitModifiedFiles, log } = require('../lib/utils'); // Files where console.log is expected and should not trigger warnings const EXCLUDED_PATTERNS = [ /\.test\.[jt]sx?$/, /\.spec\.[jt]sx?$/, /\.config\.[jt]s$/, /scripts\//, /__tests__\//, /__mocks__\//, ]; const MAX_STDIN = 1024 * 1024; // 1MB limit let data = ''; process.stdin.on('data', chunk => { if (data.length < MAX_STDIN) { data += chunk; } }); process.stdin.on('end', () => { try { if (!isGitRepo()) { console.log(data); process.exit(0); } const files = getGitModifiedFiles(['\\.tsx?$', '\\.jsx?$']) .filter(f => fs.existsSync(f)) .filter(f => !EXCLUDED_PATTERNS.some(pattern => pattern.test(f))); let hasConsole = false; for (const file of files) { const content = fs.readFileSync(file, 'utf8'); if (content.includes('console.log')) { log(`[Hook] WARNING: console.log found in ${file}`); hasConsole = true; } } if (hasConsole) { log('[Hook] Remove console.log statements before committing'); } } catch { // Silently ignore errors (git might not be available, etc.) } // Always output the original data console.log(data); });