Skip to main content

Pre-commit Hooks

Pre-commit hooks prevent broken code from being committed. Every commit is automatically checked for lint errors, formatting issues, and type errors before it enters git history.

Setup (Both Repos)

Install Husky + lint-staged

# In TrickList/ or Backend/
npm install --save-dev husky lint-staged

# Initialize Husky
npx husky init

This creates a .husky/ directory with a pre-commit hook.

Configure the Hook

Replace .husky/pre-commit contents:

npx lint-staged

Configure lint-staged

Add to package.json:

TrickList (Mobile)

{
"lint-staged": {
"*.{ts,tsx}": [
"biome check --write --no-errors-on-unmatched",
"biome format --write --no-errors-on-unmatched"
],
"*.{json,md}": [
"biome format --write --no-errors-on-unmatched"
]
}
}

Backend

{
"lint-staged": {
"*.js": [
"biome check --write --no-errors-on-unmatched",
"biome format --write --no-errors-on-unmatched"
],
"*.{json,md}": [
"biome format --write --no-errors-on-unmatched"
]
}
}

What Runs on Commit

git commit -m "feat: add trick list"


lint-staged

├── biome check --write (lint + auto-fix staged files)
├── biome format --write (format staged files)


Pass? ──── Yes ──── Commit created

No


Commit blocked, errors printed

Only staged files are checked, so it's fast even in large repos.

Optional: Add Typecheck

For TrickList, you can add a full typecheck on commit. This is slower but catches type errors:

{
"lint-staged": {
"*.{ts,tsx}": [
"biome check --write --no-errors-on-unmatched",
"biome format --write --no-errors-on-unmatched"
]
},
"scripts": {
"precommit:typecheck": "tsc --noEmit"
}
}

And update .husky/pre-commit:

npx lint-staged
npm run precommit:typecheck

Bypassing Hooks

In rare cases (emergency hotfix, WIP commit), hooks can be bypassed:

git commit --no-verify -m "hotfix: emergency fix"

This should be rare. CI will still catch any issues on the PR.

Troubleshooting

Hook not running

# Ensure hooks are executable
chmod +x .husky/pre-commit

# Reinstall hooks
npx husky install

Biome not found

# Ensure it's in devDependencies
npm install --save-dev @biomejs/biome