Awesome
eslint-plugin-github
Installation
npm install --save-dev eslint eslint-plugin-github
Setup
Legacy Configuration (.eslintrc
)
Add github
to your list of plugins in your ESLint config.
JSON ESLint config example:
{
"plugins": ["github"]
}
Extend the configs you wish to use.
JSON ESLint config example:
{
"extends": ["plugin:github/recommended"]
}
Flat Configuration (eslint-config.js
)
Import the eslint-plugin-github
, and extend any of the configurations using getFlatConfigs()
as needed like so:
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 intoeslint-plugin-github
as the originaleslint-filenames-plugin
is no longer maintained and needed a flat config support update.Please update the name to
github/filenames-match-regex
, 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:
internal
- Rules useful for github applications.
browser
- Useful rules when shipping your app to the browser.
react
- Recommended rules for React applications.
recommended
- Recommended rules for every application.
typescript
- Useful rules when writing TypeScript.
Component mapping (Experimental)
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
.
{
"settings": {
"github": {
"polymorphicPropName": "asChild",
"components": {
"Box": "p",
"Link": "a"
}
}
}
}
This config will be interpreted in the following way:
- All
<Box>
elements will be treated as ap
element type. <Link>
without a definedas
prop will be treated as aa
.<Link as='button'>
will be treated as abutton
element type.
Rules
<!-- begin auto-generated rules list -->πΌ Configurations enabled in.
π Set in the browser
configuration.
π Set in the internal
configuration.
βοΈ Set in the react
configuration.
β
Set in the recommended
configuration.
π§ Automatically fixable by the --fix
CLI option.
β Deprecated.
NameΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β | Description | πΌ | π§ | β |
---|---|---|---|---|
a11y-aria-label-is-well-formatted | [aria-label] text should be formatted as you would visual text. | βοΈ | ||
a11y-no-generic-link-text | disallow generic link text | β | ||
a11y-no-title-attribute | Guards against developers using the title attribute | βοΈ | ||
a11y-no-visually-hidden-interactive-element | Ensures 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 . | βοΈ | ||
a11y-svg-has-accessible-name | SVGs must have an accessible name | βοΈ | ||
array-foreach | enforce for..of loops over Array.forEach | β | ||
async-currenttarget | disallow event.currentTarget calls inside of async functions | π | ||
async-preventdefault | disallow event.preventDefault calls inside of async functions | π | ||
authenticity-token | disallow usage of CSRF tokens in JavaScript | π | ||
filenames-match-regex | ensure filenames 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 Element.prototype.blur() | π | ||
no-d-none | disallow usage the d-none CSS class | π | ||
no-dataset | enforce usage of Element.prototype.getAttribute instead of Element.prototype.datalist | π | ||
no-dynamic-script-tag | disallow creating dynamic script tags | β | ||
no-implicit-buggy-globals | disallow implicit global variables | β | ||
no-inner-html | disallow Element.prototype.innerHTML in favor of Element.prototype.textContent | π | ||
no-innerText | disallow Element.prototype.innerText in favor of Element.prototype.textContent | π | π§ | |
no-then | enforce using async/await syntax over Promises | β | ||
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 | π |