An opinionated collection of ESLint shared configs and rules used by GitHub.
``sh`
npm install --save-dev eslint eslint-plugin-github
Add github to your list of plugins in your ESLint config.
JSON ESLint config example:
`json`
{
"plugins": ["github"]
}
Extend the configs you wish to use.
JSON ESLint config example:
`json`
{
"extends": ["plugin:github/recommended"]
}
Import the eslint-plugin-github, and extend any of the configurations using getFlatConfigs() as needed like so:
`js
import github from 'eslint-plugin-github'
export default [
github.getFlatConfigs().browser,
github.getFlatConfigs().recommended,
github.getFlatConfigs().react,
...github.getFlatConfigs().typescript,
{
files: ['*/.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}'],
ignores: ['eslint.config.mjs'],
rules: {
'github/array-foreach': 'error',
'github/async-preventdefault': 'warn',
'github/no-then': 'error',
'github/no-blur': 'error',
},
},
]
`
> [!NOTE]
> If you configured the filenames/match-regex rule, please note we have adapted the match regex rule into eslint-plugin-github as the original eslint-filenames-plugin is no longer maintained and needed a flat config support update. github/filenames-match-regex
>
> Please update the name to , and note, the default rule is kebab case or camelCase with one hump. For custom configuration, such as matching for camelCase regex, here's an example:'github/filenames-match-regex': ['error', '^([a-z0-9]+)([A-Z][a-z0-9]+)*$'],
>
>
The available configs are:
- internalbrowser
- Rules useful for github applications.
- react
- Useful rules when shipping your app to the browser.
- recommended
- Recommended rules for React applications.
- typescript
- Recommended rules for every application.
-
- Useful rules when writing TypeScript.
_Note: This is experimental and subject to change._
The react config includes rules which target specific HTML elements. You may provide a mapping of custom components to an HTML element in your eslintrc configuration to increase linter coverage.
By default, these eslint rules will check the "as" prop for underlying element changes. If your repo uses a different prop name for polymorphic components provide the prop name in your eslintrc configuration under polymorphicPropName.
`json`
{
"settings": {
"github": {
"polymorphicPropName": "asChild",
"components": {
"Box": "p",
"Link": "a"
}
}
}
}
This config will be interpreted in the following way:
- All elements will be treated as a p element type.
- without a defined as prop will be treated as a a.
- will be treated as a button element type.
💼 Configurations enabled in.\
🔍 Set in the browser configuration.\internal
🔐 Set in the configuration.\react
⚛️ Set in the configuration.\recommended
✅ Set in the configuration.\--fix
🔧 Automatically fixable by the CLI option.\
❌ Deprecated.
| Name | Description | 💼 | 🔧 | ❌ |
| :------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :- | :- | :- |
| a11y-aria-label-is-well-formatted | enforce [aria-label] text to be formatted as you would visual text. | ⚛️ | | |
| a11y-no-generic-link-text | disallow generic link text | | | ❌ |
| a11y-no-title-attribute | disallow using the title attribute | ⚛️ | | |
| a11y-no-visually-hidden-interactive-element | enforce that interactive elements are not visually hidden | ⚛️ | | |
| a11y-role-supports-aria-props | enforce that elements with explicit or implicit roles defined contain only aria-* properties supported by that role. | ⚛️ | | |for..of
| a11y-svg-has-accessible-name | require SVGs to have an accessible name | ⚛️ | | |
| array-foreach | enforce loops over Array.forEach | ✅ | | |event.currentTarget
| async-currenttarget | disallow calls inside of async functions | 🔍 | | |event.preventDefault
| async-preventdefault | disallow calls inside of async functions | 🔍 | | |Element.prototype.blur()
| authenticity-token | disallow usage of CSRF tokens in JavaScript | 🔐 | | |
| filenames-match-regex | require filenames to match a regex naming convention | | | |
| get-attribute | disallow wrong usage of attribute names | 🔍 | 🔧 | |
| js-class-name | enforce a naming convention for js- prefixed classes | 🔐 | | |
| no-blur | disallow usage of | 🔍 | | |d-none
| no-d-none | disallow usage the CSS class | 🔐 | | |Element.prototype.getAttribute
| no-dataset | enforce usage of instead of Element.prototype.datalist | 🔍 | | |Element.prototype.innerHTML
| no-dynamic-script-tag | disallow creating dynamic script tags | ✅ | | |
| no-implicit-buggy-globals | disallow implicit global variables | ✅ | | |
| no-inner-html | disallow in favor of Element.prototype.textContent | 🔍 | | |Element.prototype.innerText
| no-innerText | disallow in favor of Element.prototype.textContent | 🔍 | 🔧 | |async/await` syntax over Promises | ✅ | | |
| no-then | enforce using
| no-useless-passive | disallow marking a event handler as passive when it has no effect | 🔍 | 🔧 | |
| prefer-observers | disallow poorly performing event listeners | 🔍 | | |
| require-passive-events | enforce marking high frequency event handlers as passive | 🔍 | | |
| unescaped-html-literal | disallow unescaped HTML literals | 🔍 | | |