feat: add pre-commit hook to enforce linting

- Install husky for git hook management
- Add pre-commit hook that runs 'npm run lint'
- Ensures all commits pass linting before being allowed
This commit is contained in:
Derek Slenk 2025-06-30 11:17:35 -04:00
parent 09f78df1da
commit b2475a845c
3 changed files with 100 additions and 78 deletions

1
.husky/pre-commit Normal file
View file

@ -0,0 +1 @@
npm run lint

21
package-lock.json generated
View file

@ -59,9 +59,10 @@
"aws-cdk-lib": "^2.189.1", "aws-cdk-lib": "^2.189.1",
"constructs": "^10.4.2", "constructs": "^10.4.2",
"esbuild": "^0.25.5", "esbuild": "^0.25.5",
"eslint": "9.30.0", "eslint": "^9.30.0",
"eslint-config-next": "15.3.4", "eslint-config-next": "15.3.4",
"genkit-cli": "^1.13.0", "genkit-cli": "^1.13.0",
"husky": "^9.1.7",
"postcss": "^8", "postcss": "^8",
"tailwindcss": "^3.4.1", "tailwindcss": "^3.4.1",
"tsx": "^4.20.3", "tsx": "^4.20.3",
@ -6355,6 +6356,8 @@
}, },
"node_modules/eslint": { "node_modules/eslint": {
"version": "9.30.0", "version": "9.30.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.0.tgz",
"integrity": "sha512-iN/SiPxmQu6EVkf+m1qpBxzUhE12YqFLOSySuOyVLJLEF9nzTf+h/1AJYc1JWzCnktggeNrjvQGLngDzXirU6g==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -8044,6 +8047,22 @@
"node": ">= 14" "node": ">= 14"
} }
}, },
"node_modules/husky": {
"version": "9.1.7",
"resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz",
"integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==",
"dev": true,
"license": "MIT",
"bin": {
"husky": "bin.js"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/typicode"
}
},
"node_modules/iconv-lite": { "node_modules/iconv-lite": {
"version": "0.4.24", "version": "0.4.24",
"license": "MIT", "license": "MIT",

View file

@ -1,77 +1,79 @@
{ {
"name": "nextn", "name": "nextn",
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev --turbopack -p 9002", "dev": "next dev --turbopack -p 9002",
"genkit:dev": "genkit start -- tsx src/ai/dev.ts", "genkit:dev": "genkit start -- tsx src/ai/dev.ts",
"genkit:watch": "genkit start -- tsx --watch src/ai/dev.ts", "genkit:watch": "genkit start -- tsx --watch src/ai/dev.ts",
"build": "next build", "build": "next build",
"build:static": "next build", "build:static": "next build",
"start": "next start", "start": "next start",
"lint": "next lint", "lint": "next lint",
"typecheck": "tsc --noEmit", "typecheck": "tsc --noEmit",
"deploy:s3": "npm run build:static && aws s3 sync out/ s3://$S3_BUCKET_NAME --delete --no-cli-pager", "deploy:s3": "npm run build:static && aws s3 sync out/ s3://$S3_BUCKET_NAME --delete --no-cli-pager",
"create-s3-bucket": "node scripts/create-s3-bucket.js" "create-s3-bucket": "node scripts/create-s3-bucket.js",
}, "prepare": "husky"
"dependencies": { },
"@genkit-ai/googleai": "^1.13.0", "dependencies": {
"@genkit-ai/next": "^1.13.0", "@genkit-ai/googleai": "^1.13.0",
"@hookform/resolvers": "^4.1.3", "@genkit-ai/next": "^1.13.0",
"@radix-ui/react-accordion": "^1.2.3", "@hookform/resolvers": "^4.1.3",
"@radix-ui/react-alert-dialog": "^1.1.6", "@radix-ui/react-accordion": "^1.2.3",
"@radix-ui/react-avatar": "^1.1.3", "@radix-ui/react-alert-dialog": "^1.1.6",
"@radix-ui/react-checkbox": "^1.1.4", "@radix-ui/react-avatar": "^1.1.3",
"@radix-ui/react-collapsible": "^1.1.11", "@radix-ui/react-checkbox": "^1.1.4",
"@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-collapsible": "^1.1.11",
"@radix-ui/react-dropdown-menu": "^2.1.6", "@radix-ui/react-dialog": "^1.1.6",
"@radix-ui/react-label": "^2.1.2", "@radix-ui/react-dropdown-menu": "^2.1.6",
"@radix-ui/react-menubar": "^1.1.6", "@radix-ui/react-label": "^2.1.2",
"@radix-ui/react-popover": "^1.1.6", "@radix-ui/react-menubar": "^1.1.6",
"@radix-ui/react-progress": "^1.1.2", "@radix-ui/react-popover": "^1.1.6",
"@radix-ui/react-radio-group": "^1.2.3", "@radix-ui/react-progress": "^1.1.2",
"@radix-ui/react-scroll-area": "^1.2.3", "@radix-ui/react-radio-group": "^1.2.3",
"@radix-ui/react-select": "^2.1.6", "@radix-ui/react-scroll-area": "^1.2.3",
"@radix-ui/react-separator": "^1.1.2", "@radix-ui/react-select": "^2.1.6",
"@radix-ui/react-slider": "^1.2.3", "@radix-ui/react-separator": "^1.1.2",
"@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-slider": "^1.2.3",
"@radix-ui/react-switch": "^1.1.3", "@radix-ui/react-slot": "^1.2.3",
"@radix-ui/react-tabs": "^1.1.3", "@radix-ui/react-switch": "^1.1.3",
"@radix-ui/react-toast": "^1.2.6", "@radix-ui/react-tabs": "^1.1.3",
"@radix-ui/react-tooltip": "^1.1.8", "@radix-ui/react-toast": "^1.2.6",
"class-variance-authority": "^0.7.1", "@radix-ui/react-tooltip": "^1.1.8",
"clsx": "^2.1.1", "class-variance-authority": "^0.7.1",
"date-fns": "^3.6.0", "clsx": "^2.1.1",
"dotenv": "^16.5.0", "date-fns": "^3.6.0",
"embla-carousel-react": "^8.6.0", "dotenv": "^16.5.0",
"firebase": "^11.9.1", "embla-carousel-react": "^8.6.0",
"genkit": "^1.13.0", "firebase": "^11.9.1",
"lucide-react": "^0.475.0", "genkit": "^1.13.0",
"next": "15.3.3", "lucide-react": "^0.475.0",
"next-themes": "^0.3.0", "next": "15.3.3",
"patch-package": "^8.0.0", "next-themes": "^0.3.0",
"react": "^18.3.1", "patch-package": "^8.0.0",
"react-day-picker": "^8.10.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-day-picker": "^8.10.1",
"react-hook-form": "^7.54.2", "react-dom": "^18.3.1",
"recharts": "^2.15.1", "react-hook-form": "^7.54.2",
"tailwind-merge": "^3.0.1", "recharts": "^2.15.1",
"tailwindcss-animate": "^1.0.7", "tailwind-merge": "^3.0.1",
"zod": "^3.24.2" "tailwindcss-animate": "^1.0.7",
}, "zod": "^3.24.2"
"devDependencies": { },
"@types/node": "^20", "devDependencies": {
"@types/react": "^18", "@types/node": "^20",
"@types/react-dom": "^18", "@types/react": "^18",
"aws-cdk-lib": "^2.189.1", "@types/react-dom": "^18",
"constructs": "^10.4.2", "aws-cdk-lib": "^2.189.1",
"esbuild": "^0.25.5", "constructs": "^10.4.2",
"eslint": "9.30.0", "esbuild": "^0.25.5",
"eslint-config-next": "15.3.4", "eslint": "^9.30.0",
"genkit-cli": "^1.13.0", "eslint-config-next": "15.3.4",
"postcss": "^8", "genkit-cli": "^1.13.0",
"tailwindcss": "^3.4.1", "husky": "^9.1.7",
"tsx": "^4.20.3", "postcss": "^8",
"typescript": "^5.8.3" "tailwindcss": "^3.4.1",
} "tsx": "^4.20.3",
} "typescript": "^5.8.3"
}
}