1+ #! /usr/bin/env sh
2+ # Pre-commit hook to run lint, Snyk and Talisman scans, completing all before deciding to commit
3+
4+ # Function to check if a command exists
5+ command_exists () {
6+ command -v " $1 " > /dev/null 2>&1
7+ }
8+
9+ # Allow bypassing the hook with an environment variable
10+ if [ " $SKIP_HOOK " = " 1" ]; then
11+ echo " Skipping lint, Snyk and Talisman scans (SKIP_HOOK=1)."
12+ exit 0
13+ fi
14+
15+ # Run ESLint check first
16+ echo " Running ESLint check..."
17+ npm run lint
18+ lint_exit_code=$?
19+
20+ if [ $lint_exit_code -ne 0 ]; then
21+ echo " ESLint check failed. Please fix the linting issues and try again."
22+ echo " You can run 'npm run format' to auto-fix most issues."
23+ exit 1
24+ fi
25+
26+ echo " ESLint check passed."
27+
28+ # Check if Snyk is installed
29+ if ! command_exists snyk; then
30+ echo " Error: Snyk is not installed. Please install it and try again."
31+ exit 1
32+ fi
33+
34+ # Check if Talisman is installed
35+ if ! command_exists talisman; then
36+ echo " Error: Talisman is not installed. Please install it and try again."
37+ exit 1
38+ fi
39+
40+ # Initialize variables to track scan results
41+ snyk_failed=false
42+ talisman_failed=false
43+
44+ # Run Snyk vulnerability scan
45+ echo " Running Snyk vulnerability scan..."
46+ snyk test --all-projects > snyk_output.log 2>&1
47+ snyk_exit_code=$?
48+
49+ if [ $snyk_exit_code -eq 0 ]; then
50+ echo " Snyk scan passed: No vulnerabilities found."
51+ elif [ $snyk_exit_code -eq 1 ]; then
52+ echo " Snyk found vulnerabilities. See snyk_output.log for details."
53+ snyk_failed=true
54+ else
55+ echo " Snyk scan failed with error (exit code $snyk_exit_code ). See snyk_output.log for details."
56+ snyk_failed=true
57+ fi
58+
59+ # Run Talisman secret scan (continues even if Snyk failed)
60+ echo " Running Talisman secret scan..."
61+ talisman --githook pre-commit > talisman_output.log 2>&1
62+ talisman_exit_code=$?
63+
64+ if [ $talisman_exit_code -eq 0 ]; then
65+ echo " Talisman scan passed: No secrets found."
66+ else
67+ echo " Talisman scan failed (exit code $talisman_exit_code ). See talisman_output.log for details."
68+ talisman_failed=true
69+ fi
70+
71+ # Evaluate results after both scans
72+ if [ " $snyk_failed " = true ] || [ " $talisman_failed " = true ]; then
73+ echo " Commit aborted due to issues found in one or both scans."
74+ [ " $snyk_failed " = true ] && echo " - Snyk issues: Check snyk_output.log"
75+ [ " $talisman_failed " = true ] && echo " - Talisman issues: Check talisman_output.log"
76+ exit 1
77+ fi
78+
79+ # If all checks pass, allow the commit
80+ echo " All checks passed (ESLint, Snyk, Talisman). Proceeding with commit."
81+ rm -f snyk_output.log talisman_output.log
82+ exit 0
0 commit comments