52 lines
1.6 KiB
JavaScript
52 lines
1.6 KiB
JavaScript
/* eslint-disable no-console */
|
|
// .claude/hooks.mjs
|
|
import {execSync} from "child_process";
|
|
import path from "path";
|
|
|
|
// Hook that runs before editing files
|
|
export async function preEdit({filePath}) {
|
|
// Check if editing TypeScript/JavaScript files
|
|
if (filePath.match(/\.(ts|tsx|js|jsx)$/)) {
|
|
// Ensure file is properly formatted before edit
|
|
try {
|
|
execSync(`pnpm prettier --check "${filePath}"`, {stdio: "pipe"});
|
|
} catch (e) {
|
|
console.log("⚠️ File needs formatting - will format after edit");
|
|
}
|
|
}
|
|
|
|
// Prevent editing of certain protected files
|
|
const protectedFiles = ["yarn.lock", "package-lock.json", ".env.production", "firebase.json"];
|
|
const fileName = path.basename(filePath);
|
|
|
|
if (protectedFiles.includes(fileName)) {
|
|
throw new Error(`❌ Cannot edit protected file: ${fileName}`);
|
|
}
|
|
|
|
return {proceed: true};
|
|
}
|
|
|
|
// Hook that runs after editing files
|
|
export async function postEdit({filePath, success}) {
|
|
if (!success) return;
|
|
|
|
// Run linting and auto-fix on TypeScript/JavaScript files
|
|
if (filePath.match(/\.(ts|tsx|js|jsx)$/)) {
|
|
try {
|
|
execSync(`pnpm lint --fix "${filePath}"`, {stdio: "pipe"});
|
|
console.log("✅ Lint fixes applied");
|
|
} catch (e) {
|
|
console.log("⚠️ Lint errors detected - please review");
|
|
}
|
|
}
|
|
|
|
// Run type checking on TypeScript files
|
|
if (filePath.match(/\.(ts|tsx)$/)) {
|
|
try {
|
|
execSync(`npx tsc --noEmit --skipLibCheck "${filePath}"`, {stdio: "pipe"});
|
|
} catch (e) {
|
|
console.log("⚠️ TypeScript errors detected - please review");
|
|
}
|
|
}
|
|
}
|