Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Pre-commit hook to check for Javascript using ESLint
#!/bin/sh
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep ".jsx\{0,1\}$")
if [[ "$STAGED_FILES" = "" ]]; then
exit 0
fi
PASS=true
echo "\nValidating Javascript:\n"
# Check for eslint
which eslint &> /dev/null
if [[ "$?" == 1 ]]; then
echo "\t\033[41mPlease install ESlint\033[0m"
exit 1
fi
for FILE in $STAGED_FILES
do
eslint "$FILE"
if [[ "$?" == 0 ]]; then
echo "\t\033[32mESLint Passed: $FILE\033[0m"
else
echo "\t\033[41mESLint Failed: $FILE\033[0m"
PASS=false
fi
done
echo "\nJavascript validation completed!\n"
if ! $PASS; then
echo "\033[41mCOMMIT FAILED:\033[0m Your commit contains files that should pass ESLint but do not. Please fix the ESLint errors and try again.\n"
exit 1
else
echo "\033[42mCOMMIT SUCCEEDED\033[0m\n"
fi
exit $?
@gajus
Copy link

gajus commented May 14, 2016

This does not work if eslint is installed locally, which it will almost always will be. I cannot think of a clean solution, though.

@iamjochem
Copy link

iamjochem commented Jun 29, 2016

@gajus, I had the same though. figured something out:

ESLINT="$(git rev-parse --show-toplevel)/node_modules/.bin/eslint"

check it's installed like so

if [[ ! -x "$ESLINT" ]]; then
  echo "\t\033[41mPlease install ESlint\033[0m (npm i --save --save-exact --dev eslint)"
  exit 1
fi

then use it in the for loop like so:

    "$ESLINT" "$FILE"

@mmottau
Copy link

mmottau commented Jul 18, 2016

@iamjochem, just wanted to send a quick note of thanks. Your post was very helpful.

@eXigentCoder
Copy link

eXigentCoder commented Sep 15, 2016

If you are working on a project where you check in the node_modules folder, and you would like to exclude these files, you can change the line 3 to:
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep ".jsx\{0,1\}$"| grep -v "node_modules")

@azharkhan
Copy link

azharkhan commented Mar 7, 2017

@iamjochem, thank you again for your command line fu on that post. it was very helpful and much appreciated!

@wpcarro
Copy link

wpcarro commented Jan 5, 2018

@iamjochem - A simpler approach than assigning the eslint binary to $ESLINT would be calling:

$ npx eslint

@adnanaliarshad
Copy link

adnanaliarshad commented Nov 28, 2018

Any idea why I am facing this issue for above code?
This is occurring on source tree.

Validating Javascript:
env: node: No such file or directory

@filipef101
Copy link

filipef101 commented Jan 8, 2019

bump

@nagarjunaj11
Copy link

nagarjunaj11 commented Jul 17, 2019

HI I need some info reg the GIT prehook commits using ES Lint. Can anyone has idea?
Please give ur gmail id or phone number

@NookieGrey
Copy link

NookieGrey commented Jan 28, 2020

what about Windows users?

@RiyaGupta89
Copy link

RiyaGupta89 commented Aug 11, 2021

@gajus, I had the same though. figured something out:

ESLINT="$(git rev-parse --show-toplevel)/node_modules/.bin/eslint"

check it's installed like so

if [[ ! -x "$ESLINT" ]]; then
  echo "\t\033[41mPlease install ESlint\033[0m (npm i --save --save-exact --dev eslint)"
  exit 1
fi

then use it in the for loop like so:

    "$ESLINT" "$FILE"

You haven't specified on which file to add this?

@charisTheo
Copy link

charisTheo commented Jan 9, 2022

Any idea why I am facing this issue for above code?
This is occurring on source tree.

Validating Javascript:
env: node: No such file or directory

Facing the same issue. Anyone any ideas why?

@charisTheo
Copy link

charisTheo commented Jan 9, 2022

@adnanaliarshad Fixed it by adding the following on the top of the pre-commit file:

export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

@JasonPubC
Copy link

JasonPubC commented Apr 26, 2022

Any idea why I am facing this issue for above code? This is occurring on source tree.

Validating Javascript:
env: node: No such file or directory

I get this error from "VS Code" because Node is not present in the hook.
As suggested by @charisTheo - adding NVM will help fix the paths for node.

I personally use Brew on MacOS, so this works well for both Brew + native NVM users.
Add this to the top just underneath the starting line #!/bin/bash

Thanks to the original author for this hook, it has worked very well for our team ❤️

export NVM_DIR="$HOME/.nvm"

if [[ -f "/opt/homebrew/bin/brew" ]]; then
	eval "$(/opt/homebrew/bin/brew shellenv)"
	[ -s "$(brew --prefix)/opt/nvm/nvm.sh" ] && . "$(brew --prefix)/opt/nvm/nvm.sh" # This loads nvm
	[ -s "$(brew --prefix)/opt/nvm/etc/bash_completion.d/nvm" ] && . "$(brew --prefix)/opt/nvm/etc/bash_completion.d/nvm"
else
	[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
	[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
fi

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment