co-mono/.husky/pre-commit
2026-03-05 16:45:36 -08:00

68 lines
1.7 KiB
Bash
Executable file

#!/bin/sh
# Get list of staged files before running checks
STAGED_FILES=$(git diff --cached --name-only)
if [ -z "$STAGED_FILES" ]; then
echo "No staged files to check."
exit 0
fi
echo "Running checks on staged files..."
run_checks() {
# shellcheck disable=SC2086 # intentionally preserving word splitting for file list
CHECK_OUTPUT=""
CHECK_STATUS=0
set +e
CHECK_OUTPUT="$(npx -y @biomejs/biome check --write --error-on-warnings "$1" 2>&1)"
CHECK_STATUS=$?
set -e
if [ "$CHECK_STATUS" -ne 0 ]; then
if printf '%s\n' "$CHECK_OUTPUT" | grep -Fq "No files were processed in the specified paths."; then
return 0
fi
echo "$CHECK_OUTPUT"
return "$CHECK_STATUS"
fi
[ -n "$CHECK_OUTPUT" ] && echo "$CHECK_OUTPUT"
}
# Run Biome only when staged files include style targets
if echo "$STAGED_FILES" | grep -Eq '\.(ts|tsx|js|jsx|json)$'; then
echo "Running biome on staged files..."
TS_OR_JS_FILES=$(echo "$STAGED_FILES" | grep -E '\.(ts|tsx|js|jsx|json)$' | tr '\n' ' ')
if [ -n "$TS_OR_JS_FILES" ]; then
run_checks "$TS_OR_JS_FILES"
fi
fi
RUN_BROWSER_SMOKE=0
for file in $STAGED_FILES; do
case "$file" in
packages/ai/*|packages/web-ui/*|package.json|package-lock.json)
RUN_BROWSER_SMOKE=1
break
;;
esac
done
if [ $RUN_BROWSER_SMOKE -eq 1 ]; then
echo "Running browser smoke check..."
npm run check:browser-smoke
if [ $? -ne 0 ]; then
echo "❌ Browser smoke check failed."
exit 1
fi
fi
# Restage files that were previously staged and may have been modified by formatting
for file in $STAGED_FILES; do
if [ -f "$file" ]; then
git add "$file"
fi
done
echo "✅ All pre-commit checks passed!"