The most strict (yet practical) ESLint config. 53 plugins. 1405 rules. React, Vue, Node, and pure JS/TS.
472
stars
1,916
commits
JavaScript
primary language
Sep 9, 2026
updated
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.
53 plugins. 1405 rules.
npm install eslint-config-hardcore --save-dev
Available configs:
hardcore - base framework-agnostic confighardcore/ts - additional config for TypeScripthardcore/node- additional config for Node.jshardcore/react - additional config for Reacthardcore/react-performance - additional React config with performance ruleshardcore/vue - additional config for Vue 3/Nuxt 3hardcore/react-testing-library - additional config for React Testing Libraryhardcore/jest - additional config for Jesthardcore/fp - additional config for functional programminghardcore/ts-for-js - additional config for linting JavaScript with
typescript-eslintExample .eslintrc.json for a React project:
{
"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:
{
"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:
{
"root": true,
"extends": ["hardcore", "hardcore/vue"],
"settings": {
"import/resolver": {
"alias": {
"map": [["@", "./src/"]],
"extensions": [".js", ".vue"]
}
}
}
}
Example .eslintrc.json for a Nuxt 3 project:
{
"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"):
{
"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:
{
"root": true,
"extends": ["hardcore", "hardcore/ts", "hardcore/vue"],
"parserOptions": {
"project": true
}
}
hardcoreBase framework-agnostic config.
¹ json/yml/toml plugins actually include several rules, but I consider each plugin as a single "no-invalid" rule.
hardcore/tsConfig for TypeScript.
hardcore/nodeConfig for Node.js.
| Plugin | Enabled rules |
|---|---|
| eslint-plugin-sonarjs | 53 |
| eslint-plugin-n | 34 |
| eslint-plugin-node-security | 20 |
| eslint-plugin-sdl | 1 |
| Total: | 108 |
hardcore/reactConfig for React.
hardcore/react-performanceConfig with performance rules for React.
| Plugin | Enabled rules |
|---|---|
| eslint-plugin-react | 4 |
| eslint-plugin-react-perf | 4 |
| eslint-plugin-react-usememo | 1 |
| Total: | 9 |
hardcore/vueConfig for Vue 3/Nuxt 3.
| Plugin | Enabled rules |
|---|---|
| eslint-plugin-vue | 173 |
| eslint-plugin-vuejs-accessibility | 20 |
| eslint-plugin-vue-scoped-css | 12 |
| eslint-plugin-sonarjs | 1 |
| Total: | 206 |
hardcore/react-testing-libraryConfig for React Testing Library.
| Plugin | Enabled rules |
|---|---|
| eslint-plugin-testing-library | 24 |
| Total: | 24 |
hardcore/jestConfig for Jest.
| Plugin | Enabled rules |
|---|---|
| eslint-plugin-jest | 51 |
| eslint-plugin-jest-dom | 19 |
| Total: | 70 |
hardcore/fpConfig for functional programming.
| Plugin | Enabled rules |
|---|---|
| eslint-plugin-functional | 9 |
| Total: | 9 |
hardcore/ts-for-jsConfig for linting JavaScript with typescript-eslint.
| Plugin | Enabled rules |
|---|---|
| typescript-eslint | 28 |
| eslint-plugin-etc | 4 |
| @shopify/eslint-plugin | 2 |
| eslint-plugin-sort-class-members | 1 |
| eslint-plugin-decorator-position | 1 |
| eslint-plugin-typescript-compat | 1 |
| Total: | 37 |
Did you know you can lint JavaScript code with typescript-eslint?
Use this config to take advantage of typescript-eslint's advanced type-aware
rules (like
@typescript-eslint/naming-convention
and
@typescript-eslint/prefer-optional-chain)
without the need to switch to writing TypeScript.
tsconfig.json in the root of your project. You
don't have to specify any options, just {} should do it.hardcore/ts-for-js to the overrides section in your .eslintrc
like this:{
"extends": ["hardcore"],
"env": {
"browser": true
},
"overrides": [
{
"files": ["*.js"],
"extends": ["hardcore/ts-for-js"],
"parserOptions": {
"project": true
}
}
]
}
1,550 commits
290 commits
34 commits
33 commits
JavaScript
54.2%
TypeScript
23.0%
HTML
15.8%
Vue
7.1%
The most strict (yet practical) ESLint config. 53 plugins. 1405 rules. React, Vue, Node, and pure JS/TS.
472
stars
1,916
commits
JavaScript
primary language
Sep 9, 2026
updated
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.
53 plugins. 1405 rules.
npm install eslint-config-hardcore --save-dev
Available configs:
hardcore - base framework-agnostic confighardcore/ts - additional config for TypeScripthardcore/node- additional config for Node.jshardcore/react - additional config for Reacthardcore/react-performance - additional React config with performance ruleshardcore/vue - additional config for Vue 3/Nuxt 3hardcore/react-testing-library - additional config for React Testing Libraryhardcore/jest - additional config for Jesthardcore/fp - additional config for functional programminghardcore/ts-for-js - additional config for linting JavaScript with
typescript-eslintExample .eslintrc.json for a React project:
{
"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:
{
"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:
{
"root": true,
"extends": ["hardcore", "hardcore/vue"],
"settings": {
"import/resolver": {
"alias": {
"map": [["@", "./src/"]],
"extensions": [".js", ".vue"]
}
}
}
}
Example .eslintrc.json for a Nuxt 3 project:
{
"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"):
{
"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:
{
"root": true,
"extends": ["hardcore", "hardcore/ts", "hardcore/vue"],
"parserOptions": {
"project": true
}
}
hardcoreBase framework-agnostic config.
¹ json/yml/toml plugins actually include several rules, but I consider each plugin as a single "no-invalid" rule.
hardcore/tsConfig for TypeScript.
hardcore/nodeConfig for Node.js.
| Plugin | Enabled rules |
|---|---|
| eslint-plugin-sonarjs | 53 |
| eslint-plugin-n | 34 |
| eslint-plugin-node-security | 20 |
| eslint-plugin-sdl | 1 |
| Total: | 108 |
hardcore/reactConfig for React.
hardcore/react-performanceConfig with performance rules for React.
| Plugin | Enabled rules |
|---|---|
| eslint-plugin-react | 4 |
| eslint-plugin-react-perf | 4 |
| eslint-plugin-react-usememo | 1 |
| Total: | 9 |
hardcore/vueConfig for Vue 3/Nuxt 3.
| Plugin | Enabled rules |
|---|---|
| eslint-plugin-vue | 173 |
| eslint-plugin-vuejs-accessibility | 20 |
| eslint-plugin-vue-scoped-css | 12 |
| eslint-plugin-sonarjs | 1 |
| Total: | 206 |
hardcore/react-testing-libraryConfig for React Testing Library.
| Plugin | Enabled rules |
|---|---|
| eslint-plugin-testing-library | 24 |
| Total: | 24 |
hardcore/jestConfig for Jest.
| Plugin | Enabled rules |
|---|---|
| eslint-plugin-jest | 51 |
| eslint-plugin-jest-dom | 19 |
| Total: | 70 |
hardcore/fpConfig for functional programming.
| Plugin | Enabled rules |
|---|---|
| eslint-plugin-functional | 9 |
| Total: | 9 |
hardcore/ts-for-jsConfig for linting JavaScript with typescript-eslint.
| Plugin | Enabled rules |
|---|---|
| typescript-eslint | 28 |
| eslint-plugin-etc | 4 |
| @shopify/eslint-plugin | 2 |
| eslint-plugin-sort-class-members | 1 |
| eslint-plugin-decorator-position | 1 |
| eslint-plugin-typescript-compat | 1 |
| Total: | 37 |
Did you know you can lint JavaScript code with typescript-eslint?
Use this config to take advantage of typescript-eslint's advanced type-aware
rules (like
@typescript-eslint/naming-convention
and
@typescript-eslint/prefer-optional-chain)
without the need to switch to writing TypeScript.
tsconfig.json in the root of your project. You
don't have to specify any options, just {} should do it.hardcore/ts-for-js to the overrides section in your .eslintrc
like this:{
"extends": ["hardcore"],
"env": {
"browser": true
},
"overrides": [
{
"files": ["*.js"],
"extends": ["hardcore/ts-for-js"],
"parserOptions": {
"project": true
}
}
]
}
1,550 commits
290 commits
34 commits
33 commits
JavaScript
54.2%
TypeScript
23.0%
HTML
15.8%
Vue
7.1%