🧠 Configuration
Base options
The eslint-config-sheriff
package exports a sheriff
function.
You can configure Sheriff by passing an object to the sheriff
function.
Every config option can be set on and off (by passing them booleans). As they are all opt-in, they are all disabled by default. If you bootstrapped the config with npm init @sherifforg/config
some of these values will be inferred automatically from your project.
- JS
- TS
import sheriff from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
// Sheriff configuration object
const sheriffOptions = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false,
};
export default defineFlatConfig([...sheriff(sheriffOptions)]);
import { sheriff, type SheriffSettings } from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
// Sheriff configuration object
const sheriffOptions: SheriffSettings = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false,
};
export default defineFlatConfig([...sheriff(sheriffOptions)]);
Remodeling
You can override any Sheriff rule as desired in the eslint.config.js
file.
For example, let's say you want to disable a Sheriff rule, like 'import/first':
- JS
- TS
import sheriff from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false,
};
export default defineFlatConfig([
...sheriff(sheriffOptions),
{
rules: {
"import/first": 0, // 'import/first' is now disabled everywhere.
},
},
]);
import { sheriff, type SheriffSettings } from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions: SheriffSettings = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false,
};
export default defineFlatConfig([
...sheriff(sheriffOptions),
{
rules: {
"import/first": 0, // 'import/first' is now disabled everywhere.
},
},
]);
Likewise, let's say you want to enable a new rule:
- JS
- TS
import sheriff from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false,
};
export default defineFlatConfig([
...sheriff(sheriffOptions),
{
rules: {
"import/first": 2, // 'import/first' is now enabled everywhere.
},
},
]);
import { sheriff, type SheriffSettings } from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions: SheriffSettings = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false,
};
export default defineFlatConfig([
...sheriff(sheriffOptions),
{
rules: {
"import/first": 2, // 'import/first' is now enabled everywhere.
},
},
]);
This is just the standard behavior for ESLint’s “flat” configuration system, illustrated here for your convenience. Sheriff doesn’t alter this in any way.
For more in-depth information, refer to the official docs.
Advanced options
The upcoming configuration options are meant to be situational, tailored to serve only a niche group of users and designed to address specific use cases. Only use these if you end up needing them.
files
This option is primarily meant to be used while introducing Sheriff to an existing project.
Learn more in the ♻ Migration guide.
ignores
By default, Sheriff will ignore certain filepaths, but you can choose to opt out of this behavior.
ignores: {
recommended: boolean;
inheritedFromGitignore: boolean;
}
ignores.recommended
With this option, Sheriff will ignore a list of commonly ignored folders:
**/node_modules/**
**/dist/**
**/build/**
**/artifacts/**
**/coverage/**
eslint.config.{js,mjs,cjs}
Example:
- JS
- TS
import sheriff from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false,
ignores: {
recommended: true, // true by default. False to disable.
},
};
export default defineFlatConfig([...sheriff(sheriffOptions)]);
import { sheriff, type SheriffSettings } from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions: SheriffSettings = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false,
ignores: {
recommended: true, // true by default. False to disable.
},
};
export default defineFlatConfig([...sheriff(sheriffOptions)]);
ignores.inheritedFromGitignore
With this option, Sheriff will ignore the same filepaths specified in your .gitignore
file.
Example:
- JS
- TS
import sheriff from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false,
ignores: {
inheritedFromGitignore: true, // true by default. False to disable.
},
};
export default defineFlatConfig([...sheriff(sheriffOptions)]);
import { sheriff, type SheriffSettings } from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions: SheriffSettings = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false,
ignores: {
inheritedFromGitignore: true, // true by default. False to disable.
},
};
export default defineFlatConfig([...sheriff(sheriffOptions)]);
pathsOverrides
As outlined in the criteria page, Sheriff comes with sensible defaults. However, as your project grows, your team may need to override some of these defaults. This option lets you do that.
pathsOverrides: {
tsconfigLocation: string | string[];
tests: string[];
}
pathsOverrides.tsconfigLocation
By default, Sheriff will use the project: true
option to locate your project’s tsconfig.json
.
However, if you have multiple tsconfig.json
files in your project (like tsconfig.json
, tsconfig.eslint.json
, tsconfig.node.json
, etc...), you can use this parameter to specify which config Sheriff will pick up.
You can pass it a path as a string (or a list of paths as a array of strings, see: One tsconfig.json
per package).
Example:
- JS
- TS
import sheriff from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false,
pathsOverrides: {
tsconfigLocation: "./tsconfig.eslint.json",
},
};
export default defineFlatConfig([...sheriff(sheriffOptions)]);
import { sheriff, type SheriffSettings } from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions: SheriffSettings = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false,
pathsOverrides: {
tsconfigLocation: "./tsconfig.eslint.json",
},
};
export default defineFlatConfig([...sheriff(sheriffOptions)]);
pathsOverrides.tests
By default, Sheriff will only apply Jest or Vitest rules on specific files.
[
"**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts}",
"**/tests/**/*.{js,mjs,cjs,ts,mts,cts}",
"**/__tests__/**/*.{js,mjs,cjs,ts,mts,cts}"
]
This setting overrides the default.
It accepts an array of filepaths, and supports minimatch syntax.
Example:
- JS
- TS
import sheriff from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false,
pathsOverrides: {
tests: [
"**/*.mySpecialName.{js,mjs,cjs,ts,mts,cts}",
"**/mySpecialFolder/**/*.{js,mjs,cjs,ts,mts,cts}",
"**/__mySpecialFolder__/**/*.{js,mjs,cjs,ts,mts,cts}",
],
},
};
export default defineFlatConfig([...sheriff(sheriffOptions)]);
import { sheriff, type SheriffSettings } from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions: SheriffSettings = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false,
pathsOverrides: {
tests: [
"**/*.mySpecialName.{js,mjs,cjs,ts,mts,cts}",
"**/mySpecialFolder/**/*.{js,mjs,cjs,ts,mts,cts}",
"**/__mySpecialFolder__/**/*.{js,mjs,cjs,ts,mts,cts}",
],
},
};
export default defineFlatConfig([...sheriff(sheriffOptions)]);
pathsOverrides.playwrightTests
By default, Sheriff will only apply Playwright rules on specific files.
"js,mjs,cjs,ts,mts,cts"
This setting overrides the default.
It accepts an array of filepaths, and supports minimatch syntax.
Example:
- JS
- TS
import sheriff from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false,
playwrightTests: {
tests: [
"**/*.mySpecialName.{js,mjs,cjs,ts,mts,cts}",
"**/mySpecialFolder/**/*.{js,mjs,cjs,ts,mts,cts}",
"**/__mySpecialFolder__/**/*.{js,mjs,cjs,ts,mts,cts}",
],
},
};
export default defineFlatConfig([...sheriff(sheriffOptions)]);
import { sheriff, type SheriffSettings } from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions: SheriffSettings = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false,
pathsOverrides: {
playwrightTests: [
"**/*.mySpecialName.{js,mjs,cjs,ts,mts,cts}",
"**/mySpecialFolder/**/*.{js,mjs,cjs,ts,mts,cts}",
"**/__mySpecialFolder__/**/*.{js,mjs,cjs,ts,mts,cts}",
],
},
};
export default defineFlatConfig([...sheriff(sheriffOptions)]);
Customizing the no-restricted-syntax
options
ESLint provides a very powerful rule called no-restricted-syntax
. It accepts an array of objects. Each object represents a specific syntax feature that you want to forbid.
Sheriff already comes with a preconfigured no-restricted-syntax
entry. However, you can customize it in a few different ways.
Override
Override the rule in full.
You can add no-restricted-syntax
to a configuration object of your own to fully override the Sheriff one.
You can do this as you normally would, appending the rule to the configuration array after Sheriff.
Example:
- JS
- TS
import sheriff from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false,
};
export default defineFlatConfig([
...sheriff(sheriffOptions),
{
rules: {
"no-restricted-syntax": [
2,
// Your custom rules here…
],
},
}
]);
import { sheriff, type SheriffSettings } from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions: SheriffSettings = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false,
};
export default defineFlatConfig([
...sheriff(sheriffOptions),
{
rules: {
"no-restricted-syntax": [
2,
// Your custom rules here…
],
},
}
]);
Extend
Conveniently, Sheriff exports its own no-restricted-syntax
entry as the baseNoRestrictedSyntaxRules
array.
To extend Sheriff’s entry of no-restricted-syntax
, you can use the JavaScript spread syntax.
Example:
- JS
- TS
import sheriff, { baseNoRestrictedSyntaxRules } from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false
};
export default defineFlatConfig([
...sheriff(sheriffOptions),
{
rules: {
"no-restricted-syntax": [
2,
...baseNoRestrictedSyntaxRules,
// Your custom rules here…
],
},
}
]);
import sheriff, { baseNoRestrictedSyntaxRules, type SheriffSettings } from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions: SheriffSettings = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false
};
export default defineFlatConfig([
...sheriff(sheriffOptions),
{
rules: {
"no-restricted-syntax": [
2,
...baseNoRestrictedSyntaxRules,
// Your custom rules here…
],
},
}
]);
Shrink
Conveniently, Sheriff exports its own no-restricted-syntax
entry as the baseNoRestrictedSyntaxRules
array.
To shrink Sheriff’s entry of no-restricted-syntax
, you can use the Array#toSpliced()
method
to remove entries you dislike.
Every entry prints the index of itself at the end of the message
property, so you can easily identify which one you want to remove.
Example:
- JS
- TS
import sheriff from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false
};
export default defineFlatConfig([
...sheriff(sheriffOptions),
{
rules: {
"no-restricted-syntax": [
2,
...baseNoRestrictedSyntaxRules.toSpliced(2, 1) // This results in `baseNoRestrictedSyntaxRules` without the third element.
],
},
};
]);
import { sheriff, type SheriffSettings } from "eslint-config-sheriff";
import { defineFlatConfig } from "eslint-define-config";
const sheriffOptions: SheriffSettings = {
react: false,
next: false,
astro: false,
lodash: false,
remeda: false,
playwright: false,
jest: false,
vitest: false
};
export default defineFlatConfig([
...sheriff(sheriffOptions),
{
rules: {
"no-restricted-syntax": [
2,
...baseNoRestrictedSyntaxRules.toSpliced(2, 1) // This results in `baseNoRestrictedSyntaxRules` without the third element.
],
},
};
]);