mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-04-07 17:53:32 +08:00
fix: use readFile utility in hooks and add pattern type safety
- Replace raw fs.readFileSync with readFile() from utils in check-console-log.js and post-edit-console-warn.js to eliminate TOCTOU race conditions (file deleted between existsSync and read) - Remove redundant existsSync in post-edit-format.js (exec already handles missing files via its catch block) - Resolve path upfront in post-edit-typecheck.js before tsconfig walk - Add type guard in getGitModifiedFiles() to skip non-string and empty patterns before regex compilation
This commit is contained in:
@@ -14,7 +14,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const { isGitRepo, getGitModifiedFiles, log } = require('../lib/utils');
|
const { isGitRepo, getGitModifiedFiles, readFile, log } = require('../lib/utils');
|
||||||
|
|
||||||
// Files where console.log is expected and should not trigger warnings
|
// Files where console.log is expected and should not trigger warnings
|
||||||
const EXCLUDED_PATTERNS = [
|
const EXCLUDED_PATTERNS = [
|
||||||
@@ -49,8 +49,8 @@ process.stdin.on('end', () => {
|
|||||||
let hasConsole = false;
|
let hasConsole = false;
|
||||||
|
|
||||||
for (const file of files) {
|
for (const file of files) {
|
||||||
const content = fs.readFileSync(file, 'utf8');
|
const content = readFile(file);
|
||||||
if (content.includes('console.log')) {
|
if (content && content.includes('console.log')) {
|
||||||
log(`[Hook] WARNING: console.log found in ${file}`);
|
log(`[Hook] WARNING: console.log found in ${file}`);
|
||||||
hasConsole = true;
|
hasConsole = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
const { readFile } = require('../lib/utils');
|
||||||
|
|
||||||
const MAX_STDIN = 1024 * 1024; // 1MB limit
|
const MAX_STDIN = 1024 * 1024; // 1MB limit
|
||||||
let data = '';
|
let data = '';
|
||||||
@@ -25,8 +26,9 @@ process.stdin.on('end', () => {
|
|||||||
const input = JSON.parse(data);
|
const input = JSON.parse(data);
|
||||||
const filePath = input.tool_input?.file_path;
|
const filePath = input.tool_input?.file_path;
|
||||||
|
|
||||||
if (filePath && /\.(ts|tsx|js|jsx)$/.test(filePath) && fs.existsSync(filePath)) {
|
if (filePath && /\.(ts|tsx|js|jsx)$/.test(filePath)) {
|
||||||
const content = fs.readFileSync(filePath, 'utf8');
|
const content = readFile(filePath);
|
||||||
|
if (!content) { console.log(data); return; }
|
||||||
const lines = content.split('\n');
|
const lines = content.split('\n');
|
||||||
const matches = [];
|
const matches = [];
|
||||||
|
|
||||||
|
|||||||
@@ -25,14 +25,14 @@ process.stdin.on('end', () => {
|
|||||||
const input = JSON.parse(data);
|
const input = JSON.parse(data);
|
||||||
const filePath = input.tool_input?.file_path;
|
const filePath = input.tool_input?.file_path;
|
||||||
|
|
||||||
if (filePath && /\.(ts|tsx|js|jsx)$/.test(filePath) && fs.existsSync(filePath)) {
|
if (filePath && /\.(ts|tsx|js|jsx)$/.test(filePath)) {
|
||||||
try {
|
try {
|
||||||
execFileSync('npx', ['prettier', '--write', filePath], {
|
execFileSync('npx', ['prettier', '--write', filePath], {
|
||||||
stdio: ['pipe', 'pipe', 'pipe'],
|
stdio: ['pipe', 'pipe', 'pipe'],
|
||||||
timeout: 15000
|
timeout: 15000
|
||||||
});
|
});
|
||||||
} catch {
|
} catch {
|
||||||
// Prettier not installed or failed — non-blocking
|
// Prettier not installed, file missing, or failed — non-blocking
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
|
|||||||
@@ -27,9 +27,11 @@ process.stdin.on('end', () => {
|
|||||||
const input = JSON.parse(data);
|
const input = JSON.parse(data);
|
||||||
const filePath = input.tool_input?.file_path;
|
const filePath = input.tool_input?.file_path;
|
||||||
|
|
||||||
if (filePath && /\.(ts|tsx)$/.test(filePath) && fs.existsSync(filePath)) {
|
if (filePath && /\.(ts|tsx)$/.test(filePath)) {
|
||||||
|
const resolvedPath = path.resolve(filePath);
|
||||||
|
if (!fs.existsSync(resolvedPath)) { console.log(data); return; }
|
||||||
// Find nearest tsconfig.json by walking up (max 20 levels to prevent infinite loop)
|
// Find nearest tsconfig.json by walking up (max 20 levels to prevent infinite loop)
|
||||||
let dir = path.dirname(path.resolve(filePath));
|
let dir = path.dirname(resolvedPath);
|
||||||
const root = path.parse(dir).root;
|
const root = path.parse(dir).root;
|
||||||
let depth = 0;
|
let depth = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -366,6 +366,7 @@ function getGitModifiedFiles(patterns = []) {
|
|||||||
// Pre-compile patterns, skipping invalid ones
|
// Pre-compile patterns, skipping invalid ones
|
||||||
const compiled = [];
|
const compiled = [];
|
||||||
for (const pattern of patterns) {
|
for (const pattern of patterns) {
|
||||||
|
if (typeof pattern !== 'string' || pattern.length === 0) continue;
|
||||||
try {
|
try {
|
||||||
compiled.push(new RegExp(pattern));
|
compiled.push(new RegExp(pattern));
|
||||||
} catch {
|
} catch {
|
||||||
|
|||||||
Reference in New Issue
Block a user