eslint-config-hardcore
Version:
The most strict (yet practical) ESLint config
391 lines (305 loc) • 17.7 kB
Markdown
# eslint-config-hardcore
[](https://www.npmjs.com/package/eslint-config-hardcore)
[](https://github.com/prettier/prettier)
The most strict (yet practical) ESLint config.
Aims to include as many plugins and rules as possible to make your code
extremely consistent and robust.
**51 plugins. 1376 rules.**
## Usage
```sh
npm install eslint-config-hardcore --save-dev
```
Available configs:
- `hardcore` - base framework-agnostic config
- `hardcore/ts` - additional config for TypeScript
- `hardcore/node`- additional config for Node.js
- `hardcore/react` - additional config for React
- `hardcore/react-performance` - additional React config with performance rules
- `hardcore/vue` - additional config for Vue 3/Nuxt 3
- `hardcore/react-testing-library` - additional config for React Testing Library
- `hardcore/jest` - additional config for Jest
- `hardcore/fp` - additional config for functional programming
- `hardcore/ts-for-js` - additional config for linting JavaScript with
[typescript-eslint](https://github.com/typescript-eslint/typescript-eslint)
Example `.eslintrc.json` for a **React** project:
```json
{
"root": true,
"extends": [
"hardcore",
"hardcore/react",
"hardcore/react-performance",
"hardcore/react-testing-library",
"hardcore/jest",
"hardcore/fp"
],
"env": {
"browser": true
},
"overrides": [
{
"files": ["server/**/*.js"],
"extends": ["hardcore/node"],
"env": {
"browser": false
}
}
]
}
```
Example `.eslintrc.json` for a **TypeScript React** project:
```json
{
"root": true,
"extends": [
"hardcore",
"hardcore/react",
"hardcore/react-performance",
"hardcore/react-testing-library",
"hardcore/jest",
"hardcore/fp",
"hardcore/ts"
],
"parserOptions": {
"project": true
},
"env": {
"browser": true
},
"overrides": [
{
"files": ["server/**/*.ts"],
"extends": ["hardcore/node"],
"env": {
"browser": false
}
}
]
}
```
Example `.eslintrc.json` for a **Vue 3** project:
```json
{
"root": true,
"extends": ["hardcore", "hardcore/vue"],
"settings": {
"import/resolver": {
"alias": {
"map": [["@", "./src/"]],
"extensions": [".js", ".vue"]
}
}
}
}
```
Example `.eslintrc.json` for a **Nuxt 3** project:
```json
{
"root": true,
"extends": ["hardcore", "hardcore/vue"],
"settings": {
"import/resolver": {
"alias": {
"map": [
["@", "./"],
["#imports", ".nuxt/imports.d.ts"]
],
"extensions": [".js", ".vue"]
}
}
}
}
```
Example `.eslintrc.json` for a **TypeScript Vue 3** project (depending on
project configuration, you might want to change `"project": true` to
`"project": "tsconfig.app.json"`):
```json
{
"root": true,
"extends": ["hardcore", "hardcore/ts", "hardcore/vue"],
"parserOptions": {
"project": true
},
"overrides": [
{
"files": [
"vite.config.*",
"vitest.config.*",
"cypress.config.*",
"playwright.config.*"
],
"parserOptions": {
"project": "tsconfig.node.json"
}
},
{
"files": ["src/**/__tests__/*"],
"parserOptions": {
"project": "tsconfig.vitest.json"
}
}
]
}
```
Example `.eslintrc.json` for a **TypeScript Nuxt 3** project:
```json
{
"root": true,
"extends": ["hardcore", "hardcore/ts", "hardcore/vue"],
"parserOptions": {
"project": true
}
}
```
## Configs
### `hardcore`
Base framework-agnostic config.
| Plugin | Enabled rules |
| --------------------------------------------------------------------------------------------------------- | ------------: |
| [ESLint core rules](https://eslint.org/docs/rules/) | 173 |
| [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn) | 105 |
| [eslint-plugin-regexp](https://github.com/ota-meshi/eslint-plugin-regexp) | 80 |
| [eslint-plugin-putout](https://github.com/coderaiser/putout/tree/master/packages/eslint-plugin-putout) | 76 |
| [eslint-plugin-import](https://github.com/benmosher/eslint-plugin-import) | 34 |
| [eslint-plugin-sonarjs](https://github.com/SonarSource/SonarJS/tree/master/packages/jsts/src/rules) | 86 |
| [HTML ESLint](https://github.com/yeonjuan/html-eslint) | 33 |
| [eslint-plugin-promise](https://github.com/xjamundx/eslint-plugin-promise) | 15 |
| [eslint-plugin-security](https://github.com/nodesecurity/eslint-plugin-security) | 12 |
| [eslint-plugin-perfectionist](https://github.com/azat-io/eslint-plugin-perfectionist) | 12 |
| [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic) | 7 |
| [eslint-plugin-eslint-comments](https://github.com/mysticatea/eslint-plugin-eslint-comments) | 6 |
| [eslint-plugin-sdl](https://github.com/microsoft/eslint-plugin-sdl) | 5 |
| [eslint-plugin-array-func](https://github.com/freaktechnik/eslint-plugin-array-func) | 3 |
| [eslint-plugin-unused-imports](https://github.com/sweepline/eslint-plugin-unused-imports) | 2 |
| [eslint-plugin-simple-import-sort](https://github.com/lydell/eslint-plugin-simple-import-sort) | 2 |
| [eslint-plugin-no-constructor-bind](https://github.com/markalfred/eslint-plugin-no-constructor-bind) | 1 |
| [eslint-plugin-no-unsanitized](https://github.com/mozilla/eslint-plugin-no-unsanitized) | 2 |
| [eslint-plugin-no-use-extend-native](https://github.com/dustinspecker/eslint-plugin-no-use-extend-native) | 1 |
| [eslint-plugin-ext](https://github.com/jiangfengming/eslint-plugin-ext) | 1 |
| [eslint-plugin-no-only-tests](https://github.com/levibuzolic/eslint-plugin-no-only-tests) | 1 |
| [eslint-plugin-compat](https://github.com/amilajack/eslint-plugin-compat) | 1 |
| [eslint-plugin-json](https://github.com/azeemba/eslint-plugin-json)¹ | 1 |
| [eslint-plugin-yml](https://github.com/ota-meshi/eslint-plugin-yml)¹ | 1 |
| [eslint-plugin-toml](https://github.com/ota-meshi/eslint-plugin-toml)¹ | 1 |
| **Total:** | **670** |
¹ json/yml/toml plugins actually include several rules, but I consider each
plugin as a single "no-invalid" rule.
### `hardcore/ts`
Config for TypeScript.
| Plugin | Enabled rules |
| ---------------------------------------------------------------------------------------------------------- | ------------: |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint) | 105 |
| [eslint-plugin-etc](https://github.com/cartant/eslint-plugin-etc) | 10 |
| [eslint-plugin-total-functions](https://github.com/danielnixon/eslint-plugin-total-functions) | 8 |
| [@shopify/eslint-plugin](https://github.com/Shopify/web-configs/tree/main/packages/eslint-plugin) | 3 |
| [eslint-plugin-sonarjs](https://github.com/SonarSource/SonarJS/tree/master/packages/jsts/src/rules) | 1 |
| [eslint-plugin-sort-class-members](https://github.com/bryanrsmith/eslint-plugin-sort-class-members) | 1 |
| [eslint-plugin-decorator-position](https://github.com/NullVoxPopuli/eslint-plugin-decorator-position) | 1 |
| [eslint-plugin-no-explicit-type-exports](https://github.com/intuit/eslint-plugin-no-explicit-type-exports) | 1 |
| [eslint-plugin-typescript-compat](https://github.com/azu/eslint-plugin-typescript-compat) | 1 |
| **Total:** | **131** |
### `hardcore/node`
Config for Node.js.
| Plugin | Enabled rules |
| --------------------------------------------------------------------------------------------------- | ------------: |
| [eslint-plugin-sonarjs](https://github.com/SonarSource/SonarJS/tree/master/packages/jsts/src/rules) | 53 |
| [eslint-plugin-n](https://github.com/eslint-community/eslint-plugin-n) | 34 |
| [eslint-plugin-sdl](https://github.com/microsoft/eslint-plugin-sdl) | 1 |
| **Total:** | **88** |
### `hardcore/react`
Config for React.
| Plugin | Enabled rules |
| ------------------------------------------------------------------------------------------------------------------------------ | ------------: |
| [eslint-plugin-react](https://github.com/yannickcr/eslint-plugin-react) | 76 |
| [eslint-plugin-styled-components-a11y](https://github.com/brendanmorrell/eslint-plugin-styled-components-a11y) | 33 |
| [eslint-plugin-jsx-a11y](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y) | 34 |
| [eslint-plugin-storybook](https://github.com/storybookjs/eslint-plugin-storybook) | 15 |
| [eslint-plugin-react-form-fields](https://github.com/kotarella1110/eslint-plugin-react-form-fields) | 4 |
| [eslint-plugin-ssr-friendly](https://github.com/kopiro/eslint-plugin-ssr-friendly) | 4 |
| [@shopify/eslint-plugin](https://github.com/Shopify/web-configs/tree/main/packages/eslint-plugin) | 3 |
| [eslint-plugin-react-hook-form](https://github.com/andykao1213/eslint-plugin-react-hook-form) | 3 |
| [eslint-plugin-react-hooks](https://github.com/facebook/react/tree/main/packages/eslint-plugin-react-hooks) | 2 |
| [eslint-plugin-sonarjs](https://github.com/SonarSource/SonarJS/tree/master/packages/jsts/src/rules) | 2 |
| [eslint-plugin-validate-jsx-nesting](https://github.com/MananTank/eslint-plugin-validate-jsx-nesting) | 1 |
| [eslint-plugin-react-prefer-function-component](https://github.com/tatethurston/eslint-plugin-react-prefer-function-component) | 1 |
| **Total:** | **178** |
### `hardcore/react-performance`
Config with performance rules for React.
| Plugin | Enabled rules |
| ----------------------------------------------------------------------------------------- | ------------: |
| [eslint-plugin-react](https://github.com/yannickcr/eslint-plugin-react) | 4 |
| [eslint-plugin-react-perf](https://github.com/cvazac/eslint-plugin-react-perf) | 4 |
| [eslint-plugin-react-usememo](https://github.com/arthurgeron/eslint-plugin-react-usememo) | 1 |
| **Total:** | **9** |
### `hardcore/vue`
Config for Vue 3/Nuxt 3.
| Plugin | Enabled rules |
| --------------------------------------------------------------------------------------------------- | ------------: |
| [eslint-plugin-vue](https://github.com/vuejs/eslint-plugin-vue) | 173 |
| [eslint-plugin-vuejs-accessibility](https://github.com/vue-a11y/eslint-plugin-vuejs-accessibility) | 20 |
| [eslint-plugin-vue-scoped-css](https://github.com/future-architect/eslint-plugin-vue-scoped-css) | 12 |
| [eslint-plugin-sonarjs](https://github.com/SonarSource/SonarJS/tree/master/packages/jsts/src/rules) | 1 |
| **Total:** | **206** |
### `hardcore/react-testing-library`
Config for React Testing Library.
| Plugin | Enabled rules |
| ------------------------------------------------------------------------------------------------- | ------------: |
| [eslint-plugin-testing-library](https://github.com/testing-library/eslint-plugin-testing-library) | 24 |
| **Total:** | **24** |
### `hardcore/jest`
Config for Jest.
| Plugin | Enabled rules |
| ----------------------------------------------------------------------------------- | ------------: |
| [eslint-plugin-jest](https://github.com/jest-community/eslint-plugin-jest) | 51 |
| [eslint-plugin-jest-dom](https://github.com/testing-library/eslint-plugin-jest-dom) | 19 |
| **Total:** | **70** |
### `hardcore/fp`
Config for functional programming.
| Plugin | Enabled rules |
| ----------------------------------------------------------------------------------------- | ------------: |
| [eslint-plugin-functional](https://github.com/eslint-functional/eslint-plugin-functional) | 9 |
| **Total:** | **9** |
### `hardcore/ts-for-js`
Config for linting JavaScript with
[typescript-eslint](https://github.com/typescript-eslint/typescript-eslint).
| Plugin | Enabled rules |
| ----------------------------------------------------------------------------------------------------- | ------------: |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint) | 28 |
| [eslint-plugin-etc](https://github.com/cartant/eslint-plugin-etc) | 4 |
| [@shopify/eslint-plugin](https://github.com/Shopify/web-configs/tree/main/packages/eslint-plugin) | 2 |
| [eslint-plugin-sort-class-members](https://github.com/bryanrsmith/eslint-plugin-sort-class-members) | 1 |
| [eslint-plugin-decorator-position](https://github.com/NullVoxPopuli/eslint-plugin-decorator-position) | 1 |
| [eslint-plugin-typescript-compat](https://github.com/azu/eslint-plugin-typescript-compat) | 1 |
| **Total:** | **37** |
Did you know you can lint JavaScript code with
[typescript-eslint](https://github.com/typescript-eslint/typescript-eslint)?
Use this config to take advantage of typescript-eslint's advanced type-aware
rules (like
[`@typescript-eslint/naming-convention`](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/naming-convention.md)
and
[`@typescript-eslint/prefer-optional-chain`](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/prefer-optional-chain.md))
without the need to switch to writing TypeScript.
1. First, you'll need to create `tsconfig.json` in the root of your project. You
don't have to specify any options, just `{}` should do it.
2. Then add `hardcore/ts-for-js` to the `overrides` section in your `.eslintrc`
like this:
```json
{
"extends": ["hardcore"],
"env": {
"browser": true
},
"overrides": [
{
"files": ["*.js"],
"extends": ["hardcore/ts-for-js"],
"parserOptions": {
"project": true
}
}
]
}
```
## [Changelog](https://github.com/EvgenyOrekhov/eslint-config-hardcore/releases)
## License
[MIT](LICENSE)