# @zanminkian/git-hooks

[![](https://img.shields.io/npm/l/@zanminkian/git-hooks.svg)](https://github.com/zanminkian/git-hooks/blob/master/LICENSE)
[![](https://img.shields.io/npm/v/@zanminkian/git-hooks.svg)](https://www.npmjs.com/package/@zanminkian/git-hooks)
[![](https://img.shields.io/npm/dm/@zanminkian/git-hooks.svg)](https://www.npmjs.com/package/@zanminkian/git-hooks)
[![](https://img.shields.io/librariesio/release/npm/@zanminkian/git-hooks)](https://www.npmjs.com/package/@zanminkian/git-hooks)
[![](https://packagephobia.com/badge?p=@zanminkian/git-hooks)](https://packagephobia.com/result?p=@zanminkian/git-hooks)

> `@zanminkian/git-hooks` is now `git-validator`. Use `git-validator` instead.

This is a bundle of opinionated git hooks, all in one!

Replace `husky`, `eslint`, `lint-staged`, and `commitlint` in your project with this npm package.

## Features

- **Unified package**: Just **ONE** npm package to install replacing multiple.
- **Simple to use**: Only two steps required; setting up scripts and installation.
- **Zero Configuration**: Sensible default settings suitable for enterprise apps.

## Usage

Set up the following scripts in your `package.json`:

- `git-hooks install`: Installs hook files to `{PROJECT_ROOT}/.git/hooks` directory, which will check your code and commit messages after running the `git commit` command.
- `git-hooks format`: Checks and formats all project files using the `eslint --fix` command.
- `git-hooks lint`: Checks all project files using the `eslint` command.

```json
{
  "scripts": {
    "postinstall": "git-hooks install",
    "format": "git-hooks format",
    "lint": "git-hooks lint"
  }
}
```

Next, install the package:

```sh
pnpm add -D @zanminkian/git-hooks
```

Now you can commit code to your project. Invalid code or commit messages will be automatically blocked.

## How it Works

Running `git-hooks install` writes `commit-msg` and `pre-commit` files to the `{PROJECT_ROOT}/.git/hooks` directory.

- The `commit-msg` file lints your git commit message before the commit is made.
- The `pre-commit` file lints your staged code before the commit is made.

## Advanced Usage

### Working with `husky`

This library can work as a standalone package. However, if you have Husky 5 or a later version installed, you'll need to manually add `.husky/commit-msg` and `.husky/pre-commit`, as Husky will ignore the `.git/hooks/commit-msg` and `.git/hooks/pre-commit`:

```sh
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

.git/hooks/commit-msg $1
```

```sh
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

.git/hooks/pre-commit $1
```

### Setup `pre-push` Stage

Running `git-hooks install` writes `commit-msg` and `pre-commit` files only. As git `pre-push` stage is widely used, you can run `git-hooks install --pre-push <cmd>` to setup git `pre-push` stage additionally.

```json
{
  "scripts": {
    "postinstall": "git-hooks install --pre-push 'npm run test'"
  }
}
```

### Customizing eslint Config

Under the hood, we use `eslint` to lint and format code. If you want to use a different eslint config, add your own `.eslintrc.js` at the root of your project. Here's an example:

```js
module.exports = {
  rules: {
    // write your rules here
  }
}
```

## Contributing

- Clone this repository.
- Enable [Corepack](https://github.com/nodejs/corepack) using `corepack enable` (use `npm i -g corepack` for Node.js < 16.10).
- Install dependencies using `pnpm install`.
- Start coding and submit your PR.

## Show your support

Give a ⭐️ if this project helped you!

## License

MIT
