nicknisi

Lint JavaScript on Commit

12 Nov 20121 minute read

My team has been working a lot to improve our code quality and to introduce best practices between us. One way we’ve done this is through the use of JSHint. Because we use different editors it can be difficult to make sure that everyone’s environment is configured to analyze code the same way, but git is a common tool between us. Here is a pre-commit hook, which checks all .js files included in the commit against your JSHint configuration. If it doesn’t pass, the errors are printed to the screen and the commit is cancelled.

#!/bin/sh
# JSHint Pre-Commit
# Place this in your .git/hooks/pre-commit directory and rename to `pre-commit`
# expects jshint to be installed in your projects node_modules directory

EXIT_CODE=0
COLOR_RED="\x1B[31m"
COLOR_GREEN="\x1B[32m"
COLOR_NONE="\x1B[0m"

repo=$( git rev-parse --show-toplevel )
jshint=${repo}/node_modules/jshint/bin/hint

for file in $( exec git diff-index --cached --name-only HEAD ); do
	if [[ $file == *".js"* ]]; then
		status=$( exec git status --porcelain $file )

		if [[ $status != D* ]]; then
			# ${jshint} ${repo}/${file} >/dev/null 2>&1
			${jshint} ${repo}/${file}
			EXIT_CODE=$((${EXIT_CODE} + $?))
		fi
	fi
done

echo ""
if [[ ${EXIT_CODE} -ne 0 ]]; then
	echo "${COLOR_RED}✘ JSHINT detected syntax problems.${COLOR_NONE}"
else
	echo "${COLOR_GREEN}✔ JSHINT detected no errors.${COLOR_NONE}"
fi

exit $((${EXIT_CODE}))
author

Nick Nisi

A passionate TypeScript enthusiast, podcast host, and dedicated community builder.

Follow me on Bluesky.