npm package: @infernodesign/commitlint-config
Description: Shared CommitLint config for Inferno Design.
Author: Inferno Design
Latest version: 1.4.0

# @infernodesign/commitlint-config

Shared Commitlint config presets for Inferno Design projects that enforce the [Conventional Commits v1.0 Specification](https://www.conventionalcommits.org/en/v1.0.0/).

## Usage

### Installation

Install the required dependencies in your project:

```shell
bun add -D @infernodesign/commitlint-config @commitlint/cli
```

You can configure Commitlint in the `package.json` of your project:

```json
{
  "commitlint": {
    "extends": [ "@infernodesign/commitlint-config" ]
  }
}
```

Or, create a `commitlint.config.js` file in your project root:

```js
/** @type {import("@commitlint/types").UserConfig} */
export default {
  extends: [ '@infernodesign/commitlint-config' ],
}
```

Ensure `commitlint` is set up in the Husky `commit-msg` hook (e.g., `.husky/commit-msg`):

```shell
bunx commitlint --edit "$1"
```

## Rules

### Problems

The following rules are considered problems for
`@infernodesign/commitlint-config` and will yield a non-zero exit code when not met.

Consult the [Commitlint Rules Reference](https://commitlint.js.org/reference/rules) for a list of all available rules.

#### type-enum

- **condition**: `type` is found in value
- **rule**: `always`
- **level**: `error`
- **value**:

    ```json
    [
      "build",
      "chore",
      "ci",
      "docs",
      "feat",
      "fix",
      "perf",
      "refactor",
      "revert",
      "style",
      "test"
    ]
    ```

```shell
echo "foo: some message" # fails
echo "fix: some message" # passes
```

#### type-case

- **description**: `type` is in case `value`
- **rule**: `always`
- **level**: `error`
- **value**: `'lowerCase'`

```shell
echo "FIX: some message" # fails
echo "fix: some message" # passes
```

#### type-empty

- **condition**: `type` is empty
- **rule**: `never`
- **level**: `error`

```shell
echo ": some message" # fails
echo "fix: some message" # passes
```

#### subject-case

- **condition**: `subject` is in one of the cases `['sentence-case', 'start-case', 'pascal-case', 'upper-case']`
- **rule**: `never`
- **level**: `error`

```shell
echo "fix(SCOPE): Some message" # fails
echo "fix(SCOPE): Some Message" # fails
echo "fix(SCOPE): SomeMessage" # fails
echo "fix(SCOPE): SOMEMESSAGE" # fails
echo "fix(scope): some message" # passes
echo "fix(scope): some Message" # passes
```

#### subject-empty

- **condition**: `subject` is empty
- **rule**: `never`
- **level**: `error`

```shell
echo "fix:" # fails
echo "fix: some message" # passes
```

#### subject-full-stop

- **condition**: `subject` ends with `value`
- **rule**: `never`
- **level**: `error`
- **value**: `'.'`

```shell
echo "fix: some message." # fails
echo "fix: some message" # passes
```

#### subject-exclamation-mark

- **condition**: `subject` has exclamation before the `:` marker
- **rule**: `never`
- **level**: `error`
- **value**: `'!'`

```shell
echo "fix!: some message" # fails
echo "fix: some message" # passes
```

#### header-max-length

- **condition**: `header` has `value` or less characters
- **rule**: `always`
- **level**: `error`
- **value**: `100`

```shell
echo "fix: some message that is way too long and breaks the line max-length by several characters" # fails
echo "fix: some message" # passes
```

#### footer-leading-blank

- **condition**: `footer` should have a leading blank line
- **rule**: `always`
- **level**: `warning`

```shell
echo "fix: some message
BREAKING CHANGE: It will be significant" # warning

echo "fix: some message

BREAKING CHANGE: It will be significant" # passes
```

#### footer-max-line-length

- **condition**: `footer` each line has `value` or less characters
- **rule**: `always`
- **level**: `error`
- **value**: `100`

```shell
echo "fix: some message

BREAKING CHANGE: footer with multiple lines
has a message that is way too long and will break the line rule 'line-max-length' by several characters" # fails

echo "fix: some message

BREAKING CHANGE: footer with multiple lines
but still no line is too long" # passes
```

#### body-leading-blank

- **condition**: `body` should have a leading blank line
- **rule**: `always`
- **level**: `warning`

```shell
echo "fix: some message
body" # warning

echo "fix: some message

body" # passes
```

#### body-max-line-length

- **condition**: `body` each line has `value` or less characters
- **rule**: `always`
- **level**: `error`
- **value**: `100`

```shell
echo "fix: some message

body with multiple lines
has a message that is way too long and will break the line rule 'line-max-length' by several characters" # fails

echo "fix: some message

body with multiple lines
but still no line is too long" # passes
```

## License

Licensed under the [MIT License](./LICENSE).