Skip to content

Instantly share code, notes, and snippets.

@codfish
Last active July 5, 2023 12:29
Show Gist options
  • Star 16 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save codfish/91ef26f3a56a5c5ca0912aa8c0c5c020 to your computer and use it in GitHub Desktop.
Save codfish/91ef26f3a56a5c5ca0912aa8c0c5c020 to your computer and use it in GitHub Desktop.
Prettier + ESLint + airbnb + Husky + lint-staged + commitlint

My personal & professional linting setup. Extends airbnb's ESLint config first, then Prettier. Run's Prettier as an ESLint rule via their ESLint plugin. Dynamic support for react or non-react applications depending on your project dependencies. Dynamic inclusion of Kent C Dodds' ESLint Jest config depending on your project dependencies.

Convenient opt-in configs for projects using Docker or Ethereum to avoid common false positives.

To understand more, see https://github.com/codfish/eslint-config-codfish.

To avoid having to manually setup everything and add all configuration/boilerplate code to your project, use cod-scripts instead. It was forked from kcd-scripts and ultimately inspired by react-scripts.

Why

Ultimate goal is maximize code linting coverage, leveraging the power of Prettier while deferring to Airbnb's style guide AS MUCH as possible without breaking anything. Idea being that Airbnb's styleguide happens to be the most popular, well documented, and well maintained open-source JS styleguide.

I typically work in very large teams where consensus can be difficult, and linting is like politics, people are generally passionate and rarely unopinionated. I've found that, while we all may not agree on everything in Airbnb's approach, sticking to a styleguide like theirs and avoiding opinionated overrides has had the most success across the teams I've worked on. It also helps relieve the burden of maintaining a custom set of rules (as well as the documentation).

There has to be a very good reason for an override: https://github.com/codfish/eslint-config-codfish/blob/2444e8b63426d8cea1e6da47bce1561278ddd2c2/index.js#L19

Installation

You may be able to uninstall a number of top-level dependencies from your project but be careful.

npm uninstall @babel/core @babel/cli @babel/preset-env @babel/preset-react eslint eslint-config-codfish prettier husky lint-staged jest @commitlint/cli @commitlint/config-conventional markdownlint-cli
npm install --save-dev cod-scripts
npm install --save @babel/runtime

Usage

Full usage: https://github.com/codfish/cod-scripts#usage

  • Delete configuration.
sh -c 'rm -f .babelrc* .eslintrc* .eslintignore .huskyrc* .lintstagedrc* .prettierrc* .prettierignore jest.config.js .commitlintrc* commitlint* .markdownlint*'
  • Delete any configs from the package.json, i.e. jest.
  • Update package.json with the following:
"eslintConfig": {
  "extends": [
    "./node_modules/cod-scripts/eslint.js"
  ]
},
"husky": {
  "hooks": {
    "pre-commit": "cod-scripts pre-commit",
    "commit-msg": "cod-scripts commitlint -E HUSKY_GIT_PARAMS"
  }
}
  • Adding eslintConfig to package.json is not required in theory but helps your editor enforce your eslint configuration.
  • If you're building a dapp, you can extend codfish/dapp as well to adjust some eslint rules that throw false positive errors.
"eslintConfig": {
  "extends": [
    "./node_modules/cod-scripts/eslint.js",
    "codfish/dapp"
  ]
},
  • Add desired scripts to package.json

Source Configuration

{
"scripts": {
"build": "cod-scripts build -d core",
"build:watch": "npm run build -- --watch",
"format": "cod-scripts format",
"lint": "cod-scripts lint",
"lint:commit": "cod-scripts commitlint",
"test": "cod-scripts test",
"validate": "cod-scripts validate"
},
"eslintConfig": {
"extends": [
"./node_modules/cod-scripts/eslint.js"
]
},
"husky": {
"hooks": {
"pre-commit": "cod-scripts pre-commit",
"commit-msg": "cod-scripts commitlint -E HUSKY_GIT_PARAMS"
}
},
"commitlint": {
"extends": [
"./node_modules/cod-scripts/commitlint"
],
"rules": {
"scope-case": [2, "always", "pascal-case"],
"scope-enum": [2, "always", [
"SomeComponent",
"SomeOtherComponent"
]]
}
}
}
@codfish
Copy link
Author

codfish commented Nov 7, 2020

Note to self: Investigate https://github.com/remarkjs/remark

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment