eslint-config-current-thing
Version:
Lint The Current Thing
6,810 lines • 227 kB
JavaScript
// PathMark: ./src/config.js
/* eslint-disable eslint-comments/disable-enable-pair */
/* eslint-disable sonarjs/cognitive-complexity */
/*
This file is fully generated, to edit it change ./generate-config.ts
Generated on 2/11/2025
*/
import antfuConfig from "@antfu/eslint-config";
import babelPlugin from "@babel/eslint-plugin";
import eslint from "@eslint/js";
import markdown from "@eslint/markdown";
import comments from "@eslint-community/eslint-plugin-eslint-comments";
import {
configs as graphqlConfigs,
parseForESLint as graphQLparseForESLint,
processors as graphqlProcessors,
rules as graphQLRules,
} from "@graphql-eslint/eslint-plugin";
import msdl from "@microsoft/eslint-plugin-sdl";
import nextjs from "@next/eslint-plugin-next";
import rnPlugin from "@react-native/eslint-plugin";
import stylistic from "@stylistic/eslint-plugin";
import tanstack from "@tanstack/eslint-plugin-query";
import vitest from "@vitest/eslint-plugin";
import restrictedGlobals from "confusing-browser-globals";
import standardTS from "eslint-config-love";
import prettierConfig from "eslint-config-prettier";
import xo from "eslint-config-xo";
import { defineFlatConfig } from "eslint-define-config";
import * as eslintMdx from "eslint-mdx";
import antfu from "eslint-plugin-antfu";
import ava from "eslint-plugin-ava";
import ban from "eslint-plugin-ban";
import boundaries from "eslint-plugin-boundaries";
import chaiFriendly from "eslint-plugin-chai-friendly";
import checkFile from "eslint-plugin-check-file";
import command from "eslint-plugin-command";
import compat from "eslint-plugin-compat";
import cssModules from "eslint-plugin-css-modules";
import cypress from "eslint-plugin-cypress";
import depend from "eslint-plugin-depend";
import esX from "eslint-plugin-es-x";
import formatJs from "eslint-plugin-formatjs";
import functional from "eslint-plugin-functional";
import header from "eslint-plugin-header";
import html from "eslint-plugin-html";
import i18next from "eslint-plugin-i18next";
import importPlugin from "eslint-plugin-import";
import importX from "eslint-plugin-import-x";
import jasmine from "eslint-plugin-jasmine";
import jest from "eslint-plugin-jest";
import jestDom from "eslint-plugin-jest-dom";
import jestFormatting from "eslint-plugin-jest-formatting";
import jsdoc from "eslint-plugin-jsdoc";
import jsonc from "eslint-plugin-jsonc";
import jsxA11y from "eslint-plugin-jsx-a11y";
import * as mdx from "eslint-plugin-mdx";
import mocha from "eslint-plugin-mocha";
import nNode from "eslint-plugin-n";
import noJQuery from "eslint-plugin-no-jquery";
import noOnlyTest from "eslint-plugin-no-only-tests";
import noRelativeImport from "eslint-plugin-no-relative-import-paths";
import unsanitized from "eslint-plugin-no-unsanitized";
import noUseExtendNative from "eslint-plugin-no-use-extend-native";
import perfectionist from "eslint-plugin-perfectionist";
import playwright from "eslint-plugin-playwright";
import preferArrow from "eslint-plugin-prefer-arrow";
import prettier from "eslint-plugin-prettier";
import promise from "eslint-plugin-promise";
import react from "eslint-plugin-react";
import reactCompiler from "eslint-plugin-react-compiler";
import reactDebug from "eslint-plugin-react-debug";
import reactDom from "eslint-plugin-react-dom";
import reactHooks from "eslint-plugin-react-hooks";
import reactHooksExtra from "eslint-plugin-react-hooks-extra";
import reactNamingConvention from "eslint-plugin-react-naming-convention";
import reactNativeIndie from "eslint-plugin-react-native";
import reactPerf from "eslint-plugin-react-perf";
import preferFC from "eslint-plugin-react-prefer-function-component";
import reactRefresh from "eslint-plugin-react-refresh";
import reactWebAPI from "eslint-plugin-react-web-api";
import reactX from "eslint-plugin-react-x";
import regexp from "eslint-plugin-regexp";
import security from "eslint-plugin-security";
import importSort from "eslint-plugin-simple-import-sort";
import sonarjs from "eslint-plugin-sonarjs";
import sortClassMembers from "eslint-plugin-sort-class-members";
import sortDestructure from "eslint-plugin-sort-destructure-keys";
import storybook from "eslint-plugin-storybook";
import tailwindcss from "eslint-plugin-tailwindcss";
import testingLibrary from "eslint-plugin-testing-library";
import toml from "eslint-plugin-toml";
import tsdoc from "eslint-plugin-tsdoc";
import turbo from "eslint-plugin-turbo";
import unicorn from "eslint-plugin-unicorn";
import unusedImports from "eslint-plugin-unused-imports";
import { configs as wdio, rules as wdioPlugin } from "eslint-plugin-wdio";
import yml from "eslint-plugin-yml";
import youDontNeedLodash from "eslint-plugin-you-dont-need-lodash-underscore";
import * as espree from "espree";
import globals from "globals";
import gts from "gts";
import jsoncEslintParser from "jsonc-eslint-parser";
import tomlEslintParser from "toml-eslint-parser";
import tseslint from "typescript-eslint";
import ymlEslintParser from "yaml-eslint-parser";
const antfuConfigRaw = await antfuConfig({
lessOpinionated: true,
// formatters: {
// css: true,
// html: true,
// markdown: "prettier",
// },
react: true,
}).renamePlugins({
import: "import-x",
node: "n",
react: "react-x",
style: "@stylistic",
test: "vitest",
ts: "@typescript-eslint",
yaml: "yml",
});
const jsxFiles = ["**/*.jsx"];
const tsxFiles = ["**/*.tsx"];
const jsFiles = ["**/*.js", ...jsxFiles, "**/*.mjs", "**/*.cjs"];
const tsFiles = ["**/*.ts", ...tsxFiles, "**/*.mts", "**/*.cts"];
const files = [...jsFiles, ...tsFiles];
const jsonFiles = [
"*.json",
"**/*.json",
"*.json5",
"**/*.json5",
"*.jsonc",
"**/*.jsonc",
];
const ymlFiles = ["**/*.yaml", "**/*.yml"];
const codeBlocks = ["**/*.md/**", "**/*.mdx/**"];
const mdFiles = ["**/*.mdx", "**/*.md"];
const tomlFiles = ["**/*.toml"];
const graphQLFiles = ["**/*.graphql"];
const TEST_PATTERNS = [
"**/*.test",
"**/*_test",
"**/*Test",
"**/*.spec",
"**/*_spec",
"**/*Spec",
"**/__{mocks,tests}__/**/*",
];
/**
* Combines an array of file patterns with an array of extensions
* @param {string[]} patterns - Array of glob patterns without extensions
* @param {string[]} extensions - Array of file extensions without the dot (e.g. ['js', 'jsx'])
* @returns {string[]} Array of complete glob patterns with extensions
*/
const addExtensions = (patterns, extensions) =>
patterns.flatMap((p) => extensions.map((extension) => `${p}.${extension}`));
const tsTestFiles = addExtensions(TEST_PATTERNS, ["ts", "tsx"]);
const jsTestFiles = addExtensions(TEST_PATTERNS, ["js", "jsx"]);
const defaultOptions = { disable: [], override: {}, threshold: 531_417 };
/**
* @param {{ disable: string[], override: Record<string, Record<string, number | string>>, threshold: number }} default - Options
* @returns { import("eslint-define-config").FlatESLintConfig[] } an ESLint Flat Config list
*/
const configGen = ({
disable = [],
override = {},
threshold = 531_417,
} = defaultOptions) =>
// @ts-expect-error type mismatching here is expected because the return is defined as a literal type, on literal types.
defineFlatConfig([
{
ignores: [
"**/eslint.config.js",
"dist",
"build",
"artifacts",
"coverage",
".git",
"node_modules",
"index.js",
],
},
{
languageOptions: {
globals: {
...globals.browser,
...globals.node,
},
},
},
/* PROCESSORS */
{
files: mdFiles,
processor: markdown.processors.markdown,
},
{
files: mdFiles,
processor: mdx.processors.remark,
},
{
files,
processor: graphqlProcessors.graphql,
},
/* PARSERS */
/*
MDX
1,165,350 monthly downloads
ESLint Parser for MDX
https://github.com/mdx-js/eslint-mdx/blob/master/packages/eslint-mdx
*/
{
files: mdFiles,
languageOptions: {
ecmaVersion: "latest",
globals: {
React: false,
},
parser: eslintMdx,
sourceType: "module",
},
},
/*
TOML
1,537,331 monthly downloads
A TOML parser that produces output compatible with ESLint
https://github.com/ota-meshi/toml-eslint-parser#readme
*/
{
files: tomlFiles,
languageOptions: {
parser: tomlEslintParser,
},
},
/*
GraphQL
2,163,821 monthly downloads
GraphQL plugin for ESLint
https://github.com/dimaMachina/graphql-eslint#readme
*/
{
files: graphQLFiles,
languageOptions: {
parser: graphQLparseForESLint,
},
},
/*
YML
3,905,995 monthly downloads
A YAML parser that produces output compatible with ESLint
https://github.com/ota-meshi/yaml-eslint-parser#readme
*/
{
files: ymlFiles,
languageOptions: {
parser: ymlEslintParser,
},
},
/*
JSONC
8,834,014 monthly downloads
JSON, JSONC and JSON5 parser for use with ESLint plugins
https://github.com/ota-meshi/jsonc-eslint-parser#readme
*/
{
files: jsonFiles,
languageOptions: {
parser: jsoncEslintParser,
},
},
/*
TypeScript
174,947,126 monthly downloads
Tooling which enables you to use TypeScript with ESLint / An ESLint custom parser which leverages TypeScript ESTree
https://typescript-eslint.io/packages/typescript-eslint / https://typescript-eslint.io/packages/parser
*/
{
files: tsFiles,
languageOptions: {
parser: tseslint.parser,
parserOptions: {
ecmaVersion: "latest",
project: true,
warnOnUnsupportedTypeScriptVersion: false,
},
},
},
/*
Espree
189,326,429 monthly downloads
An Esprima-compatible JavaScript parser built on Acorn
https://github.com/eslint/js/blob/main/packages/espree/README.md
*/
{
files: jsFiles,
languageOptions: {
parser: espree,
},
},
/* PLUGINS */
{
plugins: {
"@babel": babelPlugin,
"@graphql-eslint": { rules: graphQLRules },
"@microsoft/sdl": msdl,
"@next/next": nextjs,
"@react-native": rnPlugin,
"@stylistic": stylistic,
"@tanstack": tanstack,
"@typescript-eslint": tseslint.plugin,
antfu,
ava,
ban,
boundaries,
"chai-friendly": chaiFriendly,
"check-file": checkFile,
command,
compat,
"css-modules": cssModules,
cypress,
depend,
"es-x": esX,
"eslint-comments": comments,
formatjs: formatJs,
functional,
header,
html,
i18next,
import: importPlugin,
"import-x": importX,
jasmine,
jest,
"jest-dom": jestDom,
"jest-formatting": jestFormatting,
jsdoc,
jsonc,
"jsx-a11y": jsxA11y,
markdown,
mdx,
mocha,
n: nNode,
"no-jquery": noJQuery,
"no-only-tests": noOnlyTest,
"no-relative-import-paths": noRelativeImport,
"no-unsanitized": unsanitized,
"no-use-extend-native": noUseExtendNative,
perfectionist,
playwright,
"prefer-arrow": preferArrow,
prettier,
"prettier-package-json": prettier,
"prettier-tailwind": prettier,
promise,
react,
"react-compiler": reactCompiler,
"react-debug": reactDebug,
"react-dom": reactDom,
"react-hooks": reactHooks,
"react-hooks-extra": reactHooksExtra,
"react-naming-convention": reactNamingConvention,
"react-native": reactNativeIndie,
"react-perf": reactPerf,
"react-prefer-function-component": preferFC,
"react-refresh": reactRefresh,
"react-web-api": reactWebAPI,
"react-x": reactX,
regexp,
security,
"simple-import-sort": importSort,
sonarjs,
"sort-class-members": sortClassMembers,
"sort-destructure-keys": sortDestructure,
storybook,
tailwindcss,
"testing-library": testingLibrary,
toml,
tsdoc,
turbo,
unicorn,
"unused-imports": unusedImports,
vitest,
wdio: { rules: wdioPlugin },
yml,
"you-dont-need-lodash-underscore": youDontNeedLodash,
},
},
/* CONFIGS */
/*
React Prefer Function Component
310,675 monthly downloads
ESLint plugin that prevents the use of JSX class components
https://github.com/tatethurston/eslint-plugin-react-prefer-function-component#readme
Requires: react-prefer-function-component
*/
...(disable.includes("eslint-plugin-react-prefer-function-component") ||
threshold > 310_675
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
name: "React Prefer Function Component",
rules: {
...preferFC.configs.recommended.rules,
...("eslint-plugin-react-prefer-function-component" in override
? override["eslint-plugin-react-prefer-function-component"]
: {}),
},
},
]),
/*
Microsoft SDL
325,524 monthly downloads
ESLint plugin focused on common security issues and misconfigurations discoverable during static testing as part of Microsoft Security Development Lifecycle (SDL)
https://github.com/microsoft/eslint-plugin-sdl
Requires: @microsoft/sdl
*/
...(disable.includes("@microsoft/eslint-plugin-sdl") || threshold > 325_524
? []
: [
{
files,
name: "Microsoft SDL",
rules: {
// "Recommended" is just a smattering of everything: If Angular ever becomes a thing then we should add the angular modules here.
...msdl.configs.common.rules,
...("@microsoft/eslint-plugin-sdl" in override
? override["@microsoft/eslint-plugin-sdl"]
: {}),
},
},
]),
/*
Microsoft SDL - Node
325,524 monthly downloads
ESLint plugin focused on common security issues and misconfigurations discoverable during static testing as part of Microsoft Security Development Lifecycle (SDL)
https://github.com/microsoft/eslint-plugin-sdl
Requires: n, @microsoft/sdl
*/
...(disable.includes("@microsoft/eslint-plugin-sdl/node") ||
threshold > 325_524
? []
: [
{
files,
name: "Microsoft SDL/node",
rules: {
// "Recommended" is just a smattering of everything
...msdl.configs.node.rules,
...("@microsoft/eslint-plugin-sdl/node" in override
? override["@microsoft/eslint-plugin-sdl/node"]
: {}),
},
},
]),
/*
Microsoft SDL - React
325,524 monthly downloads
ESLint plugin focused on common security issues and misconfigurations discoverable during static testing as part of Microsoft Security Development Lifecycle (SDL)
https://github.com/microsoft/eslint-plugin-sdl
Requires: react, @microsoft/sdl
*/
...(disable.includes("@microsoft/eslint-plugin-sdl/react") ||
threshold > 325_524
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
languageOptions: {
parserOptions: {
ecmaFeatures: {
jsx: true,
},
},
},
name: "Microsoft SDL/react",
rules: {
// "Recommended" is just a smattering of everything
...msdl.configs.react.rules,
...("@microsoft/eslint-plugin-sdl/react" in override
? override["@microsoft/eslint-plugin-sdl/react"]
: {}),
},
},
]),
/*
Microsoft SDL - TS
325,524 monthly downloads
ESLint plugin focused on common security issues and misconfigurations discoverable during static testing as part of Microsoft Security Development Lifecycle (SDL)
https://github.com/microsoft/eslint-plugin-sdl
Requires: @typescript-eslint, @microsoft/sdl
*/
...(disable.includes("@microsoft/eslint-plugin-sdl/ts") ||
threshold > 325_524
? []
: [
{
files: tsFiles,
name: "Microsoft SDL/ts",
rules: {
// "Recommended" is just a smattering of everything
...msdl.configs.typescript.rules,
...("@microsoft/eslint-plugin-sdl/ts" in override
? override["@microsoft/eslint-plugin-sdl/ts"]
: {}),
},
},
]),
/*
Standard React
428,158 monthly downloads
JavaScript Standard Style React/JSX support - ESLint Shareable Config
https://github.com/standard/eslint-config-standard-react
Requires: react, react-hooks
*/
...(disable.includes("eslint-config-standard-react") || threshold > 428_158
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
languageOptions: {
parserOptions: {
ecmaFeatures: {
jsx: true,
},
},
},
name: "Standard React",
rules: {
"functional/functional-parameters": 0,
"functional/no-classes": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
"react-hooks/exhaustive-deps": 1,
"react-hooks/rules-of-hooks": 2,
"react/jsx-no-bind": [
2,
{
allowArrowFunctions: true,
allowBind: false,
ignoreRefs: true,
},
],
"react/no-did-update-set-state": 2,
"react/no-unknown-property": 2,
"react/no-unused-prop-types": 2,
"react/prop-types": 2,
"react/react-in-jsx-scope": 2,
...("eslint-config-standard-react" in override
? override["eslint-config-standard-react"]
: {}),
},
settings: {
react: {
version: "detect",
},
},
},
]),
/*
CSS Modules
478,729 monthly downloads
Checks that you are using the existent css/scss/less classes, no more no less
undefined
Requires: css-modules
*/
...(disable.includes("eslint-plugin-css-modules") || threshold > 478_729
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
name: "CSS Modules",
rules: {
...cssModules.configs.recommended.rules,
...("eslint-plugin-css-modules" in override
? override["eslint-plugin-css-modules"]
: {}),
},
},
]),
/*
Boundaries
479,388 monthly downloads
Eslint plugin checking architecture boundaries between elements
https://github.com/javierbrea/eslint-plugin-boundaries#readme
Requires: boundaries
*/
...(disable.includes("eslint-plugin-boundaries") || threshold > 479_388
? []
: [
{
files,
name: "Boundaries",
rules: {
...boundaries.configs.recommended.rules,
...("eslint-plugin-boundaries" in override
? override["eslint-plugin-boundaries"]
: {}),
},
},
]),
/*
No JQuery
492,049 monthly downloads
Disallow jQuery functions with native equivalents.
https://github.com/wikimedia/eslint-plugin-no-jquery#readme
Requires: no-jquery
*/
...(disable.includes("eslint-plugin-no-jquery") || threshold > 492_049
? []
: [
{
files,
name: "No JQuery",
rules: {
"no-jquery/variable-pattern": "error",
...("eslint-plugin-no-jquery" in override
? override["eslint-plugin-no-jquery"]
: {}),
},
},
]),
/*
Ava
542,412 monthly downloads
ESLint rules for AVA
https://github.com/avajs/eslint-plugin-ava#readme
Requires: ava
*/
...(disable.includes("eslint-plugin-ava") || threshold > 542_412
? []
: [
{
files: jsTestFiles,
name: "Ava",
rules: {
...ava.configs.recommended.rules,
...("eslint-plugin-ava" in override
? override["eslint-plugin-ava"]
: {}),
},
},
]),
/*
No Use Extend Native
542,412 monthly downloads
ESLint rules for AVA
https://github.com/avajs/eslint-plugin-ava#readme
Requires: no-use-extend-native
*/
...(disable.includes("eslint-plugin-ava") || threshold > 542_412
? []
: [
{
files,
name: "No Use Extend Native",
rules: {
...noUseExtendNative.configs.recommended.rules,
...("eslint-plugin-ava" in override
? override["eslint-plugin-ava"]
: {}),
},
},
]),
/*
Webdriver IO
567,567 monthly downloads
Eslint rules for WebdriverIO
https://github.com/webdriverio/webdriverio/tree/main/packages/eslint-plugin-wdio
Requires: wdio
*/
...(disable.includes("eslint-plugin-wdio") || threshold > 567_567
? []
: [
{
files,
languageOptions: {
globals: wdio["flat/recommended"].languageOptions.globals,
},
name: "Webdriver IO",
rules: {
...wdio["flat/recommended"].rules,
...("eslint-plugin-wdio" in override
? override["eslint-plugin-wdio"]
: {}),
},
},
]),
/*
React Performance
588,887 monthly downloads
Performance-minded React linting rules for ESLint
https://github.com/cvazac/eslint-plugin-react-perf#readme
Requires: react-perf
*/
...(disable.includes("eslint-plugin-react-perf") || threshold > 588_887
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
name: "React Performance",
rules: {
...reactPerf.configs.recommended.rules,
"functional/functional-parameters": 0,
"functional/no-classes": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
...("eslint-plugin-react-perf" in override
? override["eslint-plugin-react-perf"]
: {}),
},
},
]),
/*
Depend
605,678 monthly downloads
An ESLint plugin to suggest optimized dependencies, native alternatives and more
https://github.com/es-tooling/eslint-plugin-depend#readme
Requires: depend
*/
...(disable.includes("eslint-plugin-depend") || threshold > 605_678
? []
: [
{
files,
name: "Depend",
rules: {
"depend/ban-dependencies": [
2,
{
// Allowing these because they are not deprecated / abandoned
allowed: ["eslint-plugin-import", "eslint-plugin-react"],
},
],
...("eslint-plugin-depend" in override
? override["eslint-plugin-depend"]
: {}),
},
},
]),
/*
TOML
621,485 monthly downloads
This ESLint plugin provides linting rules for TOML.
https://ota-meshi.github.io/eslint-plugin-toml/
Requires: toml
*/
...(disable.includes("eslint-plugin-toml") || threshold > 621_485
? []
: [
{
files: tomlFiles,
name: "TOML",
rules: {
...toml.configs.base.overrides[0].rules,
...toml.configs.recommended.rules,
...toml.configs.standard.rules,
...("eslint-plugin-toml" in override
? override["eslint-plugin-toml"]
: {}),
},
},
]),
/*
Antfu
679,584 monthly downloads
Anthony's ESLint config
https://github.com/antfu/eslint-config
Requires: antfu, command, @typescript-eslint, n, import-x, yml, @stylistic, vitest, no-only-tests, jsdoc, jsonc, perfectionist, regexp, toml, unicorn, unused-imports, eslint-comments, react-dom, react-hooks, react-hooks-extra, react-naming-convention, react-refresh, react-web-api, react-x
*/
...(disable.includes("@antfu/eslint-config") || threshold > 679_584
? []
: [
...antfuConfigRaw.map(({ plugins: _plugins, ...config }) => {
// Change the test name space
if (config.name === "antfu/test/rules") {
return {
...config,
rules: {
...config.rules,
"no-only-tests/no-only-tests":
config.rules?.["vitest/no-only-tests"] ?? 0,
"vitest/no-only-tests": 0,
},
};
}
// Change the ecma version for JS files to allow 'with' imports
if (config.name === "antfu/javascript/setup") {
return {
...config,
languageOptions: {
...config.languageOptions,
ecmaVersion: "latest",
parserOptions: {
...config.languageOptions?.parserOptions,
ecmaVersion: "latest",
},
},
};
}
// Because these configs do not have files defined, they will attempt to lint things like .md files that should not be linted as js files
const ruleConfigs = [
"antfu/javascript/rules",
"antfu/eslint-comments/rules",
"antfu/command/rules",
"antfu/perfectionist/setup",
"antfu/stylistic/rules",
"antfu/regexp/rules",
"antfu/jsdoc/rules",
];
if (config.name && ruleConfigs.includes(config.name)) {
return {
...config,
files,
};
}
return config;
}),
{
files,
name: "Antfu",
rules: {
"arrow-parens": 0,
"block-spacing": 0,
"brace-style": 0,
"comma-dangle": 0,
indent: 0,
"object-curly-spacing": 0,
"operator-linebreak": 0,
"prettier-tailwind/prettier": 0,
"prettier/prettier": 0,
"quote-props": 0,
semi: 0,
"space-before-function-paren": 0,
...("@antfu/eslint-config" in override
? override["@antfu/eslint-config"]
: {}),
},
},
]),
/*
React Web API
706,991 monthly downloads
ESLint React's ESLint plugin for interacting with Web APIs
https://github.com/Rel1cx/eslint-react
Requires: react-web-api
*/
...(disable.includes("eslint-plugin-react-web-api") || threshold > 706_991
? []
: [
{
files: tsFiles,
name: "React Web API",
rules: {
"react-web-api/no-leaked-event-listener": "warn",
"react-web-api/no-leaked-interval": "warn",
"react-web-api/no-leaked-resize-observer": "warn",
"react-web-api/no-leaked-timeout": "warn",
...("eslint-plugin-react-web-api" in override
? override["eslint-plugin-react-web-api"]
: {}),
},
},
]),
/*
React Debug
711,819 monthly downloads
ESLint React's ESLint plugin for debugging related rules.
https://github.com/Rel1cx/eslint-react
Requires: react-debug
*/
...(disable.includes("eslint-plugin-react-debug") || threshold > 711_819
? []
: [
{
files: tsFiles,
name: "React Debug",
rules: {
"react-debug/class-component": "warn",
"react-debug/function-component": "warn",
"react-debug/hook": "warn",
"react-debug/is-from-react": "off",
...("eslint-plugin-react-debug" in override
? override["eslint-plugin-react-debug"]
: {}),
},
},
]),
/*
Functional
712,213 monthly downloads
ESLint rules to promote functional programming in TypeScript.
https://github.com/eslint-functional/eslint-plugin-functional#readme
Requires: functional
*/
...(disable.includes("eslint-plugin-functional") || threshold > 712_213
? []
: [
{
files: jsFiles,
name: "Functional",
rules: {
...functional.configs.externalVanillaRecommended.rules,
...functional.configs.recommended.rules,
...functional.configs.disableTypeChecked.rules,
...("eslint-plugin-functional" in override
? override["eslint-plugin-functional"]
: {}),
},
},
]),
/*
Functional - Stylistic
712,213 monthly downloads
ESLint rules to promote functional programming in TypeScript.
https://github.com/eslint-functional/eslint-plugin-functional#readme
Requires: functional
*/
...(disable.includes("eslint-plugin-functional/stylistic") ||
threshold > 712_213
? []
: [
{
files,
name: "Functional/stylistic",
rules: {
...functional.configs.stylistic.rules,
...("eslint-plugin-functional/stylistic" in override
? override["eslint-plugin-functional/stylistic"]
: {}),
},
},
]),
/*
Functional - TS
712,213 monthly downloads
ESLint rules to promote functional programming in TypeScript.
https://github.com/eslint-functional/eslint-plugin-functional#readme
Requires: @typescript-eslint, functional
*/
...(disable.includes("eslint-plugin-functional/ts") || threshold > 712_213
? []
: [
{
files: tsFiles,
name: "Functional/ts",
rules: {
...functional.configs.recommended.rules,
...functional.configs.externalTypeScriptRecommended.rules,
...("eslint-plugin-functional/ts" in override
? override["eslint-plugin-functional/ts"]
: {}),
},
},
]),
/*
React Naming Convention
714,528 monthly downloads
ESLint React's ESLint plugin for naming convention related rules.
https://github.com/Rel1cx/eslint-react
Requires: react-naming-convention
*/
...(disable.includes("eslint-plugin-react-naming-convention") ||
threshold > 714_528
? []
: [
{
files: tsFiles,
name: "React Naming Convention",
rules: {
"react-naming-convention/filename-extension": [
"warn",
"as-needed",
],
"react-naming-convention/use-state": "warn",
...("eslint-plugin-react-naming-convention" in override
? override["eslint-plugin-react-naming-convention"]
: {}),
},
},
]),
/*
React DOM
715,240 monthly downloads
ESLint React's ESLint plugin for React DOM related rules.
https://github.com/Rel1cx/eslint-react
Requires: react-dom
*/
...(disable.includes("eslint-plugin-react-dom") || threshold > 715_240
? []
: [
{
files: tsFiles,
name: "React DOM",
rules: {
"react-dom/no-dangerously-set-innerhtml": "warn",
"react-dom/no-dangerously-set-innerhtml-with-children": "error",
"react-dom/no-find-dom-node": "error",
"react-dom/no-missing-button-type": "warn",
"react-dom/no-missing-iframe-sandbox": "warn",
"react-dom/no-namespace": "error",
"react-dom/no-render-return-value": "error",
"react-dom/no-script-url": "warn",
"react-dom/no-unknown-property": "warn",
"react-dom/no-unsafe-iframe-sandbox": "warn",
"react-dom/no-unsafe-target-blank": "warn",
"react-dom/no-void-elements-with-children": "warn",
...("eslint-plugin-react-dom" in override
? override["eslint-plugin-react-dom"]
: {}),
},
},
]),
/*
React X
717,349 monthly downloads
A set of composable linting rules for libraries and frameworks that use React as a UI runtime.
https://github.com/Rel1cx/eslint-react
Requires: react-x
*/
...(disable.includes("eslint-plugin-react-x") || threshold > 717_349
? []
: [
{
files: tsFiles,
name: "React X",
rules: {
"react-x/ensure-forward-ref-using-ref": "warn",
"react-x/no-access-state-in-setstate": "error",
"react-x/no-array-index-key": "warn",
"react-x/no-children-count": "warn",
"react-x/no-children-for-each": "warn",
"react-x/no-children-map": "warn",
"react-x/no-children-only": "warn",
"react-x/no-children-to-array": "warn",
"react-x/no-clone-element": "warn",
"react-x/no-comment-textnodes": "warn",
"react-x/no-component-will-mount": "error",
"react-x/no-component-will-receive-props": "error",
"react-x/no-component-will-update": "error",
"react-x/no-context-provider": "warn",
"react-x/no-create-ref": "error",
"react-x/no-default-props": "error",
"react-x/no-direct-mutation-state": "error",
"react-x/no-duplicate-jsx-props": "warn",
"react-x/no-duplicate-key": "error",
"react-x/no-forward-ref": "warn",
"react-x/no-implicit-key": "warn",
"react-x/no-missing-key": "error",
"react-x/no-nested-components": "error",
"react-x/no-prop-types": "error",
"react-x/no-redundant-should-component-update": "error",
"react-x/no-set-state-in-component-did-mount": "warn",
"react-x/no-set-state-in-component-did-update": "warn",
"react-x/no-set-state-in-component-will-update": "warn",
"react-x/no-string-refs": "error",
"react-x/no-unsafe-component-will-mount": "warn",
"react-x/no-unsafe-component-will-receive-props": "warn",
"react-x/no-unsafe-component-will-update": "warn",
"react-x/no-unstable-context-value": "warn",
"react-x/no-unstable-default-props": "warn",
"react-x/no-unused-class-component-members": "warn",
"react-x/no-unused-state": "warn",
"react-x/no-use-context": "warn",
"react-x/use-jsx-vars": "warn",
...("eslint-plugin-react-x" in override
? override["eslint-plugin-react-x"]
: {}),
},
},
]),
/*
Sort Destructure Keys
752,243 monthly downloads
require object destructure key to be sorted
https://github.com/mthadley/eslint-plugin-sort-destructure-keys#readme
Requires: sort-destructure-keys
*/
...(disable.includes("eslint-plugin-sort-destructure-keys") ||
threshold > 752_243
? []
: [
{
files,
name: "Sort Destructure Keys",
rules: {
"sort-destructure-keys/sort-destructure-keys": [
"error",
{
caseSensitive: false,
},
],
...("eslint-plugin-sort-destructure-keys" in override
? override["eslint-plugin-sort-destructure-keys"]
: {}),
},
},
]),
/*
You Don't Need Lodash
767,861 monthly downloads
Check methods you can use natively without lodash/underscore
https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore.git
Requires: you-dont-need-lodash-underscore
*/
...(disable.includes("eslint-plugin-you-dont-need-lodash-underscore") ||
threshold > 767_861
? []
: [
{
files,
name: "You Don't Need Lodash",
rules: {
...youDontNeedLodash.configs.compatible.rules,
...("eslint-plugin-you-dont-need-lodash-underscore" in override
? override["eslint-plugin-you-dont-need-lodash-underscore"]
: {}),
},
},
]),
/*
React Hooks Extra
773,317 monthly downloads
ESLint React's ESLint plugin for React Hooks related rules.
https://github.com/Rel1cx/eslint-react
Requires: react-hooks-extra
*/
...(disable.includes("eslint-plugin-react-hooks-extra") ||
threshold > 773_317
? []
: [
{
files: tsFiles,
name: "React Hooks Extra",
rules: {
"react-hooks-extra/no-direct-set-state-in-use-effect": "warn",
"react-hooks-extra/no-useless-custom-hooks": "warn",
"react-hooks-extra/prefer-use-state-lazy-initialization": "warn",
...("eslint-plugin-react-hooks-extra" in override
? override["eslint-plugin-react-hooks-extra"]
: {}),
},
},
]),
/*
Jasmine
829,106 monthly downloads
ESLint rules for Jasmine
https://github.com/tlvince/eslint-plugin-jasmine
Requires: jasmine
*/
...(disable.includes("eslint-plugin-jasmine") || threshold > 829_106
? []
: [
{
files: jsTestFiles,
languageOptions: {
globals: {
jasmine: true,
},
},
name: "Jasmine",
rules: {
...jasmine.configs.recommended.rules,
...("eslint-plugin-jasmine" in override
? override["eslint-plugin-jasmine"]
: {}),
},
},
]),
/*
Internationalization (i18n)
854,837 monthly downloads
ESLint plugin for i18n
https://github.com/edvardchen/eslint-plugin-i18next#readme
Requires: i18next
*/
...(disable.includes("eslint-plugin-i18next") || threshold > 854_837
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
name: "Internationalization (i18n)",
rules: {
...i18next.configs.recommended.rules,
...("eslint-plugin-i18next" in override
? override["eslint-plugin-i18next"]
: {}),
},
},
]),
/*
FormatJS
876,276 monthly downloads
ESLint plugin for formatjs
https://github.com/formatjs/formatjs#readme
Requires: formatjs
*/
...(disable.includes("eslint-plugin-formatjs") || threshold > 876_276
? []
: [
{
files,
name: "FormatJS",
rules: {
...formatJs.configs.recommended.rules,
...("eslint-plugin-formatjs" in override
? override["eslint-plugin-formatjs"]
: {}),
},
},
]),
/*
Sort Class Members
941,795 monthly downloads
ESLint rule for enforcing consistent ES6 class member order.
https://github.com/bryanrsmith/eslint-plugin-sort-class-members
Requires: sort-class-members
*/
...(disable.includes("eslint-plugin-sort-class-members") ||
threshold > 941_795
? []
: [
{
files,
name: "Sort Class Members",
rules: {
...sortClassMembers.configs["flat/recommended"].rules,
...("eslint-plugin-sort-class-members" in override
? override["eslint-plugin-sort-class-members"]
: {}),
},
},
]),
/*
Google Typescript Style
1,093,811 monthly downloads
Google TypeScript Style
https://github.com/google/gts#readme
Requires: n, prettier
*/
...(disable.includes("gts") || threshold > 1_093_811
? []
: [
{
files: jsFiles,
name: "Google Typescript Style",
rules: {
"@stylistic/arrow-parens": 0,
"@stylistic/brace-style": 0,
"@stylistic/indent": 0,
"@stylistic/indent-binary-ops": 0,
"@stylistic/operator-linebreak": 0,
"@stylistic/quote-props": 0,
"@stylistic/quotes": 0,
"@stylistic/semi": 0,
"@stylistic/yield-star-spacing": 0,
"comma-dangle": 0,
"generator-star-spacing": 0,
indent: 0,
semi: 0,
"space-before-function-paren": 0,
"unicorn/no-nested-ternary": 0,
"yield-star-spacing": 0,
...gts.rules,
...("gts" in override ? override.gts : {}),
},
},
]),
/*
Google Typescript Style - TS
1,093,811 monthly downloads
Google TypeScript Style
https://github.com/google/gts#readme
Requires: n, @typescript-eslint
*/
...(disable.includes("gts/ts") || threshold > 1_093_811
? []
: [
{
files: tsFiles,
name: "Google Typescript Style/ts",
rules: {
...gts.overrides[0].rules,
...("gts/ts" in override ? override["gts/ts"] : {}),
},
},
]),
/*
XO
1,125,583 monthly downloads
ESLint shareable config for XO
https://github.com/xojs/eslint-config-xo#readme
Requires: (None)
*/
...(disable.includes("eslint-config-xo") || threshold > 1_125_583
? []
: [
{
files: jsFiles,
name: "XO",
rules: {
...xo.rules,
"mocha/no-mocha-arrows": 0,
...("eslint-config-xo" in override
? override["eslint-config-xo"]
: {}),
},
},
]),
/*
MDX - Code-Blocks
1,151,049 monthly downloads
ESLint Plugin for MDX
https://github.com/mdx-js/eslint-mdx/blob/master/packages/eslint-plugin-mdx
Requires: (None)
*/
...(disable.includes("eslint-plugin-mdx/code-blocks") ||
threshold > 1_151_049
? []
: [
{
files: codeBlocks,
languageOptions: {
parserOptions: {
ecmaFeatures: {
impliedStrict: true,
},
},
},
name: "MDX/code-blocks",
rules: {
// MDX "recommended" is composed of Overrides, Base, and CodeBlocks but with unneeded conditional logic
// CodeBlocks:
...mdx.configs.codeBlocks.rules,
...("eslint-plugin-mdx/code-blocks" in override
? override["eslint-plugin-mdx/code-blocks"]
: {}),
},
},
]),
/*
No Relative Import Paths
1,227,034 monthly downloads
Moving a file to different folder, could result in changing all imports statement in that file. This will not happen is the import paths are absolute. The eslint rule helps enforcing having absolute import paths. Support eslint --fix to automatically chan
https://github.com/MelvinVermeer/eslint-plugin-no-relative-import-paths#readme
Requires: no-relative-import-paths
*/
...(disable.includes("eslint-plugin-no-relative-import-paths") ||
threshold > 1_227_034
? []
: [
{
files,
name: "No Relative Import Paths",
rules: {
"no-relative-import-paths/no-relative-import-paths": [
"warn",
{
allowedDepth: 2,
allowSameFolder: true,
},
],
...("eslint-plugin-no-relative-import-paths" in override
? override["eslint-plugin-no-relative-import-paths"]
: {}),
},
},
]),
/*
No Unsanitized
1,256,665 monthly downloads
ESLint rule to disallow unsanitized code
https://github.com/mozilla/eslint-plugin-no-unsanitized/
Requires: no-unsanitized
*/
...(disable.includes("eslint-plugin-no-unsanitized") ||
threshold > 1_256_665
? []
: [
{
files,
name: "No Unsanitized",
rules: {
...unsanitized.configs.recommended.rules,
...("eslint-plugin-no-unsanitized" in override
? override["eslint-plugin-no-unsanitized"]
: {}),
},
},
]),
/*
Chai Friendly
1,399,290 monthly downloads
This plugin makes 'no-unused-expressions' rule friendly towards chai expect statements.
https://github.com/ihordiachenko/eslint-plugin-chai-friendly#readme
Requires: chai-friendly
*/
...(disable.includes("eslint-plugin-chai-friendly") || threshold > 1_399_290
? []
: [
{
files: jsTestFiles,
name: "Chai Friendly",
rules: {
...chaiFriendly.configs.recommended.rules,
...("eslint-plugin-chai-friendly" in override
? override["eslint-plugin-chai-friendly"]
: {}),
},
},
]),
/*
React Compiler
1,552,837 monthly downloads
ESLint plugin to display errors found by the React compiler.
https://github.com/facebook/react#readme
Requires: react-compiler
*/
...(disable.includes("eslint-plugin-react-compiler") ||
threshold > 1_552_837
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
name: "React Compiler",
rules: {
...reactCompiler.configs.recommended.rules,
...("eslint-plugin-react-compiler" in override
? override["eslint-plugin-react-compiler"]
: {}),
},
},
]),
/*
Google
1,582,058 monthly downloads
ESLint shareable config for the Google style
https://github.com/google/eslint-config-google#readme
Requires: jsdoc
*/
...(disable.includes("eslint-config-google") || threshold > 1_582_058
? []
: [
{
files: jsFiles,
name: "Google",
rules: {
"@stylistic/arrow-parens": 0,
"@stylistic/block-spacing": 0,
"@stylistic/brace-style": 0,
"@stylistic/indent": 0,
"@stylistic/object-curly-spacing": 0,
"@stylistic/operator-linebreak": 0,
"@stylistic/semi": 0,
"array-bracket-newline": 0,
"array-bracket-spacing": [2, "never"],
"array-element-newline": 0,
"arrow-parens": [2, "always"],
"block-spacing": [2, "never"],
"brace-style": 2,
camelcase: [2, { properties: "never" }],
"comma-dangle": [2, "always-multiline"],
"comma-spacing": 2,
"comma-style": 2,
"computed-property-spacing": 2,
"constructor-super": 2,
curly: [2, "multi-line"],
"eol-last": 2,
"func-call-spacing": 2,
"generator-star-spacing": [2, "after"],
"guard-for-in": 2,
indent: [
2,
2,
{
CallExpression: {
arguments: 2,
},
FunctionDeclaration: {
body: 1,
parameters: 2,
},
FunctionExpression: {
body: 1,
parameters: 2,
},
ignoredNodes: ["ConditionalExpression"],
MemberExpression: 2,
ObjectExpression: 1,
SwitchCase: 1,
},
],
"jsdoc/require-jsdoc": [
2,
{
require: {
ClassDeclaration: true,
FunctionDeclaration: true,
MethodDefinition: true,
},
},
],
"key-spacing": 2,
"keyword-spacing": 2,
"linebreak-style": 2,
"max-len": [
2,
{
code: 80,
ignorePattern: "goog.(module|require)",
ignoreUrls: true,
tabWidth: 2,
},
],
"new-cap": 2,
"no-array-constructor": 2,
"no-caller": 2,
"no-cond-assign": 0,
"no-extend-native": 2,
"no-extra-bind": 2,
"no-invalid-this": 2,
"no-irregular-whitespace": 2,
"no-mixed-spaces-and-tabs": 2,
"no-multi-spaces": 2,
"no-multi-str": 2,
"no-multiple-empty-lines": [2, { max: 2 }],
"no-new-object": 2,
"no-new-symbol": 2,
"no-new-wrappers": 2,
"no-tabs": 2,
"no-this-before-super": 2,
"no-throw-literal": 2,
"no-trailing-spaces": 2,
"no-unexpected-multiline": 2,
"no-unused-vars": [2, { args: "none" }],
"no-var": 2,
"no-with": 2,
"object-curly-spacing": 2,
"one-var": [
2,
{
const: "never",
let: "never",
var: "never",
},
],
"operator-linebreak": [2, "after"],
"padded-blocks": [2, "never"],
"prefer-const": [2, { destructuring: "all" }],
"prefer-promise-reject-errors": 2,
"prefer-rest-params": 2,
"prefer-spread": 2,
"prettier/prettier": 0,
"quote-props": [2, "consistent"],
quotes: [2, "single", { allowTemplateLiterals: true }],
"rest-spread-spacing": 2,
semi: 2,
"semi-spacing": 2,
"space-before-blocks": 2,
"space-before-function-paren": [
2,
{
anonymous: "never",
asyncArrow: "always",
named: "never",
},
],
"spaced-comment": [2, "always"],
"switch-colon-spacing": 2,
"yield-star-spacing": [2, "after"],
...("eslint-config-google" in override
? override["eslint-config-google"]
: {}),
},
},
]),
/*
Perfectionist
1,950,444 monthly downloads
ESLint plugin for sorting various data such as objects, imports, types, enums, JSX props, etc.
https://perfectionist.dev
Requires: perfectionist
*/
...(disable.includes("eslint-plugin-perfectionist") || threshold > 1_950_444
? []
: [
{
files,
name: "Perfectionist",
rules: {
"simple-import-sort/imports": 0,
...perfectionist.configs["recommended-natural"].rules,
"perfectionist/sort-modules": 0,
...("eslint-plugin-perfectionist" in override
? override["eslint-plugin-perfectionist"]
: {}),
},
},
]),
/*
YML
2,020,998 monthly downloads
This ESLint plugin provides linting rules for YAML.
https://ota-meshi.github.io/eslint-plugin-yml/
Requires: yml
*/
...(disable.includes("eslint-plugin-yml") || threshold > 2_020_998
? []
: [
{
files: ymlFiles,
name: "YML",
rules: {
...yml.configs.base.overrides[0].rules,
...yml.configs.standard.rules,
...yml.configs.recommended.rules,
"prettier/prettier": 0,
...("eslint-plugin-yml" in override
? override["eslint-plugin-yml"]
: {}),
},
},
]),
/*
JSONC
2,063,307 monthly downloads
ESLint plugin for JSON, JSONC and JSON5 files.
https://ota-meshi.github.io/eslint-plugin-jsonc/
Requires: jsonc
*/
...(disable.includes("eslint-plugin-jsonc") || threshold > 2_063_307
? []
: [
{
files: jsonFiles,
name: "JSONC",
rules: {
...jsonc.configs.base.overrides[0].rules,
...jsonc.configs["recommended-with-json"].rules,
...jsonc.configs["recommended-with-jsonc"].rules,
...jsonc.configs["recommended-with-json5"].rules,
...("eslint-plugin-jsonc" in override
? override["eslint-plugin-jsonc"]
: {}),
},
},
]),
/*
Regular Expressions
2,111,133 monthly downloads
ESLint plugin for finding RegExp mistakes and RegExp style guide violations.
https://github.com/ota-meshi/eslint-plugin-regexp#readme
Requires: regexp
*/
...(disable.includes("eslint-plugin-regexp") || threshold > 2_111_133
? []
: [
{
files,
name: "Regular Expressions",
rules: {
...regexp.configs["flat/recommended"].rules,
...("eslint-plugin-regexp" in override
? override["eslint-plugin-regexp"]
: {}),
},
},
]),
/*
Standard JSX
2,131,280 monthly downloads
JavaScript Standard Style JSX support - ESLint Shareable Config
https://github.com/standard/eslint-config-standard-jsx
Requires: react
*/
...(disable.includes("eslint-config-standard-jsx") || threshold > 2_131_280
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
languageOptions: {
parserOptions: {
ecmaFeatures: {
jsx: true,
},
},
},
name: "Standard JSX",
rules: {
"functional/functional-parameters": 0,
"functional/no-classes": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
"jsx-quotes": [2, "prefer-single"],
"prettier-tailwind/prettier": 0,
"prettier/prettier": 0,
"react/jsx-boolean-value": 2,
"react/jsx-closing-bracket-location": [2, "tag-aligned"],
"react/jsx-closing-tag-location": 2,
"react/jsx-curly-brace-presence": [
2,
{
children: "never",
props: "never",
},
],
"react/jsx-curly-newline": [
2,
{
multiline: "consistent",
singleline: "consistent",
},
],
"react/jsx-curly-spacing": [
2,
{
attributes: { allowMultiline: true, when: "never" },
children: { allowMultiline: true, when: "never" },
},
],
"react/jsx-equals-spacing": [2, "never"],
"react/jsx-first-prop-new-line": [2, "multiline-multiprop"],
"react/jsx-fragments": [2, "syntax"],
"react/jsx-handler-names": 2,
"react/jsx-indent": [
2,
2,
{
checkAttributes: false,
indentLogicalExpressions: true,
},
],
"react/jsx-indent-props": [2, 2],
"react/jsx-key": [
2,
{
checkFragmentShorthand: true,
},
],
"react/jsx-no-comment-textnodes": 2,
"react/jsx-no-duplicate-props": 2,
"react/jsx-no-target-blank": [
2,
{ enforceDynamicLinks: "always" },
],
"react/jsx-no-undef": [2, { allowGlobals: true }],
"react/jsx-pascal-case": [2, { allowAllCaps: false }],
"react/jsx-props-no-multi-spaces": 2,
"react/jsx-tag-spacing": [
2,
{
afterOpening: "never",
beforeClosing: "never",
beforeSelfClosing: "always",
closingSlash: "never",
},
],
"react/jsx-uses-react": 2,
"react/jsx-uses-vars": 2,
"react/jsx-wrap-multilines": [
2,
{
arrow: "ignore",
assignment: "parens-new-line",
condition: "ignore",
declaration: "parens-new-line",
logical: "ignore",
prop: "ignore",
return: "parens-new-line",
},
],
"react/no-children-prop": 2,
"react/no-danger-with-children": 2,
"react/no-deprecated": 2,
"react/no-direct-mutation-state": 2,
"react/no-find-dom-node": 2,
"react/no-is-mounted": 2,
"react/no-render-return-value": 2,
"react/no-string-refs": [
2,
{
noTemplateLiterals: true,
},
],
"react/no-unescaped-entities": [
2,
{
forbid: [">", "}"],
},
],
"react/require-render-return": 2,
"react/self-closing-comp": 2,
...("eslint-config-standard-jsx" in override
? override["eslint-config-standard-jsx"]
: {}),
},
settings: {
react: {
version: "detect",
},
},
},
]),
/*
GraphQL
2,163,821 monthly downloads
GraphQL plugin for ESLint
https://github.com/dimaMachina/graphql-eslint#readme
Requires: @graphql-eslint
*/
...(disable.includes("@graphql-eslint/eslint-plugin") ||
threshold > 2_163_821
? []
: [
{
files: graphQLFiles,
name: "GraphQL",
rules: {
...graphqlConfigs["schema-recommended"].rules,
...graphqlConfigs["operations-recommended"].rules,
...("@graphql-eslint/eslint-plugin" in override
? override["@graphql-eslint/eslint-plugin"]
: {}),
},
},
]),
/*
Jest Formatting
2,177,343 monthly downloads
ESLint rules for formatting jest tests
https://github.com/dangreenisrael/eslint-plugin-jest-formatting#readme
Requires: jest-formatting
*/
...(disable.includes("eslint-plugin-jest-formatting") ||
threshold > 2_177_343
? []
: [
{
files: jsTestFiles,
name: "Jest Formatting",
rules: {
...jestFormatting.configs.recommended.overrides[0].rules,
"functional/functional-parameters": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
"playwright/no-standalone-expect": 0,
...("eslint-plugin-jest-formatting" in override
? override["eslint-plugin-jest-formatting"]
: {}),
},
},
]),
/*
Compat
2,245,639 monthly downloads
Lint browser compatibility of API used
https://github.com/amilajack/eslint-plugin-compat#readme
Requires: compat
*/
...(disable.includes("eslint-plugin-compat") || threshold > 2_245_639
? []
: [
{
files,
languageOptions: {
globals: {
browser: true,
},
},
name: "Compat",
rules: {
...compat.configs.recommended.rules,
...("eslint-plugin-compat" in override
? override["eslint-plugin-compat"]
: {}),
},
},
]),
/*
Standard TS
2,478,821 monthly downloads
An ESLint Shareable Config for JavaScript Standard Style with TypeScript support / A TypeScript ESLint config that loves you
https://github.com/mightyiam/eslint-config-standard-with-typescript#readme / https://github.com/mightyiam/eslint-config-love#readme
Requires: @typescript-eslint, n, import, promise, eslint-comments
*/
...(disable.includes("eslint-config-standard-with-typescript") ||
disable.includes("eslint-config-love") ||
threshold > 2_478_821
? []
: [
{
files: tsFiles,
name: "Standard TS",
rules: {
"prettier/prettier": 0,
...standardTS.rules,
...("eslint-config-standard-with-typescript" in override
? override["eslint-config-standard-with-typescript"]
: {}),
...("eslint-config-love" in override
? override["eslint-config-love"]
: {}),
},
},
]),
/*
TSDoc
2,533,660 monthly downloads
An ESLint plugin that validates TypeScript doc comments
https://tsdoc.org/
Requires: tsdoc
*/
...(disable.includes("eslint-plugin-tsdoc") || threshold > 2_533_660
? []
: [
{
files: tsFiles,
name: "TSDoc",
rules: {
"tsdoc/syntax": 2,
...("eslint-plugin-tsdoc" in override
? override["eslint-plugin-tsdoc"]
: {}),
},
},
]),
/*
MDX
2,613,990 monthly downloads
remark preset to configure remark-lint with rules that prevent mistakes or stuff that fails across vendors. / remark plugin to lint Markdown code style / ESLint Plugin for MDX
https://github.com/remarkjs/remark-lint/tree/main#readme / https://github.com/remarkjs/remark-lint/tree/main#readme / https://github.com/mdx-js/eslint-mdx/blob/master/packages/eslint-plugin-mdx
Requires: mdx, react
*/
...(disable.includes("remark-preset-lint-recommended") ||
disable.includes("remark-lint") ||
disable.includes("eslint-plugin-mdx") ||
threshold > 2_613_990
? []
: [
{
files: mdFiles,
name: "MDX",
rules: {
// MDX "recommended" is composed of Overrides, Base, and CodeBlocks but with unneeded conditional logic
// Overrides:
"react/jsx-no-undef": [2, { allowGlobals: true }],
"react/react-in-jsx-scope": 0,
// Base:
...mdx.configs.base.rules,
...("remark-preset-lint-recommended" in override
? override["remark-preset-lint-recommended"]
: {}),
...("remark-lint" in override ? override["remark-lint"] : {}),
...("eslint-plugin-mdx" in override
? override["eslint-plugin-mdx"]
: {}),
},
},
]),
/*
Markdown
2,649,119 monthly downloads
An ESLint plugin to lint JavaScript in Markdown code fences. / The official ESLint language plugin for Markdown
https://github.com/eslint/eslint-plugin-markdown#readme / https://github.com/eslint/markdown#readme
Requires: markdown
*/
...(disable.includes("eslint-plugin-markdown") ||
disable.includes("@eslint/markdown") ||
threshold > 2_649_119
? []
: [
{
files: mdFiles,
language: "markdown/commonmark",
name: "Markdown",
rules: {
...markdown.configs.recommended[0].rules,
"unused-imports/no-unused-vars": 0,
...("eslint-plugin-markdown" in override
? override["eslint-plugin-markdown"]
: {}),
...("@eslint/markdown" in override
? override["@eslint/markdown"]
: {}),
},
},
]),
/*
Markdown - Code-Blocks
2,649,119 monthly downloads
An ESLint plugin to lint JavaScript in Markdown code fences. / The official ESLint language plugin for Markdown
https://github.com/eslint/eslint-plugin-markdown#readme / https://github.com/eslint/markdown#readme
Requires: markdown
*/
...(disable.includes("eslint-plugin-markdown/code-blocks") ||
disable.includes("@eslint/markdown/code-blocks") ||
threshold > 2_649_119
? []
: [
{
files: codeBlocks,
languageOptions: {
parserOptions: {
ecmaFeatures: {
impliedStrict: true,
},
},
},
name: "Markdown/code-blocks",
rules: {
...markdown.configs.processor[2].rules,
...("eslint-plugin-markdown/code-blocks" in override
? override["eslint-plugin-markdown/code-blocks"]
: {}),
...("@eslint/markdown/code-blocks" in override
? override["@eslint/markdown/code-blocks"]
: {}),
},
},
]),
/*
Import X
2,848,895 monthly downloads
Import with sanity.
https://github.com/un-ts/eslint-plugin-import-x#readme
Requires: import-x
*/
...(disable.includes("eslint-plugin-import-x") || threshold > 2_848_895
? []
: [
{
files: jsFiles,
name: "Import X",
rules: {
...importX.flatConfigs.recommended.rules,
...("eslint-plugin-import-x" in override
? override["eslint-plugin-import-x"]
: {}),
},
settings: {
"import-x/resolver": {
node: {
extensions: [".js", ".jsx", ".mjs", ".cjs"],
includeScoped: true,
paths: ["node_modules"],
resolvePaths: ["node_modules"],
},
typescript: {},
},
},
},
]),
/*
Import X - React
2,848,895 monthly downloads
Import with sanity.
https://github.com/un-ts/eslint-plugin-import-x#readme
Requires: import-x
*/
...(disable.includes("eslint-plugin-import-x/react") ||
threshold > 2_848_895
? []
: [
{
files: tsFiles,
languageOptions: importX.flatConfigs.react.languageOptions,
name: "Import X/react",
rules: {
...("eslint-plugin-import-x/react" in override
? override["eslint-plugin-import-x/react"]
: {}),
},
settings: importX.flatConfigs.react.settings,
},
]),
/*
Import X - React-Native
2,848,895 monthly downloads
Import with sanity.
https://github.com/un-ts/eslint-plugin-import-x#readme
Requires: import-x
*/
...(disable.includes("eslint-plugin-import-x/react-native") ||
threshold > 2_848_895
? []
: [
{
files: tsFiles,
name: "Import X/react-native",
rules: {
...("eslint-plugin-import-x/react-native" in override
? override["eslint-plugin-import-x/react-native"]
: {}),
},
settings: importX.flatConfigs["react-native"].settings,
},
]),
/*
Import X - TS
2,848,895 monthly downloads
Import with sanity.
https://github.com/un-ts/eslint-plugin-import-x#readme
Requires: import-x
*/
...(disable.includes("eslint-plugin-import-x/ts") || threshold > 2_848_895
? []
: [
{
files: tsFiles,
name: "Import X/ts",
rules: {
...importX.flatConfigs.typescript.rules,
...("eslint-plugin-import-x/ts" in override
? override["eslint-plugin-import-x/ts"]
: {}),
},
settings: importX.flatConfigs.typescript.settings,
},
]),
/*
Security
2,913,811 monthly downloads
Security rules for eslint
https://github.com/eslint-community/eslint-plugin-security#readme
Requires: security
*/
...(disable.includes("eslint-plugin-security") || threshold > 2_913_811
? []
: [
{
files,
name: "Security",
rules: {
...security.configs.recommended.rules,
...("eslint-plugin-security" in override
? override["eslint-plugin-security"]
: {}),
},
},
]),
/*
Tailwind CSS
3,084,061 monthly downloads
Rules enforcing best practices while using Tailwind CSS
https://github.com/francoismassart/eslint-plugin-tailwindcss
Requires: tailwindcss
*/
...(disable.includes("eslint-plugin-tailwindcss") || threshold > 3_084_061
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
name: "Tailwind CSS",
rules: {
...tailwindcss.configs.recommended.rules,
...("eslint-plugin-tailwindcss" in override
? override["eslint-plugin-tailwindcss"]
: {}),
},
},
]),
/*
React Native Plugin
3,131,043 monthly downloads
ESLint rules for @react-native/eslint-config / ESLint rules for @react-native-community/eslint-config
https://github.com/facebook/react-native/tree/HEAD/packages/eslint-plugin-react-native#readme / https://github.com/facebook/react-native#readme
Requires: @react-native
*/
...(disable.includes("@react-native/eslint-plugin") ||
disable.includes("@react-native-community/eslint-plugin") ||
threshold > 3_131_043
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
// Not added in any config
name: "React Native Plugin",
rules: {
"@react-native/platform-colors": 1,
"functional/functional-parameters": 0,
"functional/no-classes": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
...("@react-native/eslint-plugin" in override
? override["@react-native/eslint-plugin"]
: {}),
...("@react-native-community/eslint-plugin" in override
? override["@react-native-community/eslint-plugin"]
: {}),
},
},
]),
/*
React Native Config - Jest
3,163,421 monthly downloads
ESLint config for React Native / ESLint config for React Native
https://github.com/facebook/react-native/tree/HEAD/packages/eslint-config-react-native#readme / https://github.com/facebook/react-native/tree/HEAD/packages/eslint-config-react-native-community#readme
Requires: react-native
*/
...(disable.includes("@react-native/eslint-config/jest") ||
disable.includes("@react-native-community/eslint-config/jest") ||
threshold > 3_163_421
? []
: [
{
files: jsTestFiles,
languageOptions: {
globals: {
jest: true,
"jest/globals": true,
},
},
name: "React Native Config/jest",
rules: {
quotes: [
1,
"single",
{ allowTemplateLiterals: true, avoidEscape: true },
],
"react-native/no-inline-styles": 0,
...("@react-native/eslint-config/jest" in override
? override["@react-native/eslint-config/jest"]
: {}),
...("@react-native-community/eslint-config/jest" in override
? override["@react-native-community/eslint-config/jest"]
: {}),
},
},
]),
/*
React Native Config - TS
3,163,421 monthly downloads
ESLint config for React Native / ESLint config for React Native
https://github.com/facebook/react-native/tree/HEAD/packages/eslint-config-react-native-community#readme / https://github.com/facebook/react-native/tree/HEAD/packages/eslint-config-react-native#readme
Requires: @typescript-eslint
*/
...(disable.includes("@react-native-community/eslint-config/ts") ||
disable.includes("@react-native/eslint-config/ts") ||
threshold > 3_163_421
? []
: [
{
files: tsxFiles,
name: "React Native Config/ts",
rules: {
"@typescript-eslint/no-shadow": 1,
"@typescript-eslint/no-unused-vars": [
2,
{
argsIgnorePattern: "^_",
destructuredArrayIgnorePattern: "^_",
},
],
"func-call-spacing": 0,
"functional/functional-parameters": 0,
"functional/no-classes": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
"no-shadow": 0,
"no-undef": 0,
"no-unused-vars": 0,
...("@react-native-community/eslint-config/ts" in override
? override["@react-native-community/eslint-config/ts"]
: {}),
...("@react-native/eslint-config/ts" in override
? override["@react-native/eslint-config/ts"]
: {}),
},
},
]),
/*
Prettier Plugin PackageJSON
3,325,519 monthly downloads
Prettier package.json plugin to make the order of properties nice.
https://github.com/matzkoh/prettier-plugin-packagejson#readme
Requires: prettier-package-json
*/
...(disable.includes("prettier-plugin-packagejson") || threshold > 3_325_519
? []
: [
{
files: ["**/*package.json"],
name: "Prettier Plugin PackageJSON",
rules: {
"prettier-package-json/prettier": [
2,
{ plugins: ["prettier-plugin-packagejson"] },
],
...("prettier-plugin-packagejson" in override
? override["prettier-plugin-packagejson"]
: {}),
},
},
]),
/*
Tanstack Query
3,470,533 monthly downloads
ESLint plugin for TanStack Query
https://tanstack.com/query
Requires: @tanstack
*/
...(disable.includes("@tanstack/eslint-plugin-query") ||
threshold > 3_470_533
? []
: [
{
files,
name: "Tanstack Query",
rules: {
"@tanstack/exhaustive-deps": 2,
"@tanstack/infinite-query-property-order": 2,
"@tanstack/no-rest-destructuring": 1,
"@tanstack/no-unstable-deps": 2,
"@tanstack/stable-query-client": 2,
...("@tanstack/eslint-plugin-query" in override
? override["@tanstack/eslint-plugin-query"]
: {}),
},
},
]),
/*
Prefer Arrow
3,540,848 monthly downloads
Prefer arrow functions in most cases
https://github.com/TristonJ/eslint-plugin-prefer-arrow#readme
Requires: prefer-arrow
*/
...(disable.includes("eslint-plugin-prefer-arrow") || threshold > 3_540_848
? []
: [
{
files,
name: "Prefer Arrow",
rules: {
"prefer-arrow/prefer-arrow-functions": [
"error",
{
allowStandaloneDeclarations: true,
classPropertiesAllowed: false,
disallowPrototype: false,
singleReturnOnly: true,
},
],
...("eslint-plugin-prefer-arrow" in override
? override["eslint-plugin-prefer-arrow"]
: {}),
},
},
]),
/*
Stylistic
4,331,763 monthly downloads
Stylistic rules for ESLint, works for both JavaScript and TypeScript.
https://github.com/eslint-stylistic/eslint-stylistic#readme
Requires: @stylistic
*/
...(disable.includes("@stylistic/eslint-plugin") || threshold > 4_331_763
? []
: [
{
files,
languageOptions: {
parserOptions: {
warnOnUnsupportedTypeScriptVersion: false,
},
},
name: "Stylistic",
rules: {
"arrow-parens": 0,
"block-spacing": 0,
"brace-style": 0,
"comma-dangle": 0,
indent: 0,
"object-curly-spacing": 0,
"operator-linebreak": 0,
"prettier-tailwind/prettier": 0,
"prettier/prettier": 0,
"quote-props": 0,
semi: 0,
"space-before-function-paren": 0,
...stylistic.configs["recommended-flat"].rules,
...("@stylistic/eslint-plugin" in override
? override["@stylistic/eslint-plugin"]
: {}),
},
},
]),
/*
Vitest
4,336,313 monthly downloads
Eslint plugin for vitest / Eslint plugin for vitest
https://github.com/vitest-dev/eslint-plugin-vitest#readme / https://github.com/veritem/eslint-plugin-vitest#readme
Requires: vitest
*/
...(disable.includes("@vitest/eslint-plugin") ||
disable.includes("eslint-plugin-vitest") ||
threshold > 4_336_313
? []
: [
{
files: jsTestFiles,
languageOptions: {
globals: {
...vitest.environments.env.globals,
},
},
name: "Vitest",
rules: {
...vitest.configs.recommended.rules,
...("@vitest/eslint-plugin" in override
? override["@vitest/eslint-plugin"]
: {}),
...("eslint-plugin-vitest" in override
? override["eslint-plugin-vitest"]
: {}),
},
},
]),
/*
Vitest - TS
4,336,313 monthly downloads
Eslint plugin for vitest / Eslint plugin for vitest
https://github.com/vitest-dev/eslint-plugin-vitest#readme / https://github.com/veritem/eslint-plugin-vitest#readme
Requires: vitest
*/
...(disable.includes("@vitest/eslint-plugin/ts") ||
disable.includes("eslint-plugin-vitest/ts") ||
threshold > 4_336_313
? []
: [
{
files: tsTestFiles,
languageOptions: {
globals: {
...vitest.environments.env.globals,
},
parser: tseslint.parser,
parserOptions: {
ecmaVersion: "latest",
project: true,
warnOnUnsupportedTypeScriptVersion: false,
},
},
name: "Vitest/ts",
rules: {
...vitest.configs.recommended.rules,
...("@vitest/eslint-plugin/ts" in override
? override["@vitest/eslint-plugin/ts"]
: {}),
...("eslint-plugin-vitest/ts" in override
? override["eslint-plugin-vitest/ts"]
: {}),
},
settings: {
vitest: {
typecheck: true,
},
},
},
]),
/*
Mocha
4,346,701 monthly downloads
Eslint rules for mocha.
https://github.com/lo1tuma/eslint-plugin-mocha
Requires: mocha
*/
...(disable.includes("eslint-plugin-mocha") || threshold > 4_346_701
? []
: [
{
files: jsTestFiles,
languageOptions: {
globals: globals.node,
},
name: "Mocha",
rules: {
...mocha.configs.recommended.rules,
"prefer-arrow-callback": 0,
...("eslint-plugin-mocha" in override
? override["eslint-plugin-mocha"]
: {}),
},
},
]),
/*
React Native (Independent Plugin/Config)
4,394,627 monthly downloads
React Native specific linting rules for ESLint
https://github.com/intellicode/eslint-plugin-react-native
Requires: react-native
*/
...(disable.includes("eslint-plugin-react-native") || threshold > 4_394_627
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
languageOptions: {
globals: reactNativeIndie.environments["react-native"].globals,
},
name: "React Native (Independent Plugin/Config)",
rules: {
...reactNativeIndie.configs.all.rules,
"functional/functional-parameters": 0,
"functional/no-classes": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
...("eslint-plugin-react-native" in override
? override["eslint-plugin-react-native"]
: {}),
},
},
]),
/*
Jest Dom
4,657,027 monthly downloads
ESLint plugin to follow best practices and anticipate common mistakes when writing tests with jest-dom
https://github.com/testing-library/eslint-plugin-jest-dom#readme
Requires: jest-dom
*/
...(disable.includes("eslint-plugin-jest-dom") || threshold > 4_657_027
? []
: [
{
files: [...jsTestFiles, ...tsTestFiles],
name: "Jest Dom",
rules: {
...jestDom.configs.recommended.rules,
"functional/functional-parameters": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
"playwright/no-standalone-expect": 0,
...("eslint-plugin-jest-dom" in override
? override["eslint-plugin-jest-dom"]
: {}),
},
},
]),
/*
SonarJS
4,839,458 monthly downloads
SonarJS rules for ESLint
https://github.com/SonarSource/SonarJS/blob/master/packages/jsts/src/rules/README.md
Requires: sonarjs
*/
...(disable.includes("eslint-plugin-sonarjs") || threshold > 4_839_458
? []
: [
{
files,
name: "SonarJS",
rules: {
...sonarjs.configs.recommended.rules,
...("eslint-plugin-sonarjs" in override
? override["eslint-plugin-sonarjs"]
: {}),
},
},
]),
/*
No Only Tests
5,101,831 monthly downloads
ESLint rule for .only blocks in mocha tests
https://github.com/levibuzolic/no-only-tests#readme
Requires: no-only-tests
*/
...(disable.includes("eslint-plugin-no-only-tests") || threshold > 5_101_831
? []
: [
{
files: jsTestFiles,
name: "No Only Tests",
rules: {
"functional/functional-parameters": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
"no-only-tests/no-only-tests": 2,
"playwright/no-standalone-expect": 0,
...("eslint-plugin-no-only-tests" in override
? override["eslint-plugin-no-only-tests"]
: {}),
},
},
]),
/*
Playwright
6,190,234 monthly downloads
ESLint plugin for Playwright testing.
https://github.com/playwright-community/eslint-plugin-playwright#readme
Requires: playwright
*/
...(disable.includes("eslint-plugin-playwright") || threshold > 6_190_234
? []
: [
{
files: [...jsTestFiles, ...tsTestFiles],
languageOptions: {
globals: globals["shared-node-browser"],
},
name: "Playwright",
rules: {
...playwright.configs.recommended.rules,
...("eslint-plugin-playwright" in override
? override["eslint-plugin-playwright"]
: {}),
},
},
]),
/*
React Native Config
6,942,151 monthly downloads
ESLint config for React Native / ESLint config for React Native / ESLint Environment for React Native
https://github.com/facebook/react-native/tree/HEAD/packages/eslint-config-react-native-community#readme / https://github.com/facebook/react-native/tree/HEAD/packages/eslint-config-react-native#readme / https://github.com/satya164/eslint-plugin-react-native-globals#readme
Requires: eslint-comments, react, react-hooks, react-native, jest
*/
...(disable.includes("@react-native-community/eslint-config") ||
disable.includes("@react-native/eslint-config") ||
disable.includes("eslint-plugin-react-native-globals") ||
threshold > 6_942_151
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
languageOptions: {
globals: {
__DEV__: true,
__dirname: false,
__fbBatchedBridgeConfig: false,
AbortController: false,
alert: false,
Blob: true,
cancelAnimationFrame: false,
cancelIdleCallback: false,
clearImmediate: true,
clearInterval: false,
clearTimeout: false,
console: false,
document: false,
ErrorUtils: false,
escape: false,
Event: false,
EventTarget: false,
exports: false,
fetch: false,
File: true,
FileReader: false,
FormData: false,
global: false,
Headers: false,
Intl: false,
Map: true,
module: false,
navigator: false,
process: false,
Promise: true,
queueMicrotask: true,
requestAnimationFrame: true,
requestIdleCallback: true,
require: false,
Set: true,
setImmediate: true,
setInterval: false,
setTimeout: false,
URL: false,
URLSearchParams: false,
WebSocket: true,
window: false,
XMLHttpRequest: false,
},
},
name: "React Native Config",
rules: {
"block-scoped-var": 0,
"brace-style": 0,
camelcase: 0,
"comma-dangle": [1, "always-multiline"],
"comma-spacing": 0,
complexity: 0,
"consistent-return": 0,
"consistent-this": 1,
curly: 1,
"default-case": 0,
"dot-notation": 1,
"eol-last": 1,
eqeqeq: [1, "allow-null"],
"eslint-comments/no-aggregating-enable": 1,
"eslint-comments/no-unlimited-disable": 1,
"eslint-comments/no-unused-disable": 1,
"eslint-comments/no-unused-enable": 1,
"func-call-spacing": 1,
"func-names": 0,
"func-style": 0,
"functional/functional-parameters": 0,
"functional/no-classes": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
"guard-for-in": 0,
"handle-callback-err": 1,
"jest/no-disabled-tests": 1,
"jest/no-focused-tests": 1,
"jest/no-identical-title": 1,
"jest/valid-expect": 1,
"jsx-quotes": [1, "prefer-double"],
"key-spacing": 0,
"keyword-spacing": 1,
"max-depth": 0,
"max-len": 0,
"max-nested-callbacks": 0,
"max-params": 0,
"max-statements": 0,
"new-cap": 0,
"new-parens": 1,
"no-alert": 1,
"no-array-constructor": 1,
"no-bitwise": 1,
"no-caller": 1,
"no-catch-shadow": 1,
"no-cond-assign": 1,
"no-console": 0,
"no-const-assign": 2,
"no-constant-condition": 0,
"no-control-regex": 1,
"no-debugger": 1,
"no-delete-var": 1,
"no-div-regex": 1,
"no-dupe-class-members": 2,
"no-dupe-keys": 2,
"no-else-return": 0,
"no-empty": 0,
"no-empty-character-class": 1,
"no-eq-null": 0,
"no-eval": 2,
"no-ex-assign": 1,
"no-extend-native": 1,
"no-extra-bind": 1,
"no-extra-boolean-cast": 1,
"no-extra-parens": 0,
"no-extra-semi": 1,
"no-fallthrough": 1,
"no-floating-decimal": 1,
"no-func-assign": 1,
"no-implied-eval": 1,
"no-inner-declarations": 0,
"no-invalid-regexp": 1,
"no-iterator": 1,
"no-label-var": 1,
"no-labels": 1,
"no-lone-blocks": 1,
"no-lonely-if": 0,
"no-loop-func": 0,
"no-mixed-requires": 1,
"no-mixed-spaces-and-tabs": 1,
"no-multi-spaces": 0,
"no-multi-str": 0,
"no-native-reassign": 0,
"no-negated-in-lhs": 1,
"no-nested-ternary": 0,
"no-new": 1,
"no-new-func": 2,
"no-new-object": 1,
"no-new-require": 1,
"no-new-wrappers": 1,
"no-obj-calls": 1,
"no-octal": 1,
"no-octal-escape": 1,
"no-path-concat": 1,
"no-plusplus": 0,
"no-process-exit": 0,
"no-proto": 1,
"no-redeclare": 0,
"no-regex-spaces": 1,
"no-reserved-keys": 0,
"no-restricted-modules": 1,
"no-return-assign": 1,
"no-script-url": 1,
"no-self-compare": 1,
"no-sequences": 1,
"no-shadow": 1,
"no-shadow-restricted-names": 1,
"no-sparse-arrays": 1,
"no-sync": 0,
"no-ternary": 0,
"no-trailing-spaces": 1,
"no-undef": 2,
"no-undef-init": 1,
"no-undefined": 0,
"no-underscore-dangle": 0,
"no-unreachable": 2,
"no-unused-expressions": 0,
"no-unused-vars": [
1,
{ args: "none", ignoreRestSiblings: true, vars: "all" },
],
"no-use-before-define": 0,
"no-useless-escape": 1,
"no-void": 1,
"no-warning-comments": 0,
"no-with": 1,
"one-var": 0,
"prettier-tailwind/prettier": 0,
"prettier/prettier": 0,
"quote-props": 0,
quotes: [
1,
"single",
{ allowTemplateLiterals: true, avoidEscape: true },
],
radix: 1,
"react-hooks/exhaustive-deps": 2,
"react-hooks/rules-of-hooks": 2,
"react-native/no-inline-styles": 1,
"react/display-name": 0,
"react/jsx-boolean-value": 0,
"react/jsx-no-comment-textnodes": 2,
"react/jsx-no-duplicate-props": 2,
"react/jsx-no-undef": 2,
"react/jsx-sort-props": 0,
"react/jsx-uses-react": 1,
"react/jsx-uses-vars": 1,
"react/no-did-mount-set-state": 1,
"react/no-did-update-set-state": 1,
"react/no-multi-comp": 0,
"react/no-string-refs": 1,
"react/no-unknown-property": 0,
"react/no-unstable-nested-components": 1,
"react/prop-types": 0,
"react/react-in-jsx-scope": 1,
"react/self-closing-comp": 1,
"react/wrap-multilines": 0,
semi: 1,
"semi-spacing": 1,
"sort-vars": 0,
"space-in-brackets": 0,
"space-in-parens": 0,
"space-infix-ops": 1,
"space-unary-ops": [1, { nonwords: false, words: true }],
"use-isnan": 1,
"valid-typeof": 1,
"vars-on-top": 0,
"wrap-iife": 0,
"wrap-regex": 0,
yoda: 1,
...("@react-native-community/eslint-config" in override
? override["@react-native-community/eslint-config"]
: {}),
...("@react-native/eslint-config" in override
? override["@react-native/eslint-config"]
: {}),
...("eslint-plugin-react-native-globals" in override
? override["eslint-plugin-react-native-globals"]
: {}),
},
},
]),
/*
Turbo
7,047,995 monthly downloads
ESLint plugin for Turborepo / ESLint config for Turborepo
https://github.com/vercel/turborepo#readme / https://github.com/vercel/turborepo#readme
Requires: turbo
*/
...(disable.includes("eslint-plugin-turbo") ||
disable.includes("eslint-config-turbo") ||
threshold > 7_047_995
? []
: [
{
files,
name: "Turbo",
rules: {
...turbo.configs["flat/recommended"].rules,
"turbo/no-undeclared-env-vars": 0,
...("eslint-plugin-turbo" in override
? override["eslint-plugin-turbo"]
: {}),
...("eslint-config-turbo" in override
? override["eslint-config-turbo"]
: {}),
},
},
]),
/*
AirBnb-Typescript
8,440,538 monthly downloads
Airbnb's ESLint config with TypeScript support
https://github.com/iamturns/eslint-config-airbnb-typescript
Requires: @typescript-eslint, import, react
*/
...(disable.includes("eslint-config-airbnb-typescript") ||
threshold > 8_440_538
? []
: [
{
files: tsFiles,
name: "AirBnb-Typescript",
rules: {
"@typescript-eslint/default-param-last": 2,
"@typescript-eslint/dot-notation": [2, { allowKeywords: true }],
"@typescript-eslint/naming-convention": [
2,
{
format: ["camelCase", "PascalCase", "UPPER_CASE"],
selector: "variable",
},
{
format: ["camelCase", "PascalCase"],
selector: "function",
},
{
format: ["PascalCase"],
selector: "typeLike",
},
],
"@typescript-eslint/no-array-constructor": 2,
"@typescript-eslint/no-dupe-class-members": 2,
"@typescript-eslint/no-empty-function": [
2,
{
allow: ["arrowFunctions", "functions", "methods"],
},
],
"@typescript-eslint/no-extra-parens": [
0,
"all",
{
conditionalAssign: true,
enforceForArrowConditionals: false,
ignoreJSX: "all",
nestedBinaryExpressions: false,
returnAssign: false,
},
],
"@typescript-eslint/no-implied-eval": 2,
"@typescript-eslint/no-loop-func": 2,
"@typescript-eslint/no-loss-of-precision": 2,
"@typescript-eslint/no-magic-numbers": [
0,
{
detectObjects: false,
enforceConst: true,
ignore: [],
ignoreArrayIndexes: true,
},
],
"@typescript-eslint/no-redeclare": 2,
"@typescript-eslint/no-shadow": 2,
"@typescript-eslint/no-unused-expressions": [
2,
{
allowShortCircuit: false,
allowTaggedTemplates: false,
allowTernary: false,
},
],
"@typescript-eslint/no-unused-vars": [
2,
{ args: "after-used", ignoreRestSiblings: true, vars: "all" },
],
"@typescript-eslint/no-use-before-define": [
2,
{ classes: true, functions: true, variables: true },
],
"@typescript-eslint/no-useless-constructor": 2,
"@typescript-eslint/require-await": 0,
"@typescript-eslint/return-await": [2, "in-try-catch"],
"brace-style": 0,
camelcase: 0,
"comma-dangle": 0,
"comma-spacing": 0,
"constructor-super": 0,
"default-param-last": 0,
"dot-notation": 0,
"func-call-spacing": 0,
"getter-return": 0,
"import/extensions": [
2,
"ignorePackages",
{
js: "never",
jsx: "never",
mjs: "never",
ts: "never",
tsx: "never",
},
],
"import/named": 0,
"import/no-extraneous-dependencies": [
2,
{
devDependencies: [
"test/**",
"tests/**",
"spec/**",
"**/__tests__/**",
"**/__mocks__/**",
"test.{js,jsx}",
"test.{ts,tsx}",
"test-*.{js,jsx}",
"test-*.{ts,tsx}",
"**/*{.,_}{test,spec}.{js,jsx}",
"**/*{.,_}{test,spec}.{ts,tsx}",
"**/jest.config.js",
"**/jest.config.ts",
"**/jest.setup.js",
"**/jest.setup.ts",
"**/vue.config.js",
"**/vue.config.ts",
"**/webpack.config.js",
"**/webpack.config.ts",
"**/webpack.config.*.js",
"**/webpack.config.*.ts",
"**/rollup.config.js",
"**/rollup.config.ts",
"**/rollup.config.*.js",
"**/rollup.config.*.ts",
"**/gulpfile.js",
"**/gulpfile.ts",
"**/gulpfile.*.js",
"**/gulpfile.*.ts",
"**/Gruntfile{,.js}",
"**/Gruntfile{,.ts}",
"**/protractor.conf.js",
"**/protractor.conf.ts",
"**/protractor.conf.*.js",
"**/protractor.conf.*.ts",
"**/karma.conf.js",
"**/karma.conf.ts",
"**/.eslintrc.js",
"**/.eslintrc.ts",
],
optionalDependencies: false,
},
],
"import/no-named-as-default-member": 0,
"import/no-unresolved": 0,
indent: 0,
"keyword-spacing": 0,
"lines-between-class-members": 0,
"no-array-constructor": 0,
"no-const-assign": 0,
"no-dupe-args": 0,
"no-dupe-class-members": 0,
"no-dupe-keys": 0,
"no-empty-function": 0,
"no-extra-parens": 0,
"no-extra-semi": 0,
"no-func-assign": 0,
"no-implied-eval": 0,
"no-import-assign": 0,
"no-loop-func": 0,
"no-loss-of-precision": 0,
"no-magic-numbers": 0,
"no-new-func": 0,
"no-new-symbol": 0,
"no-obj-calls": 0,
"no-redeclare": 0,
"no-return-await": 0,
"no-setter-return": 0,
"no-shadow": 0,
"no-this-before-super": 0,
"no-throw-literal": 0,
"no-undef": 0,
"no-unreachable": 0,
"no-unsafe-negation": 0,
"no-unused-expressions": 0,
"no-unused-vars": 0,
"no-use-before-define": 0,
"no-useless-constructor": 0,
"object-curly-spacing": 0,
quotes: 0,
"require-await": 0,
semi: 0,
"space-before-blocks": 0,
"space-before-function-paren": 0,
"space-infix-ops": 0,
"valid-typeof": 0,
...("eslint-config-airbnb-typescript" in override
? override["eslint-config-airbnb-typescript"]
: {}),
},
},
]),
/*
Comments
9,855,549 monthly downloads
Additional ESLint rules for ESLint directive comments. / Additional ESLint rules for ESLint directive comments.
https://github.com/mysticatea/eslint-plugin-eslint-comments#readme / https://github.com/eslint-community/eslint-plugin-eslint-comments#readme
Requires: eslint-comments
*/
...(disable.includes("eslint-plugin-eslint-comments") ||
disable.includes("@eslint-community/eslint-plugin-eslint-comments") ||
threshold > 9_855_549
? []
: [
{
files,
name: "Comments",
rules: {
"eslint-comments/disable-enable-pair": 2,
"eslint-comments/no-aggregating-enable": 2,
"eslint-comments/no-duplicate-disable": 2,
"eslint-comments/no-unlimited-disable": 2,
"eslint-comments/no-unused-enable": 2,
...("eslint-plugin-eslint-comments" in override
? override["eslint-plugin-eslint-comments"]
: {}),
...("@eslint-community/eslint-plugin-eslint-comments" in override
? override["@eslint-community/eslint-plugin-eslint-comments"]
: {}),
},
},
]),
/*
Prettier Plugin Tailwind
10,060,755 monthly downloads
A Prettier plugin for sorting Tailwind CSS classes.
https://github.com/tailwindlabs/prettier-plugin-tailwindcss#readme
Requires: prettier-tailwind
*/
...(disable.includes("prettier-plugin-tailwindcss") ||
threshold > 10_060_755
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
name: "Prettier Plugin Tailwind",
rules: {
"@stylistic/arrow-parens": 0,
"@stylistic/jsx-one-expression-per-line": 0,
"@stylistic/member-delimiter-style": 0,
"@stylistic/multiline-ternary": 0,
"@stylistic/operator-linebreak": 0,
"@stylistic/quotes": 0,
"@stylistic/semi": 0,
"jsx-quotes": 0,
"prettier-tailwind/prettier": [
2,
{ plugins: ["prettier-plugin-tailwindcss"] },
],
quotes: 0,
"react/jsx-indent": 0,
"unicorn/no-nested-ternary": 0,
...("prettier-plugin-tailwindcss" in override
? override["prettier-plugin-tailwindcss"]
: {}),
},
},
]),
/*
JSDoc
10,160,285 monthly downloads
JSDoc linting rules for ESLint.
https://github.com/gajus/eslint-plugin-jsdoc#readme
Requires: jsdoc
*/
...(disable.includes("eslint-plugin-jsdoc") || threshold > 10_160_285
? []
: [
{
files: jsFiles,
name: "JSDoc",
rules: {
...jsdoc.configs["flat/recommended"].rules,
...("eslint-plugin-jsdoc" in override
? override["eslint-plugin-jsdoc"]
: {}),
},
},
]),
/*
JSDoc - TS
10,160,285 monthly downloads
JSDoc linting rules for ESLint.
https://github.com/gajus/eslint-plugin-jsdoc#readme
Requires: jsdoc
*/
...(disable.includes("eslint-plugin-jsdoc/ts") || threshold > 10_160_285
? []
: [
{
files: tsFiles,
name: "JSDoc/ts",
rules: {
...jsdoc.configs["flat/recommended-typescript"].rules,
"jsdoc/require-yields": 0,
...("eslint-plugin-jsdoc/ts" in override
? override["eslint-plugin-jsdoc/ts"]
: {}),
},
settings: {
jsdoc: {
mode: "typescript",
},
},
},
]),
/*
Standard
10,465,587 monthly downloads
JavaScript Standard Style - ESLint Shareable Config
https://github.com/standard/eslint-config-standard
Requires: import, n, promise
*/
...(disable.includes("eslint-config-standard") || threshold > 10_465_587
? []
: [
{
files: jsFiles,
languageOptions: {
globals: {
document: "readonly",
navigator: "readonly",
window: "readonly",
},
},
name: "Standard",
rules: {
"@stylistic/comma-dangle": 0,
"@stylistic/operator-linebreak": 0,
"@stylistic/quote-props": 0,
"@stylistic/space-before-function-paren": 0,
"accessor-pairs": [
2,
{ enforceForClassMembers: true, setWithoutGet: true },
],
"array-bracket-spacing": [2, "never"],
"array-callback-return": [
2,
{
allowImplicit: false,
checkForEach: false,
},
],
"arrow-spacing": [2, { after: true, before: true }],
"block-spacing": [2, "always"],
"brace-style": [2, "1tbs", { allowSingleLine: true }],
camelcase: [
2,
{
allow: ["^UNSAFE_"],
ignoreGlobals: true,
properties: "never",
},
],
"comma-dangle": [
2,
{
arrays: "never",
exports: "never",
functions: "never",
imports: "never",
objects: "never",
},
],
"comma-spacing": [2, { after: true, before: false }],
"comma-style": [2, "last"],
"computed-property-spacing": [
2,
"never",
{ enforceForClassMembers: true },
],
"constructor-super": 2,
curly: [2, "multi-line"],
"default-case-last": 2,
"dot-location": [2, "property"],
"dot-notation": [2, { allowKeywords: true }],
"eol-last": 2,
eqeqeq: [2, "always", { null: "ignore" }],
"func-call-spacing": [2, "never"],
"generator-star-spacing": [2, { after: true, before: true }],
"import/export": 2,
"import/first": 2,
"import/no-absolute-path": [
2,
{ amd: false, commonjs: true, esmodule: true },
],
"import/no-duplicates": 2,
"import/no-named-default": 2,
"import/no-webpack-loader-syntax": 2,
indent: [
2,
2,
{
ArrayExpression: 1,
CallExpression: { arguments: 1 },
flatTernaryExpressions: false,
FunctionDeclaration: { body: 1, parameters: 1 },
FunctionExpression: { body: 1, parameters: 1 },
ignoreComments: false,
ignoredNodes: [
"TemplateLiteral *",
"JSXElement",
"JSXElement > *",
"JSXAttribute",
"JSXIdentifier",
"JSXNamespacedName",
"JSXMemberExpression",
"JSXSpreadAttribute",
"JSXExpressionContainer",
"JSXOpeningElement",
"JSXClosingElement",
"JSXFragment",
"JSXOpeningFragment",
"JSXClosingFragment",
"JSXText",
"JSXEmptyExpression",
"JSXSpreadChild",
],
ImportDeclaration: 1,
MemberExpression: 1,
ObjectExpression: 1,
offsetTernaryExpressions: true,
outerIIFEBody: 1,
SwitchCase: 1,
VariableDeclarator: 1,
},
],
"key-spacing": [2, { afterColon: true, beforeColon: false }],
"keyword-spacing": [2, { after: true, before: true }],
"lines-between-class-members": [
2,
"always",
{ exceptAfterSingleLine: true },
],
"multiline-ternary": [2, "always-multiline"],
"n/handle-callback-err": [2, "^(err|error)$"],
"n/no-callback-literal": 2,
"n/no-deprecated-api": 2,
"n/no-exports-assign": 2,
"n/no-new-require": 2,
"n/no-path-concat": 2,
"n/process-exit-as-throw": 2,
"new-cap": [
2,
{ capIsNew: false, newIsCap: true, properties: true },
],
"new-parens": 2,
"no-array-constructor": 2,
"no-async-promise-executor": 2,
"no-caller": 2,
"no-case-declarations": 2,
"no-class-assign": 2,
"no-compare-neg-zero": 2,
"no-cond-assign": 2,
"no-const-assign": 2,
"no-constant-condition": [2, { checkLoops: false }],
"no-control-regex": 2,
"no-debugger": 2,
"no-delete-var": 2,
"no-dupe-args": 2,
"no-dupe-class-members": 2,
"no-dupe-keys": 2,
"no-duplicate-case": 2,
"no-empty": [2, { allowEmptyCatch: true }],
"no-empty-character-class": 2,
"no-empty-pattern": 2,
"no-eval": 2,
"no-ex-assign": 2,
"no-extend-native": 2,
"no-extra-bind": 2,
"no-extra-boolean-cast": 2,
"no-extra-parens": [2, "functions"],
"no-fallthrough": 2,
"no-floating-decimal": 2,
"no-func-assign": 2,
"no-global-assign": 2,
"no-implied-eval": 2,
"no-import-assign": 2,
"no-invalid-regexp": 2,
"no-irregular-whitespace": 2,
"no-iterator": 2,
"no-labels": [2, { allowLoop: false, allowSwitch: false }],
"no-lone-blocks": 2,
"no-loss-of-precision": 2,
"no-misleading-character-class": 2,
"no-mixed-operators": [
2,
{
allowSamePrecedence: true,
groups: [
["==", "!=", "===", "!==", ">", ">=", "<", "<="],
["&&", "||"],
["in", "instanceof"],
],
},
],
"no-mixed-spaces-and-tabs": 2,
"no-multi-spaces": 2,
"no-multi-str": 2,
"no-multiple-empty-lines": [2, { max: 1, maxBOF: 0, maxEOF: 0 }],
"no-new": 2,
"no-new-func": 2,
"no-new-object": 2,
"no-new-symbol": 2,
"no-new-wrappers": 2,
"no-obj-calls": 2,
"no-octal": 2,
"no-octal-escape": 2,
"no-proto": 2,
"no-prototype-builtins": 2,
"no-redeclare": [2, { builtinGlobals: false }],
"no-regex-spaces": 2,
"no-return-assign": [2, "except-parens"],
"no-self-assign": [2, { props: true }],
"no-self-compare": 2,
"no-sequences": 2,
"no-shadow-restricted-names": 2,
"no-sparse-arrays": 2,
"no-tabs": 2,
"no-template-curly-in-string": 2,
"no-this-before-super": 2,
"no-throw-literal": 2,
"no-trailing-spaces": 2,
"no-undef": 2,
"no-undef-init": 2,
"no-unexpected-multiline": 2,
"no-unmodified-loop-condition": 2,
"no-unneeded-ternary": [2, { defaultAssignment: false }],
"no-unreachable": 2,
"no-unreachable-loop": 2,
"no-unsafe-finally": 2,
"no-unsafe-negation": 2,
"no-unused-expressions": [
2,
{
allowShortCircuit: true,
allowTaggedTemplates: true,
allowTernary: true,
},
],
"no-unused-vars": [
2,
{
args: "none",
caughtErrors: "none",
ignoreRestSiblings: true,
vars: "all",
},
],
"no-use-before-define": [
2,
{ classes: false, functions: false, variables: false },
],
"no-useless-backreference": 2,
"no-useless-call": 2,
"no-useless-catch": 2,
"no-useless-computed-key": 2,
"no-useless-constructor": 2,
"no-useless-escape": 2,
"no-useless-rename": 2,
"no-useless-return": 2,
"no-var": 1,
"no-void": 2,
"no-whitespace-before-property": 2,
"no-with": 2,
"object-curly-newline": [
2,
{ consistent: true, multiline: true },
],
"object-curly-spacing": [2, "always"],
"object-property-newline": [
2,
{ allowMultiplePropertiesPerLine: true },
],
"object-shorthand": [1, "properties"],
"one-var": [2, { initialized: "never" }],
"operator-linebreak": [
2,
"after",
{ overrides: { ":": "before", "?": "before", "|>": "before" } },
],
"padded-blocks": [
2,
{ blocks: "never", classes: "never", switches: "never" },
],
"prefer-const": [2, { destructuring: "all" }],
"prefer-promise-reject-errors": 2,
"prefer-regex-literals": [2, { disallowRedundantWrapping: true }],
"prettier/prettier": 0,
"promise/param-names": 2,
"quote-props": [2, "as-needed"],
quotes: [
2,
"single",
{ allowTemplateLiterals: false, avoidEscape: true },
],
"rest-spread-spacing": [2, "never"],
semi: [2, "never"],
"semi-spacing": [2, { after: true, before: false }],
"space-before-blocks": [2, "always"],
"space-before-function-paren": [2, "always"],
"space-in-parens": [2, "never"],
"space-infix-ops": 2,
"space-unary-ops": [2, { nonwords: false, words: true }],
"spaced-comment": [
2,
"always",
{
block: {
balanced: true,
exceptions: ["*"],
markers: ["*package", "!", ",", ":", "::", "flow-include"],
},
line: { markers: ["*package", "!", "/", ",", "="] },
},
],
"symbol-description": 2,
"template-curly-spacing": [2, "never"],
"template-tag-spacing": [2, "never"],
"unicode-bom": [2, "never"],
"use-isnan": [
2,
{
enforceForIndexOf: true,
enforceForSwitchCase: true,
},
],
"valid-typeof": [2, { requireStringLiterals: true }],
"wrap-iife": [2, "any", { functionPrototypeMethods: true }],
"yield-star-spacing": [2, "both"],
yoda: [2, "never"],
...("eslint-config-standard" in override
? override["eslint-config-standard"]
: {}),
},
},
]),
/*
React Refresh
10,555,305 monthly downloads
Validate that your components can safely be updated with Fast Refresh
https://github.com/ArnaudBarre/eslint-plugin-react-refresh#readme
Requires: react-refresh
*/
...(disable.includes("eslint-plugin-react-refresh") ||
threshold > 10_555_305
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
name: "React Refresh",
rules: {
"functional/functional-parameters": 0,
"functional/no-classes": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
"react-refresh/only-export-components": 1,
...("eslint-plugin-react-refresh" in override
? override["eslint-plugin-react-refresh"]
: {}),
},
},
]),
/*
Simple Import Sort
10,619,841 monthly downloads
Easy autofixable import sorting
https://github.com/lydell/eslint-plugin-simple-import-sort#readme
Requires: simple-import-sort
*/
...(disable.includes("eslint-plugin-simple-import-sort") ||
threshold > 10_619_841
? []
: [
{
files,
name: "Simple Import Sort",
rules: {
"perfectionist/sort-imports": 0,
"simple-import-sort/exports": 2,
"simple-import-sort/imports": 2,
...("eslint-plugin-simple-import-sort" in override
? override["eslint-plugin-simple-import-sort"]
: {}),
},
},
]),
/*
Cypress
12,133,675 monthly downloads
An ESLint plugin for projects using Cypress
https://github.com/cypress-io/eslint-plugin-cypress#readme
Requires: cypress
*/
...(disable.includes("eslint-plugin-cypress") || threshold > 12_133_675
? []
: [
{
files: jsTestFiles,
languageOptions: {
globals: {
...cypress.environments.globals.globals,
},
},
name: "Cypress",
rules: {
...cypress.configs.recommended.rules,
...("eslint-plugin-cypress" in override
? override["eslint-plugin-cypress"]
: {}),
},
},
]),
/*
Unicorn
12,296,029 monthly downloads
More than 100 powerful ESLint rules
https://github.com/sindresorhus/eslint-plugin-unicorn#readme
Requires: unicorn
*/
...(disable.includes("eslint-plugin-unicorn") || threshold > 12_296_029
? []
: [
{
files,
name: "Unicorn",
rules: {
"prettier-tailwind/prettier": 0,
"prettier/prettier": 0,
...unicorn.configs.recommended.rules,
"antfu/no-top-level-await": 0,
"functional/no-loop-statements": 0,
"functional/prefer-immutable-types": 0,
"no-restricted-syntax": 0,
// Recommended if using eslint-plugin-markdown (which we are) https://github.com/sindresorhus/eslint-plugin-unicorn/blob/v52.0.0/docs/rules/filename-case.md
"unicorn/filename-case": [
2,
{
case: "kebabCase",
ignore: [".*.md$", ".*.md/.*"],
},
],
"unicorn/prefer-spread": 0,
...("eslint-plugin-unicorn" in override
? override["eslint-plugin-unicorn"]
: {}),
},
},
]),
/*
Storybook
12,689,261 monthly downloads
Best practice rules for Storybook
https://github.com/storybookjs/eslint-plugin-storybook#readme
Requires: storybook, react-hooks, import
*/
...(disable.includes("eslint-plugin-storybook") || threshold > 12_689_261
? []
: [
{
files: storybook.configs.recommended.overrides[0].files,
name: "Storybook",
rules: {
...storybook.configs.recommended.overrides[0].rules,
"functional/functional-parameters": 0,
"functional/no-classes": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
...("eslint-plugin-storybook" in override
? override["eslint-plugin-storybook"]
: {}),
},
},
]),
/*
Storybook - Main
12,689,261 monthly downloads
Best practice rules for Storybook
https://github.com/storybookjs/eslint-plugin-storybook#readme
Requires: storybook
*/
...(disable.includes("eslint-plugin-storybook/main") ||
threshold > 12_689_261
? []
: [
{
files: storybook.configs.recommended.overrides[1].files,
name: "Storybook/main",
rules: {
...storybook.configs.recommended.overrides[1].rules,
...("eslint-plugin-storybook/main" in override
? override["eslint-plugin-storybook/main"]
: {}),
},
},
]),
/*
No Unused Imports
13,244,485 monthly downloads
Report and remove unused es6 modules
https://github.com/sweepline/eslint-plugin-unused-imports
Requires: unused-imports
*/
...(disable.includes("eslint-plugin-unused-imports") ||
threshold > 13_244_485
? []
: [
{
files: jsFiles,
name: "No Unused Imports",
rules: {
"@typescript-eslint/no-unused-vars": 0,
"no-unused-vars": 0,
// These rules all come "recommended"
"unused-imports/no-unused-imports": 2,
"unused-imports/no-unused-vars": [
1,
{
args: "after-used",
argsIgnorePattern: "^_",
vars: "all",
varsIgnorePattern: "^_",
},
],
...("eslint-plugin-unused-imports" in override
? override["eslint-plugin-unused-imports"]
: {}),
},
},
]),
/*
AirBnb - React
14,081,188 monthly downloads
Airbnb's ESLint config, following our styleguide
https://github.com/airbnb/javascript
Requires: react
*/
...(disable.includes("eslint-config-airbnb/react") || threshold > 14_081_188
? []
: [
{
files: jsxFiles,
languageOptions: {
parserOptions: {
ecmaFeatures: {
jsx: true,
},
},
},
name: "AirBnb/react",
rules: {
"class-methods-use-this": [
2,
{
exceptMethods: [
"render",
"getInitialState",
"getDefaultProps",
"getChildContext",
"componentWillMount",
"UNSAFE_componentWillMount",
"componentDidMount",
"componentWillReceiveProps",
"UNSAFE_componentWillReceiveProps",
"shouldComponentUpdate",
"componentWillUpdate",
"UNSAFE_componentWillUpdate",
"componentDidUpdate",
"componentWillUnmount",
"componentDidCatch",
"getSnapshotBeforeUpdate",
],
},
],
"functional/functional-parameters": 0,
"functional/no-classes": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
"jsx-quotes": [2, "prefer-double"],
"no-underscore-dangle": [
2,
{
allow: ["__REDUX_DEVTOOLS_EXTENSION_COMPOSE__"],
allowAfterSuper: false,
allowAfterThis: false,
enforceInMethodNames: true,
},
],
"react/boolean-prop-naming": [
0,
{
message: "",
propTypeNames: ["bool", "mutuallyExclusiveTrueProps"],
rule: "^(is|has)[A-Z]([A-Za-z0-9]?)+",
},
],
"react/button-has-type": [
2,
{
button: true,
reset: false,
submit: true,
},
],
"react/checked-requires-onchange-or-readonly": [
0,
{
ignoreExclusiveCheckedAttribute: false,
ignoreMissingProperties: false,
},
],
"react/default-props-match-prop-types": [
2,
{ allowRequiredDefaults: false },
],
"react/destructuring-assignment": [2, "always"],
"react/display-name": [0, { ignoreTranspilerName: false }],
"react/forbid-component-props": [0, { forbid: [] }],
"react/forbid-dom-props": [0, { forbid: [] }],
"react/forbid-elements": [0, { forbid: [] }],
"react/forbid-foreign-prop-types": [
1,
{ allowInPropTypes: true },
],
"react/forbid-prop-types": [
2,
{
checkChildContextTypes: true,
checkContextTypes: true,
forbid: ["any", "array", "object"],
},
],
"react/forward-ref-uses-ref": 0,
"react/function-component-definition": [
2,
{
namedComponents: [
"function-declaration",
"function-expression",
],
unnamedComponents: "function-expression",
},
],
"react/hook-use-state": 0,
"react/iframe-missing-sandbox": 0,
"react/jsx-boolean-value": [2, "never", { always: [] }],
"react/jsx-child-element-spacing": 0,
"react/jsx-closing-bracket-location": [2, "line-aligned"],
"react/jsx-closing-tag-location": 2,
"react/jsx-curly-brace-presence": [
2,
{ children: "never", props: "never" },
],
"react/jsx-curly-newline": [
2,
{
multiline: "consistent",
singleline: "consistent",
},
],
"react/jsx-curly-spacing": [2, "never", { allowMultiline: true }],
"react/jsx-equals-spacing": [2, "never"],
"react/jsx-filename-extension": [2, { extensions: [".jsx"] }],
"react/jsx-first-prop-new-line": [2, "multiline-multiprop"],
"react/jsx-fragments": [2, "syntax"],
"react/jsx-handler-names": [
0,
{
eventHandlerPrefix: "handle",
eventHandlerPropPrefix: "on",
},
],
"react/jsx-indent": [2, 2],
"react/jsx-indent-props": [2, 2],
"react/jsx-key": 0,
"react/jsx-max-depth": 0,
"react/jsx-max-props-per-line": [
2,
{ maximum: 1, when: "multiline" },
],
"react/jsx-newline": 0,
"react/jsx-no-bind": [
2,
{
allowArrowFunctions: true,
allowBind: false,
allowFunctions: false,
ignoreDOMComponents: true,
ignoreRefs: true,
},
],
"react/jsx-no-comment-textnodes": 2,
"react/jsx-no-constructed-context-values": 2,
"react/jsx-no-duplicate-props": [2, { ignoreCase: true }],
"react/jsx-no-leaked-render": 0,
"react/jsx-no-literals": [0, { noStrings: true }],
"react/jsx-no-script-url": [
2,
[
{
name: "Link",
props: ["to"],
},
],
],
"react/jsx-no-target-blank": [
2,
{ enforceDynamicLinks: "always" },
],
"react/jsx-no-undef": 2,
"react/jsx-no-useless-fragment": 2,
"react/jsx-one-expression-per-line": [
2,
{ allow: "single-child" },
],
"react/jsx-pascal-case": [
2,
{
allowAllCaps: true,
ignore: [],
},
],
"react/jsx-props-no-multi-spaces": 2,
"react/jsx-props-no-spread-multi": 0,
"react/jsx-props-no-spreading": [
2,
{
custom: "enforce",
exceptions: [],
explicitSpread: "ignore",
html: "enforce",
},
],
"react/jsx-sort-default-props": [
0,
{
ignoreCase: true,
},
],
"react/jsx-sort-prop-types": 0,
"react/jsx-sort-props": [
0,
{
callbacksLast: false,
ignoreCase: true,
noSortAlphabetically: false,
reservedFirst: true,
shorthandFirst: false,
shorthandLast: false,
},
],
"react/jsx-space-before-closing": [0, "always"],
"react/jsx-tag-spacing": [
2,
{
afterOpening: "never",
beforeClosing: "never",
beforeSelfClosing: "always",
closingSlash: "never",
},
],
"react/jsx-uses-react": [2],
"react/jsx-uses-vars": 2,
"react/jsx-wrap-multilines": [
2,
{
arrow: "parens-new-line",
assignment: "parens-new-line",
condition: "parens-new-line",
declaration: "parens-new-line",
logical: "parens-new-line",
prop: "parens-new-line",
return: "parens-new-line",
},
],
"react/no-access-state-in-setstate": 2,
"react/no-adjacent-inline-elements": 0,
"react/no-array-index-key": 2,
"react/no-arrow-function-lifecycle": 2,
"react/no-children-prop": 2,
"react/no-danger": 1,
"react/no-danger-with-children": 2,
"react/no-deprecated": [2],
"react/no-did-mount-set-state": 0,
"react/no-did-update-set-state": 2,
"react/no-direct-mutation-state": 0,
"react/no-find-dom-node": 2,
"react/no-invalid-html-attribute": 2,
"react/no-is-mounted": 2,
"react/no-multi-comp": 0,
"react/no-namespace": 2,
"react/no-object-type-as-default-prop": 0,
"react/no-redundant-should-component-update": 2,
"react/no-render-return-value": 2,
"react/no-set-state": 0,
"react/no-string-refs": 2,
"react/no-this-in-sfc": 2,
"react/no-typos": 2,
"react/no-unescaped-entities": 2,
"react/no-unknown-property": 2,
"react/no-unsafe": 0,
"react/no-unstable-nested-components": 2,
"react/no-unused-class-component-methods": 2,
"react/no-unused-prop-types": [
2,
{
customValidators: [],
skipShapeProps: true,
},
],
"react/no-unused-state": 2,
"react/no-will-update-set-state": 2,
"react/prefer-es6-class": [2, "always"],
"react/prefer-exact-props": 2,
"react/prefer-read-only-props": 0,
"react/prefer-stateless-function": [
2,
{ ignorePureComponents: true },
],
"react/prop-types": [
2,
{
customValidators: [],
ignore: [],
skipUndeclared: false,
},
],
"react/react-in-jsx-scope": 2,
"react/require-default-props": [
2,
{
forbidDefaultForRequired: true,
},
],
"react/require-optimization": [0, { allowDecorators: [] }],
"react/require-render-return": 2,
"react/self-closing-comp": 2,
"react/sort-comp": [
2,
{
groups: {
lifecycle: [
"displayName",
"propTypes",
"contextTypes",
"childContextTypes",
"mixins",
"statics",
"defaultProps",
"constructor",
"getDefaultProps",
"getInitialState",
"state",
"getChildContext",
"getDerivedStateFromProps",
"componentWillMount",
"UNSAFE_componentWillMount",
"componentDidMount",
"componentWillReceiveProps",
"UNSAFE_componentWillReceiveProps",
"shouldComponentUpdate",
"componentWillUpdate",
"UNSAFE_componentWillUpdate",
"getSnapshotBeforeUpdate",
"componentDidUpdate",
"componentDidCatch",
"componentWillUnmount",
],
rendering: ["/^render.+$/", "render"],
},
order: [
"static-variables",
"static-methods",
"instance-variables",
"lifecycle",
"/^handle.+$/",
"/^on.+$/",
"getters",
"setters",
"/^(get|set)(?!(InitialState$|DefaultProps$|ChildContext$)).+$/",
"instance-methods",
"everything-else",
"rendering",
],
},
],
"react/sort-default-props": [
0,
{
ignoreCase: false,
},
],
"react/sort-prop-types": [
0,
{
callbacksLast: false,
ignoreCase: true,
requiredFirst: false,
sortShapeProp: true,
},
],
"react/state-in-constructor": [2, "always"],
"react/static-property-placement": [2, "property assignment"],
"react/style-prop-object": 2,
"react/void-dom-elements-no-children": 2,
...("eslint-config-airbnb/react" in override
? override["eslint-config-airbnb/react"]
: {}),
},
},
]),
/*
AirBnb - React-A11y
14,081,188 monthly downloads
Airbnb's ESLint config, following our styleguide
https://github.com/airbnb/javascript
Requires: jsx-a11y, react
*/
...(disable.includes("eslint-config-airbnb/react-a11y") ||
threshold > 14_081_188
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
languageOptions: {
parserOptions: {
ecmaFeatures: {
jsx: true,
},
},
},
name: "AirBnb/react-a11y",
rules: {
"functional/functional-parameters": 0,
"functional/no-classes": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
"jsx-a11y/accessible-emoji": 0,
"jsx-a11y/alt-text": [
2,
{
area: [],
elements: ["img", "object", "area", 'input[type="image"]'],
img: [],
'input[type="image"]': [],
object: [],
},
],
"jsx-a11y/anchor-ambiguous-text": 0,
"jsx-a11y/anchor-has-content": [2, { components: [] }],
"jsx-a11y/anchor-is-valid": [
2,
{
aspects: ["noHref", "invalidHref", "preferButton"],
components: ["Link"],
specialLink: ["to"],
},
],
"jsx-a11y/aria-activedescendant-has-tabindex": 2,
"jsx-a11y/aria-props": 2,
"jsx-a11y/aria-proptypes": 2,
"jsx-a11y/aria-role": [2, { ignoreNonDOM: false }],
"jsx-a11y/aria-unsupported-elements": 2,
"jsx-a11y/autocomplete-valid": [
0,
{
inputComponents: [],
},
],
"jsx-a11y/click-events-have-key-events": 2,
"jsx-a11y/control-has-associated-label": [
2,
{
controlComponents: [],
depth: 5,
ignoreElements: [
"audio",
"canvas",
"embed",
"input",
"textarea",
"tr",
"video",
],
ignoreRoles: [
"grid",
"listbox",
"menu",
"menubar",
"radiogroup",
"row",
"tablist",
"toolbar",
"tree",
"treegrid",
],
labelAttributes: ["label"],
},
],
"jsx-a11y/heading-has-content": [2, { components: [""] }],
"jsx-a11y/html-has-lang": 2,
"jsx-a11y/iframe-has-title": 2,
"jsx-a11y/img-redundant-alt": 2,
"jsx-a11y/interactive-supports-focus": 2,
"jsx-a11y/label-has-associated-control": [
2,
{
assert: "both",
controlComponents: [],
depth: 25,
labelAttributes: [],
labelComponents: [],
},
],
"jsx-a11y/label-has-for": [
0,
{
allowChildren: false,
components: [],
required: {
every: ["nesting", "id"],
},
},
],
"jsx-a11y/lang": 2,
"jsx-a11y/media-has-caption": [
2,
{
audio: [],
track: [],
video: [],
},
],
"jsx-a11y/mouse-events-have-key-events": 2,
"jsx-a11y/no-access-key": 2,
"jsx-a11y/no-aria-hidden-on-focusable": 0,
"jsx-a11y/no-autofocus": [2, { ignoreNonDOM: true }],
"jsx-a11y/no-distracting-elements": [
2,
{
elements: ["marquee", "blink"],
},
],
"jsx-a11y/no-interactive-element-to-noninteractive-role": [
2,
{
tr: ["none", "presentation"],
},
],
"jsx-a11y/no-noninteractive-element-interactions": [
2,
{
handlers: [
"onClick",
"onMouseDown",
"onMouseUp",
"onKeyPress",
"onKeyDown",
"onKeyUp",
],
},
],
"jsx-a11y/no-noninteractive-element-to-interactive-role": [
2,
{
li: ["menuitem", "option", "row", "tab", "treeitem"],
ol: [
"listbox",
"menu",
"menubar",
"radiogroup",
"tablist",
"tree",
"treegrid",
],
table: ["grid"],
td: ["gridcell"],
ul: [
"listbox",
"menu",
"menubar",
"radiogroup",
"tablist",
"tree",
"treegrid",
],
},
],
"jsx-a11y/no-noninteractive-tabindex": [
2,
{
allowExpressionValues: true,
roles: ["tabpanel"],
tags: [],
},
],
"jsx-a11y/no-onchange": 0,
"jsx-a11y/no-redundant-roles": [
2,
{
nav: ["navigation"],
},
],
"jsx-a11y/no-static-element-interactions": [
2,
{
handlers: [
"onClick",
"onMouseDown",
"onMouseUp",
"onKeyPress",
"onKeyDown",
"onKeyUp",
],
},
],
"jsx-a11y/prefer-tag-over-role": 0,
"jsx-a11y/role-has-required-aria-props": 2,
"jsx-a11y/role-supports-aria-props": 2,
"jsx-a11y/scope": 2,
"jsx-a11y/tabindex-no-positive": 2,
...("eslint-config-airbnb/react-a11y" in override
? override["eslint-config-airbnb/react-a11y"]
: {}),
},
},
]),
/*
AirBnb - React-Hooks
14,081,188 monthly downloads
Airbnb's ESLint config, following our styleguide
https://github.com/airbnb/javascript
Requires: react-hooks
*/
...(disable.includes("eslint-config-airbnb/react-hooks") ||
threshold > 14_081_188
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
languageOptions: {
parserOptions: {
ecmaFeatures: {
jsx: true,
},
},
},
name: "AirBnb/react-hooks",
rules: {
"functional/functional-parameters": 0,
"functional/no-classes": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
"react-hooks/exhaustive-deps": 2,
"react-hooks/rules-of-hooks": 2,
...("eslint-config-airbnb/react-hooks" in override
? override["eslint-config-airbnb/react-hooks"]
: {}),
},
},
]),
/*
Promises
18,396,822 monthly downloads
Enforce best practices for JavaScript promises
https://github.com/eslint-community/eslint-plugin-promise
Requires: promise
*/
...(disable.includes("eslint-plugin-promise") || threshold > 18_396_822
? []
: [
{
files,
name: "Promises",
rules: {
...promise.configs.recommended.rules,
"functional/immutable-data": 0,
"functional/no-let": 0,
"functional/no-throw-statements": 0,
...("eslint-plugin-promise" in override
? override["eslint-plugin-promise"]
: {}),
},
},
]),
/*
Create React App
19,596,119 monthly downloads
ESLint configuration used by Create React App
https://github.com/facebook/create-react-app#readme
Requires: react, react-hooks, import, jsx-a11y
*/
...(disable.includes("eslint-config-react-app") || threshold > 19_596_119
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
languageOptions: {
globals: {
browser: true,
commonjs: true,
es6: true,
jest: true,
node: true,
},
parserOptions: {
ecmaFeatures: {
jsx: true,
},
},
},
name: "Create React App",
rules: {
"array-callback-return": 1,
"default-case": [1, { commentPattern: "^no default$" }],
"dot-location": [1, "property"],
eqeqeq: [1, "smart"],
"functional/functional-parameters": 0,
"functional/no-classes": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
"getter-return": 1,
"import/first": 2,
"import/no-amd": 2,
"import/no-anonymous-default-export": 1,
"import/no-webpack-loader-syntax": 2,
"jsx-a11y/alt-text": 1,
"jsx-a11y/anchor-has-content": 1,
"jsx-a11y/anchor-is-valid": [
1,
{
aspects: ["noHref", "invalidHref"],
},
],
"jsx-a11y/aria-activedescendant-has-tabindex": 1,
"jsx-a11y/aria-props": 1,
"jsx-a11y/aria-proptypes": 1,
"jsx-a11y/aria-role": [1, { ignoreNonDOM: true }],
"jsx-a11y/aria-unsupported-elements": 1,
"jsx-a11y/heading-has-content": 1,
"jsx-a11y/iframe-has-title": 1,
"jsx-a11y/img-redundant-alt": 1,
"jsx-a11y/no-access-key": 1,
"jsx-a11y/no-distracting-elements": 1,
"jsx-a11y/no-redundant-roles": 1,
"jsx-a11y/role-has-required-aria-props": 1,
"jsx-a11y/role-supports-aria-props": 1,
"jsx-a11y/scope": 1,
"new-parens": 1,
"no-array-constructor": 1,
"no-caller": 1,
"no-cond-assign": [1, "except-parens"],
"no-const-assign": 1,
"no-control-regex": 1,
"no-delete-var": 1,
"no-dupe-args": 1,
"no-dupe-class-members": 1,
"no-dupe-keys": 1,
"no-duplicate-case": 1,
"no-empty-character-class": 1,
"no-empty-pattern": 1,
"no-eval": 1,
"no-ex-assign": 1,
"no-extend-native": 1,
"no-extra-bind": 1,
"no-extra-label": 1,
"no-fallthrough": 1,
"no-func-assign": 1,
"no-global-assign": 1,
"no-implied-eval": 1,
"no-invalid-regexp": 1,
"no-iterator": 1,
"no-label-var": 1,
"no-labels": [1, { allowLoop: true, allowSwitch: false }],
"no-lone-blocks": 1,
"no-loop-func": 1,
"no-mixed-operators": [
1,
{
allowSamePrecedence: false,
groups: [
["&", "|", "^", "~", "<<", ">>", ">>>"],
["==", "!=", "===", "!==", ">", ">=", "<", "<="],
["&&", "||"],
["in", "instanceof"],
],
},
],
"no-multi-str": 1,
"no-new-func": 1,
"no-new-object": 1,
"no-new-symbol": 1,
"no-new-wrappers": 1,
"no-obj-calls": 1,
"no-octal": 1,
"no-octal-escape": 1,
"no-redeclare": 1,
"no-regex-spaces": 1,
"no-restricted-globals": ["error", ...restrictedGlobals],
"no-restricted-properties": [
2,
{
message:
"Please use import() instead. More info: https://facebook.github.io/create-react-app/docs/code-splitting",
object: "require",
property: "ensure",
},
{
message:
"Please use import() instead. More info: https://facebook.github.io/create-react-app/docs/code-splitting",
object: "System",
property: "import",
},
],
"no-restricted-syntax": [1, "WithStatement"],
"no-script-url": 1,
"no-self-assign": 1,
"no-self-compare": 1,
"no-sequences": 1,
"no-shadow-restricted-names": 1,
"no-sparse-arrays": 1,
"no-template-curly-in-string": 1,
"no-this-before-super": 1,
"no-throw-literal": 1,
"no-undef": 2,
"no-unreachable": 1,
"no-unsafe-negation": 1,
"no-unused-expressions": [
2,
{
allowShortCircuit: true,
allowTaggedTemplates: true,
allowTernary: true,
},
],
"no-unused-labels": 1,
"no-unused-vars": [
1,
{
args: "none",
ignoreRestSiblings: true,
},
],
"no-use-before-define": [
1,
{
classes: false,
functions: false,
variables: false,
},
],
"no-useless-computed-key": 1,
"no-useless-concat": 1,
"no-useless-constructor": 1,
"no-useless-escape": 1,
"no-useless-rename": [
1,
{
ignoreDestructuring: false,
ignoreExport: false,
ignoreImport: false,
},
],
"no-whitespace-before-property": 1,
"no-with": 1,
"react-hooks/exhaustive-deps": 1,
"react-hooks/rules-of-hooks": 2,
"react/forbid-foreign-prop-types": [
1,
{ allowInPropTypes: true },
],
"react/jsx-no-comment-textnodes": 1,
"react/jsx-no-duplicate-props": 1,
"react/jsx-no-target-blank": 1,
"react/jsx-no-undef": 2,
"react/jsx-pascal-case": [
1,
{
allowAllCaps: true,
ignore: [],
},
],
"react/jsx-uses-react": 1,
"react/jsx-uses-vars": 1,
"react/no-danger-with-children": 1,
"react/no-direct-mutation-state": 1,
"react/no-is-mounted": 1,
"react/no-typos": 2,
"react/require-render-return": 2,
"react/style-prop-object": 1,
"require-yield": 1,
"rest-spread-spacing": [1, "never"],
strict: [1, "never"],
"unicode-bom": [1, "never"],
"use-isnan": 1,
"valid-typeof": 1,
...("eslint-config-react-app" in override
? override["eslint-config-react-app"]
: {}),
},
settings: {
react: {
version: "detect",
},
},
},
]),
/*
Create React App - Jest
19,596,119 monthly downloads
ESLint configuration used by Create React App
https://github.com/facebook/create-react-app#readme
Requires: jest, testing-library
*/
...(disable.includes("eslint-config-react-app/jest") ||
threshold > 19_596_119
? []
: [
{
files: [...jsTestFiles, ...tsTestFiles],
languageOptions: {
globals: {
"jest/globals": true,
},
},
name: "Create React App/jest",
rules: {
"functional/functional-parameters": 0,
"functional/no-classes": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
"jest/no-conditional-expect": 2,
"jest/no-identical-title": 2,
"jest/no-interpolation-in-snapshots": 2,
"jest/no-jasmine-globals": 2,
"jest/no-mocks-import": 2,
"jest/valid-describe-callback": 2,
"jest/valid-expect": 2,
"jest/valid-expect-in-promise": 2,
"jest/valid-title": 1,
"playwright/no-standalone-expect": 0,
"testing-library/await-async-queries": 2,
"testing-library/await-async-utils": 2,
"testing-library/no-await-sync-queries": 2,
"testing-library/no-container": 2,
"testing-library/no-debugging-utils": 2,
"testing-library/no-dom-import": [2, "react"],
"testing-library/no-node-access": 2,
"testing-library/no-promise-in-fire-event": 2,
"testing-library/no-render-in-lifecycle": 2,
"testing-library/no-unnecessary-act": 2,
"testing-library/no-wait-for-multiple-assertions": 2,
"testing-library/no-wait-for-side-effects": 2,
"testing-library/no-wait-for-snapshot": 2,
"testing-library/prefer-find-by": 2,
"testing-library/prefer-presence-queries": 2,
"testing-library/prefer-query-by-disappearance": 2,
"testing-library/prefer-screen-queries": 2,
"testing-library/render-result-naming-convention": 2,
...("eslint-config-react-app/jest" in override
? override["eslint-config-react-app/jest"]
: {}),
},
},
]),
/*
Create React App - TS
19,596,119 monthly downloads
ESLint configuration used by Create React App
https://github.com/facebook/create-react-app#readme
Requires: @typescript-eslint
*/
...(disable.includes("eslint-config-react-app/ts") || threshold > 19_596_119
? []
: [
{
files: tsxFiles,
languageOptions: {
globals: {
browser: true,
commonjs: true,
es6: true,
jest: true,
node: true,
},
parserOptions: {
ecmaFeatures: {
jsx: true,
},
warnOnUnsupportedTypeScriptVersion: false,
},
},
name: "Create React App/ts",
rules: {
"@typescript-eslint/consistent-type-assertions": 1,
"@typescript-eslint/no-array-constructor": 1,
"@typescript-eslint/no-redeclare": 1,
"@typescript-eslint/no-unused-expressions": [
2,
{
allowShortCircuit: true,
allowTaggedTemplates: true,
allowTernary: true,
},
],
"@typescript-eslint/no-unused-vars": [
1,
{
args: "none",
ignoreRestSiblings: true,
},
],
"@typescript-eslint/no-use-before-define": [
1,
{
classes: false,
functions: false,
typedefs: false,
variables: false,
},
],
"@typescript-eslint/no-useless-constructor": 1,
"default-case": 0,
"functional/functional-parameters": 0,
"functional/no-classes": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
"no-array-constructor": 0,
"no-dupe-class-members": 0,
"no-redeclare": 0,
"no-undef": 0,
"no-unused-expressions": 0,
"no-unused-vars": 0,
"no-use-before-define": 0,
"no-useless-constructor": 0,
...("eslint-config-react-app/ts" in override
? override["eslint-config-react-app/ts"]
: {}),
},
settings: {
react: {
version: "detect",
},
},
},
]),
/*
NextJS - Config
21,127,776 monthly downloads
ESLint configuration used by Next.js.
https://nextjs.org/docs/app/api-reference/config/eslint
Requires: import, react, jsx-a11y
*/
...(disable.includes("eslint-config-next/config") || threshold > 21_127_776
? []
: [
{
files,
name: "NextJS/config",
rules: {
// Rules Ejected because requires no longer needed: "@rushstack/eslint-patch/modern-module-resolution"
"import/no-anonymous-default-export": 1,
"jsx-a11y/alt-text": [
1,
{
elements: ["img"],
img: ["Image"],
},
],
"jsx-a11y/aria-props": 1,
"jsx-a11y/aria-proptypes": 1,
"jsx-a11y/aria-unsupported-elements": 1,
"jsx-a11y/role-has-required-aria-props": 1,
"jsx-a11y/role-supports-aria-props": 1,
"react/jsx-no-target-blank": 0,
"react/no-unknown-property": 0,
"react/prop-types": 0,
"react/react-in-jsx-scope": 0,
...("eslint-config-next/config" in override
? override["eslint-config-next/config"]
: {}),
},
},
]),
/*
ES-X
23,203,202 monthly downloads
ESLint plugin about ECMAScript syntactic features. / ESLint plugin about ECMAScript syntactic features.
https://github.com/mysticatea/eslint-plugin-es#readme / https://github.com/eslint-community/eslint-plugin-es-x#readme
Requires: es-x
*/
...(disable.includes("eslint-plugin-es") ||
disable.includes("eslint-plugin-es-x") ||
threshold > 23_203_202
? []
: [
{
files,
name: "ES-X",
rules: {
...esX.configs["no-new-in-esnext"].rules,
...("eslint-plugin-es" in override
? override["eslint-plugin-es"]
: {}),
...("eslint-plugin-es-x" in override
? override["eslint-plugin-es-x"]
: {}),
},
},
]),
/*
Node.js
23,464,870 monthly downloads
Additional ESLint's rules for Node.js / Additional ESLint's rules for Node.js
https://github.com/mysticatea/eslint-plugin-node#readme / https://github.com/eslint-community/eslint-plugin-n#readme
Requires: n
*/
...(disable.includes("eslint-plugin-node") ||
disable.includes("eslint-plugin-n") ||
threshold > 23_464_870
? []
: [
{
files,
languageOptions: {
globals: {
__dirname: false,
__filename: false,
exports: false,
module: false,
require: false,
},
},
name: "Node.js",
rules: {
...nNode.configs["flat/recommended-module"].rules,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-throw-statements": 0,
...("eslint-plugin-node" in override
? override["eslint-plugin-node"]
: {}),
...("eslint-plugin-n" in override
? override["eslint-plugin-n"]
: {}),
},
},
]),
/*
NextJS
24,247,047 monthly downloads
ESLint plugin for Next.js.
https://github.com/vercel/next.js#readme
Requires: @next/next
*/
...(disable.includes("@next/eslint-plugin-next") || threshold > 24_247_047
? []
: [
{
files,
name: "NextJS",
rules: {
...nextjs.configs.recommended.rules,
...("@next/eslint-plugin-next" in override
? override["@next/eslint-plugin-next"]
: {}),
},
},
]),
/*
Testing Library
25,191,780 monthly downloads
ESLint plugin to follow best practices and anticipate common mistakes when writing tests with Testing Library
https://github.com/testing-library/eslint-plugin-testing-library
Requires: testing-library
*/
...(disable.includes("eslint-plugin-testing-library") ||
threshold > 25_191_780
? []
: [
{
files: [...jsTestFiles, ...tsTestFiles],
name: "Testing Library",
rules: {
...testingLibrary.configs.react.rules,
"functional/functional-parameters": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
"playwright/no-standalone-expect": 0,
...("eslint-plugin-testing-library" in override
? override["eslint-plugin-testing-library"]
: {}),
},
},
]),
/*
AirBnb Base - Best-Practices
26,141,760 monthly downloads
Airbnb's base JS ESLint config, following our styleguide
https://github.com/airbnb/javascript
Requires: (None)
*/
...(disable.includes("eslint-config-airbnb-base/best-practices") ||
threshold > 26_141_760
? []
: [
{
files: jsFiles,
name: "AirBnb Base/best-practices",
rules: {
"accessor-pairs": 0,
"array-callback-return": [2, { allowImplicit: true }],
"block-scoped-var": 2,
"class-methods-use-this": [2, { exceptMethods: [] }],
complexity: [0, 20],
"consistent-return": 2,
curly: [2, "multi-line"],
"default-case": [2, { commentPattern: "^no default$" }],
"default-case-last": 2,
"default-param-last": 2,
"dot-location": [2, "property"],
"dot-notation": [2, { allowKeywords: true }],
eqeqeq: [2, "always", { null: "ignore" }],
"grouped-accessor-pairs": 2,
"guard-for-in": 2,
"max-classes-per-file": [2, 1],
"no-alert": 1,
"no-caller": 2,
"no-case-declarations": 2,
"no-constructor-return": 2,
"no-div-regex": 0,
"no-else-return": [2, { allowElseIf: false }],
"no-empty-function": [
2,
{
allow: ["arrowFunctions", "functions", "methods"],
},
],
"no-empty-pattern": 2,
"no-empty-static-block": 0,
"no-eq-null": 0,
"no-eval": 2,
"no-extend-native": 2,
"no-extra-bind": 2,
"no-extra-label": 2,
"no-fallthrough": 2,
"no-floating-decimal": 2,
"no-global-assign": [2, { exceptions: [] }],
"no-implicit-coercion": [
0,
{
allow: [],
boolean: false,
number: true,
string: true,
},
],
"no-implicit-globals": 0,
"no-implied-eval": 2,
"no-invalid-this": 0,
"no-iterator": 2,
"no-labels": [2, { allowLoop: false, allowSwitch: false }],
"no-lone-blocks": 2,
"no-loop-func": 2,
"no-magic-numbers": [
0,
{
detectObjects: false,
enforceConst: true,
ignore: [],
ignoreArrayIndexes: true,
},
],
"no-multi-spaces": [
2,
{
ignoreEOLComments: false,
},
],
"no-multi-str": 2,
"no-native-reassign": 0,
"no-new": 2,
"no-new-func": 2,
"no-new-wrappers": 2,
"no-nonoctal-decimal-escape": 2,
"no-object-constructor": 0,
"no-octal": 2,
"no-octal-escape": 2,
"no-param-reassign": [
2,
{
ignorePropertyModificationsFor: [
"acc",
"accumulator",
"e",
"ctx",
"context",
"req",
"request",
"res",
"response",
"$scope",
"staticContext",
],
props: true,
},
],
"no-proto": 2,
"no-redeclare": 2,
"no-restricted-properties": [
2,
{
message: "arguments.callee is deprecated",
object: "arguments",
property: "callee",
},
{
message: "Please use Number.isFinite instead",
object: "global",
property: "isFinite",
},
{
message: "Please use Number.isFinite instead",
object: "self",
property: "isFinite",
},
{
message: "Please use Number.isFinite instead",
object: "window",
property: "isFinite",
},
{
message: "Please use Number.isNaN instead",
object: "global",
property: "isNaN",
},
{
message: "Please use Number.isNaN instead",
object: "self",
property: "isNaN",
},
{
message: "Please use Number.isNaN instead",
object: "window",
property: "isNaN",
},
{
message: "Please use Object.defineProperty instead.",
property: "__defineGetter__",
},
{
message: "Please use Object.defineProperty instead.",
property: "__defineSetter__",
},
{
message: "Use the exponentiation operator (**) instead.",
object: "Math",
property: "pow",
},
],
"no-return-assign": [2, "always"],
"no-return-await": 2,
"no-script-url": 2,
"no-self-assign": [
2,
{
props: true,
},
],
"no-self-compare": 2,
"no-sequences": 2,
"no-throw-literal": 2,
"no-unmodified-loop-condition": 0,
"no-unused-expressions": [
2,
{
allowShortCircuit: false,
allowTaggedTemplates: false,
allowTernary: false,
},
],
"no-unused-labels": 2,
"no-useless-call": 0,
"no-useless-catch": 2,
"no-useless-concat": 2,
"no-useless-escape": 2,
"no-useless-return": 2,
"no-void": 2,
"no-warning-comments": [
0,
{ location: "start", terms: ["todo", "fixme", "xxx"] },
],
"no-with": 2,
"prefer-named-capture-group": 0,
"prefer-object-has-own": 0,
"prefer-promise-reject-errors": [2, { allowEmptyReject: true }],
"prefer-regex-literals": [
2,
{
disallowRedundantWrapping: true,
},
],
"prettier/prettier": 0,
radix: 2,
"require-await": 0,
"require-unicode-regexp": 0,
"vars-on-top": 2,
"wrap-iife": [2, "outside", { functionPrototypeMethods: false }],
yoda: 2,
...("eslint-config-airbnb-base/best-practices" in override
? override["eslint-config-airbnb-base/best-practices"]
: {}),
},
},
]),
/*
AirBnb Base - Errors
26,141,760 monthly downloads
Airbnb's base JS ESLint config, following our styleguide
https://github.com/airbnb/javascript
Requires: (None)
*/
...(disable.includes("eslint-config-airbnb-base/errors") ||
threshold > 26_141_760
? []
: [
{
files: jsFiles,
name: "AirBnb Base/errors",
rules: {
"for-direction": 2,
"getter-return": [2, { allowImplicit: true }],
"no-async-promise-executor": 2,
"no-await-in-loop": 2,
"no-compare-neg-zero": 2,
"no-cond-assign": [2, "always"],
"no-console": 1,
"no-constant-binary-expression": 0,
"no-constant-condition": 1,
"no-control-regex": 2,
"no-debugger": 2,
"no-dupe-args": 2,
"no-dupe-else-if": 2,
"no-dupe-keys": 2,
"no-duplicate-case": 2,
"no-empty": 2,
"no-empty-character-class": 2,
"no-ex-assign": 2,
"no-extra-boolean-cast": 2,
"no-extra-parens": [
0,
"all",
{
conditionalAssign: true,
enforceForArrowConditionals: false,
ignoreJSX: "all",
nestedBinaryExpressions: false,
returnAssign: false,
},
],
"no-extra-semi": 2,
"no-func-assign": 2,
"no-import-assign": 2,
"no-inner-declarations": 2,
"no-invalid-regexp": 2,
"no-irregular-whitespace": 2,
"no-loss-of-precision": 2,
"no-misleading-character-class": 2,
"no-negated-in-lhs": 0,
"no-new-native-nonconstructor": 0,
"no-obj-calls": 2,
"no-promise-executor-return": 2,
"no-prototype-builtins": 2,
"no-regex-spaces": 2,
"no-setter-return": 2,
"no-sparse-arrays": 2,
"no-template-curly-in-string": 2,
"no-unexpected-multiline": 2,
"no-unreachable": 2,
"no-unreachable-loop": [
2,
{
ignore: [],
},
],
"no-unsafe-finally": 2,
"no-unsafe-negation": 2,
"no-unsafe-optional-chaining": [
2,
{ disallowArithmeticOperators: true },
],
"no-unused-private-class-members": 0,
"no-useless-backreference": 2,
"require-atomic-updates": 0,
"use-isnan": 2,
"valid-typeof": [2, { requireStringLiterals: true }],
...("eslint-config-airbnb-base/errors" in override
? override["eslint-config-airbnb-base/errors"]
: {}),
},
},
]),
/*
AirBnb Base - ES6
26,141,760 monthly downloads
Airbnb's base JS ESLint config, following our styleguide
https://github.com/airbnb/javascript
Requires: (None)
*/
...(disable.includes("eslint-config-airbnb-base/es6") ||
threshold > 26_141_760
? []
: [
{
files: jsFiles,
ignores: [...jsTestFiles, ...tsTestFiles],
name: "AirBnb Base/es6",
rules: {
"@stylistic/arrow-parens": 0,
"arrow-body-style": [
2,
"as-needed",
{
requireReturnForObjectLiteral: false,
},
],
"arrow-parens": [2, "always"],
"arrow-spacing": [2, { after: true, before: true }],
"constructor-super": 2,
"generator-star-spacing": [2, { after: true, before: false }],
"mocha/no-mocha-arrows": 0,
"no-class-assign": 2,
"no-confusing-arrow": [
2,
{
allowParens: true,
},
],
"no-const-assign": 2,
"no-dupe-class-members": 2,
"no-duplicate-imports": 0,
"no-new-symbol": 2,
"no-restricted-exports": [
2,
{
restrictedNamedExports: ["default", "then"],
},
],
"no-restricted-imports": [
0,
{
paths: [],
patterns: [],
},
],
"no-this-before-super": 2,
"no-useless-computed-key": 2,
"no-useless-constructor": 2,
"no-useless-rename": [
2,
{
ignoreDestructuring: false,
ignoreExport: false,
ignoreImport: false,
},
],
"no-var": 2,
"object-shorthand": [
2,
"always",
{
avoidQuotes: true,
ignoreConstructors: false,
},
],
"prefer-arrow-callback": [
2,
{
allowNamedFunctions: false,
allowUnboundThis: true,
},
],
"prefer-const": [
2,
{
destructuring: "any",
ignoreReadBeforeAssign: true,
},
],
"prefer-destructuring": [
2,
{
AssignmentExpression: {
array: true,
object: false,
},
VariableDeclarator: {
array: false,
object: true,
},
},
{
enforceForRenamedProperties: false,
},
],
"prefer-numeric-literals": 2,
"prefer-reflect": 0,
"prefer-rest-params": 2,
"prefer-spread": 2,
"prefer-template": 2,
"require-yield": 2,
"rest-spread-spacing": [2, "never"],
"sort-imports": [
0,
{
ignoreCase: false,
ignoreDeclarationSort: false,
ignoreMemberSort: false,
memberSyntaxSortOrder: ["none", "all", "multiple", "single"],
},
],
"symbol-description": 2,
"template-curly-spacing": 2,
"yield-star-spacing": [2, "after"],
...("eslint-config-airbnb-base/es6" in override
? override["eslint-config-airbnb-base/es6"]
: {}),
},
},
]),
/*
AirBnb Base - Imports
26,141,760 monthly downloads
Airbnb's base JS ESLint config, following our styleguide
https://github.com/airbnb/javascript
Requires: import
*/
...(disable.includes("eslint-config-airbnb-base/imports") ||
threshold > 26_141_760
? []
: [
{
files: jsFiles,
name: "AirBnb Base/imports",
rules: {
"import/consistent-type-specifier-style": [0, "prefer-inline"],
"import/default": 0,
"import/dynamic-import-chunkname": [
0,
{
importFunctions: [],
webpackChunknameFormat: "[0-9a-zA-Z-_/.]+",
},
],
"import/export": 2,
"import/exports-last": 0,
"import/extensions": [
2,
"ignorePackages",
{
js: "never",
jsx: "never",
mjs: "never",
},
],
"import/first": 2,
"import/group-exports": 0,
"import/imports-first": 0,
"import/max-dependencies": [0, { max: 10 }],
"import/named": 2,
"import/namespace": 0,
"import/newline-after-import": 2,
"import/no-absolute-path": 2,
"import/no-amd": 2,
"import/no-anonymous-default-export": [
0,
{
allowAnonymousClass: false,
allowAnonymousFunction: false,
allowArray: false,
allowArrowFunction: false,
allowLiteral: false,
allowObject: false,
},
],
"import/no-commonjs": 0,
"import/no-cycle": [2, { maxDepth: "∞" }],
"import/no-default-export": 0,
"import/no-deprecated": 0,
"import/no-duplicates": 2,
"import/no-dynamic-require": 2,
"import/no-empty-named-blocks": 0,
"import/no-extraneous-dependencies": [
2,
{
devDependencies: [
"test/**",
"tests/**",
"spec/**",
"**/__tests__/**",
"**/__mocks__/**",
"test.{js,jsx}",
"test-*.{js,jsx}",
"**/*{.,_}{test,spec}.{js,jsx}",
"**/jest.config.js",
"**/jest.setup.js",
"**/vue.config.js",
"**/webpack.config.js",
"**/webpack.config.*.js",
"**/rollup.config.js",
"**/rollup.config.*.js",
"**/gulpfile.js",
"**/gulpfile.*.js",
"**/Gruntfile{,.js}",
"**/protractor.conf.js",
"**/protractor.conf.*.js",
"**/karma.conf.js",
"**/.eslintrc.js",
],
optionalDependencies: false,
},
],
"import/no-import-module-exports": [
2,
{
exceptions: [],
},
],
"import/no-internal-modules": [
0,
{
allow: [],
},
],
"import/no-mutable-exports": 2,
"import/no-named-as-default": 2,
"import/no-named-as-default-member": 2,
"import/no-named-default": 2,
"import/no-named-export": 0,
"import/no-namespace": 0,
"import/no-nodejs-modules": 0,
"import/no-relative-packages": 2,
"import/no-relative-parent-imports": 0,
"import/no-restricted-paths": 0,
"import/no-self-import": 2,
"import/no-unassigned-import": 0,
"import/no-unresolved": [
2,
{ caseSensitive: true, commonjs: true },
],
"import/no-unused-modules": [
0,
{
ignoreExports: [],
missingExports: true,
unusedExports: true,
},
],
"import/no-useless-path-segments": [2, { commonjs: true }],
"import/no-webpack-loader-syntax": 2,
"import/order": [
2,
{ groups: [["builtin", "external", "internal"]] },
],
"import/prefer-default-export": 2,
"import/unambiguous": 0,
...("eslint-config-airbnb-base/imports" in override
? override["eslint-config-airbnb-base/imports"]
: {}),
},
},
]),
/*
AirBnb Base - Node
26,141,760 monthly downloads
Airbnb's base JS ESLint config, following our styleguide
https://github.com/airbnb/javascript
Requires: (None)
*/
...(disable.includes("eslint-config-airbnb-base/node") ||
threshold > 26_141_760
? []
: [
{
files: jsFiles,
name: "AirBnb Base/node",
rules: {
"callback-return": 0,
"global-require": 2,
"handle-callback-err": 0,
"no-buffer-constructor": 2,
"no-mixed-requires": [0, false],
"no-new-require": 2,
"no-path-concat": 2,
"no-process-env": 0,
"no-process-exit": 0,
"no-restricted-modules": 0,
"no-sync": 0,
...("eslint-config-airbnb-base/node" in override
? override["eslint-config-airbnb-base/node"]
: {}),
},
},
]),
/*
AirBnb Base - Strict
26,141,760 monthly downloads
Airbnb's base JS ESLint config, following our styleguide
https://github.com/airbnb/javascript
Requires: (None)
*/
...(disable.includes("eslint-config-airbnb-base/strict") ||
threshold > 26_141_760
? []
: [
{
files: jsFiles,
name: "AirBnb Base/strict",
rules: {
strict: [2, "never"],
...("eslint-config-airbnb-base/strict" in override
? override["eslint-config-airbnb-base/strict"]
: {}),
},
},
]),
/*
AirBnb Base - Style
26,141,760 monthly downloads
Airbnb's base JS ESLint config, following our styleguide
https://github.com/airbnb/javascript
Requires: jsdoc
*/
...(disable.includes("eslint-config-airbnb-base/style") ||
threshold > 26_141_760
? []
: [
{
files: jsFiles,
name: "AirBnb Base/style",
rules: {
"@stylistic/quote-props": 0,
"@stylistic/semi": 0,
"array-bracket-newline": [0, "consistent"],
"array-bracket-spacing": [2, "never"],
"array-element-newline": [0, { minItems: 3, multiline: true }],
"block-spacing": [2, "always"],
"brace-style": [2, "1tbs", { allowSingleLine: true }],
camelcase: [
2,
{ ignoreDestructuring: false, properties: "never" },
],
"capitalized-comments": [
0,
"never",
{
block: {
ignoreConsecutiveComments: true,
ignoreInlineComments: true,
ignorePattern: ".*",
},
line: {
ignoreConsecutiveComments: true,
ignoreInlineComments: true,
ignorePattern: ".*",
},
},
],
"comma-dangle": [
2,
{
arrays: "always-multiline",
exports: "always-multiline",
functions: "always-multiline",
imports: "always-multiline",
objects: "always-multiline",
},
],
"comma-spacing": [2, { after: true, before: false }],
"comma-style": [
2,
"last",
{
exceptions: {
ArrayExpression: false,
ArrayPattern: false,
ArrowFunctionExpression: false,
CallExpression: false,
FunctionDeclaration: false,
FunctionExpression: false,
ImportDeclaration: false,
NewExpression: false,
ObjectExpression: false,
ObjectPattern: false,
VariableDeclaration: false,
},
},
],
"computed-property-spacing": [2, "never"],
"consistent-this": 0,
"eol-last": [2, "always"],
"func-call-spacing": [2, "never"],
"func-name-matching": [
0,
"always",
{
considerPropertyDescriptor: true,
includeCommonJSModuleExports: false,
},
],
"func-names": 1,
"func-style": [0, "expression"],
"function-call-argument-newline": [2, "consistent"],
"function-paren-newline": [2, "multiline-arguments"],
"id-denylist": 0,
"id-length": 0,
"id-match": 0,
"implicit-arrow-linebreak": [2, "beside"],
indent: [
2,
2,
{
ArrayExpression: 1,
CallExpression: {
arguments: 1,
},
flatTernaryExpressions: false,
FunctionDeclaration: {
body: 1,
parameters: 1,
},
FunctionExpression: {
body: 1,
parameters: 1,
},
ignoreComments: false,
ignoredNodes: [
"JSXElement",
"JSXElement > *",
"JSXAttribute",
"JSXIdentifier",
"JSXNamespacedName",
"JSXMemberExpression",
"JSXSpreadAttribute",
"JSXExpressionContainer",
"JSXOpeningElement",
"JSXClosingElement",
"JSXFragment",
"JSXOpeningFragment",
"JSXClosingFragment",
"JSXText",
"JSXEmptyExpression",
"JSXSpreadChild",
],
ImportDeclaration: 1,
ObjectExpression: 1,
outerIIFEBody: 1,
SwitchCase: 1,
VariableDeclarator: 1,
},
],
"jsdoc/require-jsdoc": 0,
"jsx-quotes": [0, "prefer-double"],
"key-spacing": [2, { afterColon: true, beforeColon: false }],
"keyword-spacing": [
2,
{
after: true,
before: true,
overrides: {
case: { after: true },
return: { after: true },
throw: { after: true },
},
},
],
"line-comment-position": [
0,
{
applyDefaultPatterns: true,
ignorePattern: "",
position: "above",
},
],
"linebreak-style": [2, "unix"],
"lines-around-comment": 0,
"lines-around-directive": [
2,
{
after: "always",
before: "always",
},
],
"lines-between-class-members": [
2,
"always",
{ exceptAfterSingleLine: false },
],
"logical-assignment-operators": [
0,
"always",
{
enforceForIfStatements: true,
},
],
"max-depth": [0, 4],
"max-len": [
2,
100,
2,
{
ignoreComments: false,
ignoreRegExpLiterals: true,
ignoreStrings: true,
ignoreTemplateLiterals: true,
ignoreUrls: true,
},
],
"max-lines": [
0,
{
max: 300,
skipBlankLines: true,
skipComments: true,
},
],
"max-lines-per-function": [
0,
{
IIFEs: true,
max: 50,
skipBlankLines: true,
skipComments: true,
},
],
"max-nested-callbacks": 0,
"max-params": [0, 3],
"max-statements": [0, 10],
"max-statements-per-line": [0, { max: 1 }],
"multiline-comment-style": [0, "starred-block"],
"multiline-ternary": [0, "never"],
"new-cap": [
2,
{
capIsNew: false,
capIsNewExceptions: [
"Immutable.Map",
"Immutable.Set",
"Immutable.List",
],
newIsCap: true,
newIsCapExceptions: [],
},
],
"new-parens": 2,
"newline-after-var": 0,
"newline-before-return": 0,
"newline-per-chained-call": [2, { ignoreChainWithDepth: 4 }],
"no-array-constructor": 2,
"no-bitwise": 2,
"no-continue": 2,
"no-inline-comments": 0,
"no-lonely-if": 2,
"no-mixed-operators": [
2,
{
allowSamePrecedence: false,
groups: [
["%", "**"],
["%", "+"],
["%", "-"],
["%", "*"],
["%", "/"],
["/", "*"],
["&", "|", "<<", ">>", ">>>"],
["==", "!=", "===", "!=="],
["&&", "||"],
],
},
],
"no-mixed-spaces-and-tabs": 2,
"no-multi-assign": [2],
"no-multiple-empty-lines": [2, { max: 1, maxBOF: 0, maxEOF: 0 }],
"no-negated-condition": 0,
"no-nested-ternary": 2,
"no-new-object": 2,
"no-plusplus": 2,
"no-restricted-syntax": [
2,
{
message:
"for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.",
selector: "ForInStatement",
},
// {
// selector: 'ForOfStatement',
// message: 'iterators/generators require regenerator-runtime, which is too heavyweight for this guide to allow them. Separately, loops should be avoided in favor of array iterations.',
// },
{
message:
"Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand.",
selector: "LabeledStatement",
},
{
message:
"with is disallowed in strict mode because it makes code impossible to predict and optimize.",
selector: "WithStatement",
},
],
"no-spaced-func": 0,
"no-tabs": 2,
"no-ternary": 0,
"no-trailing-spaces": [
2,
{
ignoreComments: false,
skipBlankLines: false,
},
],
"no-underscore-dangle": [
2,
{
allow: [],
allowAfterSuper: false,
allowAfterThis: false,
enforceInMethodNames: true,
},
],
"no-unneeded-ternary": [2, { defaultAssignment: false }],
"no-whitespace-before-property": 2,
"nonblock-statement-body-position": [
2,
"beside",
{ overrides: {} },
],
"object-curly-newline": [
2,
{
ExportDeclaration: {
consistent: true,
minProperties: 4,
multiline: true,
},
ImportDeclaration: {
consistent: true,
minProperties: 4,
multiline: true,
},
ObjectExpression: {
consistent: true,
minProperties: 4,
multiline: true,
},
ObjectPattern: {
consistent: true,
minProperties: 4,
multiline: true,
},
},
],
"object-curly-spacing": [2, "always"],
"object-property-newline": [
2,
{
allowAllPropertiesOnSameLine: true,
},
],
"one-var": [2, "never"],
"one-var-declaration-per-line": [2, "always"],
"operator-assignment": [2, "always"],
"operator-linebreak": [
2,
"before",
{ overrides: { "=": "none" } },
],
"padded-blocks": [
2,
{
blocks: "never",
classes: "never",
switches: "never",
},
{
allowSingleLineBlocks: true,
},
],
"padding-line-between-statements": 0,
"prefer-exponentiation-operator": 2,
"prefer-object-spread": 2,
"prettier/prettier": 0,
"quote-props": [
2,
"as-needed",
{ keywords: false, numbers: false, unnecessary: true },
],
quotes: [2, "single", { avoidEscape: true }],
semi: [2, "always"],
"semi-spacing": [2, { after: true, before: false }],
"semi-style": [2, "last"],
"sort-keys": [0, "asc", { caseSensitive: false, natural: true }],
"sort-vars": 0,
"space-before-blocks": 2,
"space-before-function-paren": [
2,
{
anonymous: "always",
asyncArrow: "always",
named: "never",
},
],
"space-in-parens": [2, "never"],
"space-infix-ops": 2,
"space-unary-ops": [
2,
{
nonwords: false,
words: true,
},
],
"spaced-comment": [
2,
"always",
{
block: {
balanced: true,
exceptions: ["-", "+"],
markers: ["=", "!", ":", "::"],
},
line: {
exceptions: ["-", "+"],
markers: ["=", "!", "/"],
},
},
],
"switch-colon-spacing": [2, { after: true, before: false }],
"template-tag-spacing": [2, "never"],
"unicode-bom": [2, "never"],
"wrap-regex": 0,
...("eslint-config-airbnb-base/style" in override
? override["eslint-config-airbnb-base/style"]
: {}),
},
},
]),
/*
AirBnb Base - Variables
26,141,760 monthly downloads
Airbnb's base JS ESLint config, following our styleguide
https://github.com/airbnb/javascript
Requires: (None)
*/
...(disable.includes("eslint-config-airbnb-base/variables") ||
threshold > 26_141_760
? []
: [
{
files: jsFiles,
name: "AirBnb Base/variables",
rules: {
"init-declarations": 0,
"no-catch-shadow": 0,
"no-delete-var": 2,
"no-label-var": 2,
"no-restricted-globals": [
"error",
{
message:
"Use Number.isFinite instead https://github.com/airbnb/javascript#standard-library--isfinite",
name: "isFinite",
},
{
message:
"Use Number.isNaN instead https://github.com/airbnb/javascript#standard-library--isnan",
name: "isNaN",
},
...[
"addEventListener",
"blur",
"close",
"closed",
"confirm",
"defaultStatus",
"defaultstatus",
"event",
"external",
"find",
"focus",
"frameElement",
"frames",
"history",
"innerHeight",
"innerWidth",
"length",
"location",
"locationbar",
"menubar",
"moveBy",
"moveTo",
"name",
"onblur",
"onerror",
"onfocus",
"onload",
"onresize",
"onunload",
"open",
"opener",
"opera",
"outerHeight",
"outerWidth",
"pageXOffset",
"pageYOffset",
"parent",
"print",
"removeEventListener",
"resizeBy",
"resizeTo",
"screen",
"screenLeft",
"screenTop",
"screenX",
"screenY",
"scroll",
"scrollbars",
"scrollBy",
"scrollTo",
"scrollX",
"scrollY",
"self",
"status",
"statusbar",
"stop",
"toolbar",
"top",
].map((g) => ({
message: `Use window.${g} instead. https://github.com/facebook/create-react-app/blob/HEAD/packages/confusing-browser-globals/README.md`,
name: g,
})),
],
"no-shadow": 2,
"no-shadow-restricted-names": 2,
"no-undef": 2,
"no-undef-init": 2,
"no-undefined": 0,
"no-unused-vars": [
2,
{ args: "after-used", ignoreRestSiblings: true, vars: "all" },
],
"no-use-before-define": [
2,
{ classes: true, functions: true, variables: true },
],
...("eslint-config-airbnb-base/variables" in override
? override["eslint-config-airbnb-base/variables"]
: {}),
},
},
]),
/*
Jest
48,022,548 monthly downloads
ESLint rules for Jest
https://github.com/jest-community/eslint-plugin-jest#readme
Requires: jest
*/
...(disable.includes("eslint-plugin-jest") || threshold > 48_022_548
? []
: [
{
files: [...jsTestFiles, ...tsTestFiles],
languageOptions: {
globals: {
afterAll: false,
afterEach: false,
beforeAll: false,
beforeEach: false,
describe: false,
expect: false,
fit: false,
it: false,
jest: false,
test: false,
xdescribe: false,
xit: false,
xtest: false,
},
},
name: "Jest",
rules: {
...jest.configs["flat/recommended"].rules,
"functional/functional-parameters": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
"playwright/no-standalone-expect": 0,
...("eslint-plugin-jest" in override
? override["eslint-plugin-jest"]
: {}),
},
},
]),
/*
JSX Accessibility (JSX A11y)
61,742,765 monthly downloads
Static AST checker for accessibility rules on JSX elements.
https://github.com/jsx-eslint/eslint-plugin-jsx-a11y#readme
Requires: jsx-a11y
*/
...(disable.includes("eslint-plugin-jsx-a11y") || threshold > 61_742_765
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
name: "JSX Accessibility (JSX A11y)",
rules: {
...jsxA11y.configs.recommended.rules,
...("eslint-plugin-jsx-a11y" in override
? override["eslint-plugin-jsx-a11y"]
: {}),
},
},
]),
/*
Prettier - JSON
64,196,166 monthly downloads
Runs prettier as an eslint rule
https://github.com/prettier/eslint-plugin-prettier#readme
Requires: prettier
*/
...(disable.includes("eslint-plugin-prettier/json") ||
threshold > 64_196_166
? []
: [
{
files: jsonFiles,
name: "Prettier/json",
rules: {
"jsonc/sort-keys": 0,
"prettier/prettier": 2,
...("eslint-plugin-prettier/json" in override
? override["eslint-plugin-prettier/json"]
: {}),
},
},
]),
/*
Prettier - MD
64,196,166 monthly downloads
Runs prettier as an eslint rule
https://github.com/prettier/eslint-plugin-prettier#readme
Requires: prettier
*/
...(disable.includes("eslint-plugin-prettier/md") || threshold > 64_196_166
? []
: [
{
files: mdFiles,
name: "Prettier/md",
rules: {
"antfu/import-dedupe": 0,
"import-x/consistent-type-specifier-style": 0,
"import-x/first": 0,
"import-x/newline-after-import": 0,
"import-x/no-duplicates": 0,
"prettier/prettier": [2, { parser: "markdown" }],
"unicorn/consistent-empty-array-spread": 0,
"unicorn/escape-case": 0,
"unicorn/new-for-builtins": 0,
"unicorn/no-instanceof-array": 0,
"unicorn/no-new-array": 0,
"unicorn/no-new-buffer": 0,
"unicorn/number-literal-case": 0,
"unicorn/prefer-includes": 0,
"unicorn/prefer-node-protocol": 0,
"unicorn/prefer-number-properties": 0,
"unicorn/prefer-string-starts-ends-with": 0,
"unicorn/prefer-type-error": 0,
"unicorn/throw-new-error": 0,
...("eslint-plugin-prettier/md" in override
? override["eslint-plugin-prettier/md"]
: {}),
},
},
]),
/*
Prettier - Plugin
64,196,166 monthly downloads
Runs prettier as an eslint rule
https://github.com/prettier/eslint-plugin-prettier#readme
Requires: prettier
*/
...(disable.includes("eslint-plugin-prettier/plugin") ||
threshold > 64_196_166
? []
: [
{
files,
name: "Prettier/plugin",
rules: {
"@stylistic/arrow-parens": 0,
"@stylistic/brace-style": 0,
"@stylistic/indent": 0,
"@stylistic/indent-binary-ops": 0,
"@stylistic/jsx-one-expression-per-line": 0,
"@stylistic/member-delimiter-style": 0,
"@stylistic/multiline-ternary": 0,
"@stylistic/operator-linebreak": 0,
"@stylistic/quote-props": 0,
"@stylistic/quotes": 0,
"@stylistic/semi": 0,
"@stylistic/yield-star-spacing": 0,
"comma-dangle": 0,
curly: 0,
"generator-star-spacing": 0,
indent: 0,
"jsx-quotes": 0,
"prettier/prettier": 2,
quotes: 0,
"react/jsx-indent": 0,
semi: 0,
"space-before-function-paren": 0,
"unicorn/no-nested-ternary": 0,
"yield-star-spacing": 0,
...("eslint-plugin-prettier/plugin" in override
? override["eslint-plugin-prettier/plugin"]
: {}),
},
},
]),
/*
Prettier - YML
64,196,166 monthly downloads
Runs prettier as an eslint rule
https://github.com/prettier/eslint-plugin-prettier#readme
Requires: prettier
*/
...(disable.includes("eslint-plugin-prettier/yml") || threshold > 64_196_166
? []
: [
{
files: ymlFiles,
name: "Prettier/yml",
rules: {
"prettier/prettier": 2,
"yml/flow-mapping-curly-spacing": 0,
...("eslint-plugin-prettier/yml" in override
? override["eslint-plugin-prettier/yml"]
: {}),
},
},
]),
/*
React Hooks
78,244,343 monthly downloads
ESLint rules for React Hooks
https://react.dev/
Requires: react-hooks
*/
...(disable.includes("eslint-plugin-react-hooks") || threshold > 78_244_343
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
name: "React Hooks",
rules: {
...reactHooks.configs.recommended.rules,
"functional/functional-parameters": 0,
"functional/no-classes": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
...("eslint-plugin-react-hooks" in override
? override["eslint-plugin-react-hooks"]
: {}),
},
},
]),
/*
React
85,460,987 monthly downloads
React specific linting rules for ESLint
https://github.com/jsx-eslint/eslint-plugin-react
Requires: react
*/
...(disable.includes("eslint-plugin-react") || threshold > 85_460_987
? []
: [
{
files: [...jsxFiles, ...tsxFiles],
languageOptions: {
parserOptions: {
ecmaFeatures: {
jsx: true,
},
},
},
name: "React",
rules: {
...react.configs.recommended.rules,
"functional/functional-parameters": 0,
"functional/no-classes": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
"functional/no-throw-statements": 0,
...("eslint-plugin-react" in override
? override["eslint-plugin-react"]
: {}),
},
settings: {
react: {
pragma: "React",
version: "detect",
},
},
},
]),
/*
Prettier
93,750,889 monthly downloads
Turns off all rules that are unnecessary or might conflict with Prettier.
https://github.com/prettier/eslint-config-prettier#readme
Requires: prettier, @typescript-eslint, @babel, unicorn, react, @stylistic
*/
...(disable.includes("eslint-config-prettier") || threshold > 93_750_889
? []
: [
{
files,
name: "Prettier",
rules: {
...prettierConfig.rules,
"@next/next/no-html-link-for-pages": 0,
"antfu/consistent-chaining": 0,
"prettier/prettier": 2,
...("eslint-config-prettier" in override
? override["eslint-config-prettier"]
: {}),
},
},
]),
/*
ESLint
132,733,326 monthly downloads
ESLint JavaScript language implementation
https://eslint.org
Requires: (None)
*/
...(disable.includes("@eslint/js") || threshold > 132_733_326
? []
: [
{
files: jsFiles,
name: "ESLint",
rules: {
...eslint.configs.recommended.rules,
"@next/next/no-html-link-for-pages": 0,
...("@eslint/js" in override ? override["@eslint/js"] : {}),
},
},
]),
/*
Import - ts
140,997,047 monthly downloads
This plugin adds `TypeScript` support to `eslint-plugin-import` / Import with sanity.
https://github.com/import-js/eslint-import-resolver-typescript#readme / https://github.com/import-js/eslint-plugin-import
Requires: import
*/
...(disable.includes("eslint-import-resolver-typescript/ts") ||
disable.includes("eslint-plugin-import/ts") ||
threshold > 140_997_047
? []
: [
{
files: tsFiles,
name: "Import/ts",
rules: {
...importPlugin.configs.typescript.rules,
...("eslint-import-resolver-typescript/ts" in override
? override["eslint-import-resolver-typescript/ts"]
: {}),
...("eslint-plugin-import/ts" in override
? override["eslint-plugin-import/ts"]
: {}),
},
},
]),
/*
Import
140,997,047 monthly downloads
This plugin adds `TypeScript` support to `eslint-plugin-import` / Import with sanity.
https://github.com/import-js/eslint-import-resolver-typescript#readme / https://github.com/import-js/eslint-plugin-import
Requires: import
*/
...(disable.includes("eslint-import-resolver-typescript") ||
disable.includes("eslint-plugin-import") ||
threshold > 140_997_047
? []
: [
{
files,
name: "Import",
rules: {
...importPlugin.configs.recommended.rules,
"n/no-missing-import": 0,
...("eslint-import-resolver-typescript" in override
? override["eslint-import-resolver-typescript"]
: {}),
...("eslint-plugin-import" in override
? override["eslint-plugin-import"]
: {}),
},
settings: {
"import/core-modules": [],
"import/extensions": [
".js",
".mjs",
".jsx",
".ts",
".tsx",
".d.ts",
],
"import/external-module-folders": [
"node_modules",
"node_modules/@types",
],
"import/ignore": [
"node_modules",
".(coffee|scss|css|less|hbs|svg|json)$",
],
"import/parsers": {
"@typescript-eslint/parser": [
".ts",
".tsx",
".js",
".jsx",
".mjs",
".cjs",
".mts",
".cts",
],
},
"import/resolver": {
node: {
extensions: [
".mjs",
".js",
".jsx",
".json",
".ts",
".tsx",
".d.ts",
],
},
typescript: { alwaysTryTypes: true },
},
},
},
]),
/*
TypeScript
163,758,331 monthly downloads
Tooling which enables you to use TypeScript with ESLint / TypeScript plugin for ESLint
https://typescript-eslint.io/packages/typescript-eslint / https://typescript-eslint.io/packages/eslint-plugin
Requires: @typescript-eslint
*/
...(disable.includes("typescript-eslint") ||
disable.includes("@typescript-eslint/eslint-plugin") ||
threshold > 163_758_331
? []
: [
{
files: tsFiles,
name: "TypeScript",
rules: {
...tseslint.configs.recommendedTypeChecked[1].rules,
...tseslint.configs.recommendedTypeChecked[2].rules,
"@next/next/no-html-link-for-pages": 0,
"@typescript-eslint/no-misused-spread": 0,
"@typescript-eslint/no-use-before-define": 0,
"functional/no-classes": 0,
"functional/no-conditional-statements": 0,
"functional/no-expression-statements": 0,
"functional/no-return-void": 0,
...("typescript-eslint" in override
? override["typescript-eslint"]
: {}),
...("@typescript-eslint/eslint-plugin" in override
? override["@typescript-eslint/eslint-plugin"]
: {}),
},
},
]),
/* CONTEXT OVERRIDES */
/*
MDX - Code-Blocks
1,151,049 monthly downloads
ESLint Plugin for MDX
https://github.com/mdx-js/eslint-mdx/blob/master/packages/eslint-plugin-mdx
Requires: (None)
*/
...(disable.includes("eslint-plugin-mdx/code-blocks") ||
threshold > 1_151_049
? []
: [
{
files: codeBlocks,
languageOptions: {
parserOptions: {
ecmaFeatures: {
impliedStrict: true,
},
},
},
name: "MDX/code-blocks",
rules: {
// MDX "recommended" is composed of Overrides, Base, and CodeBlocks but with unneeded conditional logic
// CodeBlocks:
...mdx.configs.codeBlocks.rules,
...("eslint-plugin-mdx/code-blocks" in override
? override["eslint-plugin-mdx/code-blocks"]
: {}),
},
},
]),
/*
Markdown - Code-Blocks
2,649,119 monthly downloads
An ESLint plugin to lint JavaScript in Markdown code fences. / The official ESLint language plugin for Markdown
https://github.com/eslint/eslint-plugin-markdown#readme / https://github.com/eslint/markdown#readme
Requires: markdown
*/
...(disable.includes("eslint-plugin-markdown/code-blocks") ||
disable.includes("@eslint/markdown/code-blocks") ||
threshold > 2_649_119
? []
: [
{
files: codeBlocks,
languageOptions: {
parserOptions: {
ecmaFeatures: {
impliedStrict: true,
},
},
},
name: "Markdown/code-blocks",
rules: {
...markdown.configs.processor[2].rules,
...("eslint-plugin-markdown/code-blocks" in override
? override["eslint-plugin-markdown/code-blocks"]
: {}),
...("@eslint/markdown/code-blocks" in override
? override["@eslint/markdown/code-blocks"]
: {}),
},
},
]),
]);
export default configGen;
// EOF