eslint-plugin-github icon indicating copy to clipboard operation
eslint-plugin-github copied to clipboard

An opinionated collection of ESLint rules used by GitHub.

eslint-plugin-github

Installation

$ npm install --save-dev eslint eslint-plugin-github

Setup

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"]
}

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.

For each component, you may specify a default and/or props. default may make sense if there's a 1:1 mapping between a component and an HTML element. However, if the HTML output of a component is dependent on a prop value, you can provide a mapping using the props key. To minimize conflicts and complexity, this currently only supports the mapping of a single prop type.

{
  "settings": {
    "github": {
      "components": {
        "Box": { "default": "p" },
        "Link": { "props": {"as": { "undefined": "a", "a": "a", "button": "button"}}},
      }
    }
  }
}

This config will be interpreted in the following way:

  • All <Box> elements will be treated as a p element type.
  • <Link> without a defined as prop will be treated as a a.
  • <Link as='a'> will treated as an a element type.
  • <Link as='button'> will be treated as a button element type.
  • <Link as='summary'> will be treated as the raw Link type because there is no configuration set for as='summary'.

Rules

  • Array Foreach
  • Async Currenttarget
  • Async Preventdefault
  • Authenticity Token
  • Get Attribute
  • JS Class Name
  • No Blur
  • No D None
  • No Dataset
  • No Dynamic Script Tag
  • No Implicit Buggy Globals
  • No Inner HTML
  • No InnerText
  • No Then
  • No Useless Passive
  • Prefer Observers
  • Require Passive Events
  • Unescaped HTML Literal

Accessibility-focused rules (prefixed with a11y)

  • No Generic Link Text