Skip to content

Concept: Shareable configuration

Most commonly shareable configuration is delivered as npm package exporting an object containing .rules as default. To use shared configuration you specify it as item in the .extends array:

js
/**
 * @type {import('@commitlint/types').UserConfig}
 */
export default {
  extends: ['example'], // => commitlint-config-example
};

This causes commitlint to pick up commitlint-config-example. Make it available by installing it.

sh
npm install --save-dev commitlint-config-example

The rules found in commitlint-config-example are merged with the rules in commitlint.config.js, if any.

This works recursively, enabling shareable configuration to extend on an indefinite chain of other shareable configurations.

Relative config

You can also load local configuration by using a relative path to the file.

WARNING

This must always start with a . (dot).

js
export default {
  extends: ['./example'], // => ./example.js
};

Scoped packages

When using scoped packages you have two options.

You can provide the full path of the package like:

js
export default {
  extends: ['@commitlint/config-conventional'], // => @commitlint/config-conventional
};

Or just the scope/owner of the package.

TIP

Just like "normal" extends listed above, this will add <scope>/commitlint-config.

js
export default {
  extends: ['@coolcompany'], // => @coolcompany/commitlint-config
};

If you don't use the exact <scope>/commitlint-config pattern, you have to provide the full name of the package.