From 03895c1fe56f2dc2ec8628c0e2665ea4a14cd28c Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Wed, 17 Jan 2024 13:48:13 +0000 Subject: [PATCH 1/7] docs(website): tables from source rules to Biome rules --- crates/biome_analyze/src/rule.rs | 71 ++- website/astro.config.ts | 4 + .../src/components/generated/Sources.astro | 426 ++++++++++++++++++ website/src/content/docs/linter/index.mdx | 5 +- .../content/docs/linter/linter-sources.mdx | 163 +++++++ .../src/content/docs/linter/rule-sources.mdx | 163 +++++++ xtask/lintdoc/src/main.rs | 6 + xtask/lintdoc/src/rules_sources.rs | 118 +++++ 8 files changed, 954 insertions(+), 2 deletions(-) create mode 100644 website/src/components/generated/Sources.astro create mode 100644 website/src/content/docs/linter/linter-sources.mdx create mode 100644 website/src/content/docs/linter/rule-sources.mdx create mode 100644 xtask/lintdoc/src/rules_sources.rs diff --git a/crates/biome_analyze/src/rule.rs b/crates/biome_analyze/src/rule.rs index d6b6aa382db0..9c7c25f56b1f 100644 --- a/crates/biome_analyze/src/rule.rs +++ b/crates/biome_analyze/src/rule.rs @@ -14,6 +14,7 @@ use biome_diagnostics::{ Visit, }; use biome_rowan::{AstNode, BatchMutation, BatchMutationExt, Language, TextRange}; +use std::cmp::Ordering; use std::fmt::Debug; #[derive(Debug, Clone)] @@ -56,7 +57,7 @@ impl Display for FixKind { } } -#[derive(Debug, Clone, Eq, PartialEq)] +#[derive(Debug, Clone, Eq, PartialEq, Hash)] pub enum RuleSource { /// Rules from [Rust Clippy](https://rust-lang.github.io/rust-clippy/master/index.html) Clippy(&'static str), @@ -86,6 +87,48 @@ pub enum RuleSource { EslintMysticatea(&'static str), } +impl std::fmt::Display for RuleSource { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + RuleSource::Clippy(_) => write!(f, "clippy"), + RuleSource::Eslint(_) => write!(f, "eslint"), + RuleSource::EslintImport(_) => write!(f, "eslint-plugin-import"), + RuleSource::EslintImportAccess(_) => write!(f, "eslint-plugin-import-access"), + RuleSource::EslintJest(_) => write!(f, "eslint-plugin-jest"), + RuleSource::EslintJsxA11y(_) => write!(f, "eslint-plugin-jsx-a11y"), + RuleSource::EslintReact(_) => write!(f, "eslint-plugin-react"), + RuleSource::EslintReactHooks(_) => write!(f, "eslint-plugin-react-hooks"), + RuleSource::EslintSonarJs(_) => write!(f, "eslint-plugin-sonarjs"), + RuleSource::EslintStylistic(_) => write!(f, "eslint-plugin-stylistic"), + RuleSource::EslintTypeScript(_) => write!(f, "eslint-plugin-typescript"), + RuleSource::EslintUnicorn(_) => write!(f, "eslint-plugin-unicorn"), + RuleSource::EslintMysticatea(_) => write!(f, "eslint-plugin-mysticates"), + } + } +} + +impl PartialOrd for RuleSource { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for RuleSource { + fn cmp(&self, other: &Self) -> Ordering { + if let (RuleSource::Eslint(self_rule), RuleSource::Eslint(other_rule)) = (self, other) { + self_rule.cmp(other_rule) + } else if self.is_eslint() { + Ordering::Greater + } else if other.is_eslint() { + Ordering::Less + } else { + let self_rule = self.as_rule_name(); + let other_rule = other.as_rule_name(); + self_rule.cmp(other_rule) + } + } +} + impl RuleSource { pub fn as_rule_name(&self) -> &'static str { match self { @@ -126,6 +169,32 @@ impl RuleSource { pub fn as_url_and_rule_name(&self) -> (String, &'static str) { (self.as_rule_url(), self.as_rule_name()) } + + /// Original ESLint rule + pub const fn is_eslint(&self) -> bool { + matches!(self, Self::Eslint(_)) + } + + /// TypeScript plugin + pub const fn is_eslint_typescript(&self) -> bool { + matches!(self, Self::EslintTypeScript(_)) + } + + /// All ESLint plugins, exception for the TypeScript one + pub const fn is_eslint_plugin(&self) -> bool { + matches!( + self, + Self::EslintImport(_) + | Self::EslintImportAccess(_) + | Self::EslintJest(_) + | Self::EslintStylistic(_) + | Self::EslintJsxA11y(_) + | Self::EslintReact(_) + | Self::EslintReactHooks(_) + | Self::EslintSonarJs(_) + | Self::EslintUnicorn(_) + ) + } } #[derive(Debug, Default, Clone)] diff --git a/website/astro.config.ts b/website/astro.config.ts index ef4c14eefe4a..1279af35063f 100644 --- a/website/astro.config.ts +++ b/website/astro.config.ts @@ -218,6 +218,10 @@ export default defineConfig({ "pt-BR": "Regras do Linter", }, }, + { + label: "Linter sources", + link: "/linter/linter-sources", + } ], }, ], diff --git a/website/src/components/generated/Sources.astro b/website/src/components/generated/Sources.astro new file mode 100644 index 000000000000..c7f0453d4105 --- /dev/null +++ b/website/src/components/generated/Sources.astro @@ -0,0 +1,426 @@ +

ESlint rules to Biome

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ESLint Rule nameBiome Rule name
constructor-supernoInvalidConstructorSuper
curlyuseBlockStatements
default-case-lastuseDefaultSwitchClauseLast
default-param-lastuseDefaultParameterLast
dot-notationuseLiteralKeys
eqeqeqnoDoubleEquals
for-directionuseValidForDirection
getter-returnuseGetterReturn
no-async-promise-executornoAsyncPromiseExecutor
no-case-declarationsnoSwitchDeclarations
no-class-assignnoClassAssign
no-compare-neg-zeronoCompareNegZero
no-cond-assignnoAssignInExpressions
no-consolenoConsoleLog
no-const-assignnoConstAssign
no-constant-conditionnoConstantCondition
no-constructor-returnnoConstructorReturn
no-control-regexnoControlCharactersInRegex
no-debuggernoDebugger
no-dupe-argsnoDuplicateParameters
no-dupe-class-membersnoDuplicateClassMembers
no-dupe-keysnoDuplicateObjectKeys
no-duplicate-casenoDuplicateCase
no-else-returnnoUselessElse
no-empty-character-classnoEmptyCharacterClassInRegex
no-empty-patternnoEmptyPattern
no-ex-assignnoCatchAssign
no-extra-boolean-castnoExtraBooleanCast
no-extra-labelnoUselessLabel
no-fallthroughnoFallthroughSwitchClause
no-func-assignnoFunctionAssign
no-import-assignnoImportAssign
no-inner-declarationsnoInnerDeclarations
no-label-varnoLabelVar
no-labelsnoConfusingLabels
no-lonely-ifuseCollapsedElseIf
no-loss-of-precisionnoPrecisionLoss
no-negated-conditionnoNegationElse
no-new-native-nonconstructornoInvalidNewBuiltin
no-new-symbolnoNewSymbol
no-nonoctal-decimal-escapenoNonoctalDecimalEscape
no-obj-callsnoGlobalObjectCalls
no-param-reassignnoParameterAssign
no-prototype-builtinsnoPrototypeBuiltins
no-regex-spacesnoMultipleSpacesInRegularExpressionLiterals
no-restricted-globalsnoRestrictedGlobals
no-self-assignnoSelfAssign
no-self-comparenoSelfCompare
no-sequencesnoCommaOperator
no-setter-returnnoSetterReturn
no-shadow-restricted-namesnoShadowRestrictedNames
no-sparse-arraynoSparseArray
no-this-before-supernoUnreachableSuper
no-undefnoUndeclaredVariables
no-unreachablenoUnreachable
no-unsafe-finallynoUnsafeFinally
no-unsafe-negationnoUnsafeNegation
no-unsafe-optional-chainingnoUnsafeOptionalChaining
no-unused-labelsnoUnusedLabels
no-unused-varsnoUnusedVariables
no-useless-catchnoUselessCatch
no-useless-renamenoUselessRename
no-varnoVar
no-voidnoVoid
no-withnoWith
one-varuseSingleVarDeclarator
operator-assignmentuseShorthandAssign
prefer-arrow-callbackuseArrowFunction
prefer-constuseConst
prefer-exponentiation-operatoruseExponentiationOperator
prefer-numeric-literalsuseNumericLiterals
prefer-regex-literalsuseRegexLiterals
prefer-rest-paramsnoArguments
prefer-templateuseTemplate
require-yielduseYield
use-isnanuseIsNan
valid-typeofuseValidTypeof
+

typescript-eslint rules to Biome

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
typescript-eslint Rule nameBiome Rule name
array-typeuseShorthandArrayType
ban-typesnoBannedTypes
naming-conventionuseNamingConvention
no-empty-interfacenoEmptyInterface
no-explicit-anynoExplicitAny
no-extra-non-null-assertionnoExtraNonNullAssertion
no-extraneous-classnoStaticOnlyClass
no-inferrable-typesnoInferrableTypes
no-invalid-void-typenoConfusingVoidType
no-misused-newnoMisleadingInstantiator
no-namespacenoNamespace
no-non-null-assertionnoNonNullAssertion
no-redeclarenoRedeclare
no-this-aliasnoUselessThisAlias
no-unnecessary-type-constraintnoUselessTypeConstraint
no-unsafe-declaration-mergingnoUnsafeDeclarationMerging
no-useless-constructornoUselessConstructor
no-useless-empty-exportnoUselessEmptyExport
no-useless-template-literalsnoUnusedTemplateLiteral
parameter-propertiesnoParameterProperties
prefer-as-constuseAsConstAssertion
prefer-enum-initializersuseEnumInitializers
prefer-literal-enum-memberuseLiteralEnumMembers
prefer-namespace-keyworduseNamespaceKeyword
prefer-optional-chainuseOptionalChain
diff --git a/website/src/content/docs/linter/index.mdx b/website/src/content/docs/linter/index.mdx index ae411dea1868..5b5b678710d1 100644 --- a/website/src/content/docs/linter/index.mdx +++ b/website/src/content/docs/linter/index.mdx @@ -89,7 +89,6 @@ debugger; debugger; ``` - ## Configuration ### Enable a lint rule @@ -178,3 +177,7 @@ When they do _accept_ some, you can pass them by shaping the value of the rule d - `level` will indicate the severity of the diagnostic, valid values are: `"off"`, `"warn"` and `"error"`; - `options` will change based on the rule. + +## Migrating from other linters + +Many of Biome lint rules are inspired from other linters. If you want to migrate from other linters such as ESLint or `typescript-eslint`, check the [rule sources page](/linter/rule) diff --git a/website/src/content/docs/linter/linter-sources.mdx b/website/src/content/docs/linter/linter-sources.mdx new file mode 100644 index 000000000000..98d808874389 --- /dev/null +++ b/website/src/content/docs/linter/linter-sources.mdx @@ -0,0 +1,163 @@ +--- +title: Linter sources +description: A page that maps lint rules from other sources to Biome +--- + +## ESlint rules to Biome +| ESLint Rule name | Biome Rule name | +| ---- | ---- | +| [constructor-super](https://eslint.org/docs/latest/rules/constructor-super) |[noInvalidConstructorSuper](/linter/rules/no-invalid-constructor-super) | +| [curly](https://eslint.org/docs/latest/rules/curly) |[useBlockStatements](/linter/rules/use-block-statements) | +| [default-case-last](https://eslint.org/docs/latest/rules/default-case-last) |[useDefaultSwitchClauseLast](/linter/rules/use-default-switch-clause-last) | +| [default-param-last](https://eslint.org/docs/latest/rules/default-param-last) |[useDefaultParameterLast](/linter/rules/use-default-parameter-last) | +| [dot-notation](https://eslint.org/docs/latest/rules/dot-notation) |[useLiteralKeys](/linter/rules/use-literal-keys) | +| [eqeqeq](https://eslint.org/docs/latest/rules/eqeqeq) |[noDoubleEquals](/linter/rules/no-double-equals) | +| [for-direction](https://eslint.org/docs/latest/rules/for-direction) |[useValidForDirection](/linter/rules/use-valid-for-direction) | +| [getter-return](https://eslint.org/docs/latest/rules/getter-return) |[useGetterReturn](/linter/rules/use-getter-return) | +| [no-async-promise-executor](https://eslint.org/docs/latest/rules/no-async-promise-executor) |[noAsyncPromiseExecutor](/linter/rules/no-async-promise-executor) | +| [no-case-declarations](https://eslint.org/docs/latest/rules/no-case-declarations) |[noSwitchDeclarations](/linter/rules/no-switch-declarations) | +| [no-class-assign](https://eslint.org/docs/latest/rules/no-class-assign) |[noClassAssign](/linter/rules/no-class-assign) | +| [no-compare-neg-zero](https://eslint.org/docs/latest/rules/no-compare-neg-zero) |[noCompareNegZero](/linter/rules/no-compare-neg-zero) | +| [no-cond-assign](https://eslint.org/docs/latest/rules/no-cond-assign) |[noAssignInExpressions](/linter/rules/no-assign-in-expressions) | +| [no-console](https://eslint.org/docs/latest/rules/no-console) |[noConsoleLog](/linter/rules/no-console-log) | +| [no-const-assign](https://eslint.org/docs/latest/rules/no-const-assign) |[noConstAssign](/linter/rules/no-const-assign) | +| [no-constant-condition](https://eslint.org/docs/latest/rules/no-constant-condition) |[noConstantCondition](/linter/rules/no-constant-condition) | +| [no-constructor-return](https://eslint.org/docs/latest/rules/no-constructor-return) |[noConstructorReturn](/linter/rules/no-constructor-return) | +| [no-control-regex](https://eslint.org/docs/latest/rules/no-control-regex) |[noControlCharactersInRegex](/linter/rules/no-control-characters-in-regex) | +| [no-debugger](https://eslint.org/docs/latest/rules/no-debugger) |[noDebugger](/linter/rules/no-debugger) | +| [no-dupe-args](https://eslint.org/docs/latest/rules/no-dupe-args) |[noDuplicateParameters](/linter/rules/no-duplicate-parameters) | +| [no-dupe-class-members](https://eslint.org/docs/latest/rules/no-dupe-class-members) |[noDuplicateClassMembers](/linter/rules/no-duplicate-class-members) | +| [no-dupe-keys](https://eslint.org/docs/latest/rules/no-dupe-keys) |[noDuplicateObjectKeys](/linter/rules/no-duplicate-object-keys) | +| [no-duplicate-case](https://eslint.org/docs/latest/rules/no-duplicate-case) |[noDuplicateCase](/linter/rules/no-duplicate-case) | +| [no-else-return](https://eslint.org/docs/latest/rules/no-else-return) |[noUselessElse](/linter/rules/no-useless-else) | +| [no-empty-character-class](https://eslint.org/docs/latest/rules/no-empty-character-class) |[noEmptyCharacterClassInRegex](/linter/rules/no-empty-character-class-in-regex) | +| [no-empty-pattern](https://eslint.org/docs/latest/rules/no-empty-pattern) |[noEmptyPattern](/linter/rules/no-empty-pattern) | +| [no-ex-assign](https://eslint.org/docs/latest/rules/no-ex-assign) |[noCatchAssign](/linter/rules/no-catch-assign) | +| [no-extra-boolean-cast](https://eslint.org/docs/latest/rules/no-extra-boolean-cast) |[noExtraBooleanCast](/linter/rules/no-extra-boolean-cast) | +| [no-extra-label](https://eslint.org/docs/latest/rules/no-extra-label) |[noUselessLabel](/linter/rules/no-useless-label) | +| [no-fallthrough](https://eslint.org/docs/latest/rules/no-fallthrough) |[noFallthroughSwitchClause](/linter/rules/no-fallthrough-switch-clause) | +| [no-func-assign](https://eslint.org/docs/latest/rules/no-func-assign) |[noFunctionAssign](/linter/rules/no-function-assign) | +| [no-import-assign](https://eslint.org/docs/latest/rules/no-import-assign) |[noImportAssign](/linter/rules/no-import-assign) | +| [no-inner-declarations](https://eslint.org/docs/latest/rules/no-inner-declarations) |[noInnerDeclarations](/linter/rules/no-inner-declarations) | +| [no-label-var](https://eslint.org/docs/latest/rules/no-label-var) |[noLabelVar](/linter/rules/no-label-var) | +| [no-labels](https://eslint.org/docs/latest/rules/no-labels) |[noConfusingLabels](/linter/rules/no-confusing-labels) | +| [no-lonely-if](https://eslint.org/docs/latest/rules/no-lonely-if) |[useCollapsedElseIf](/linter/rules/use-collapsed-else-if) | +| [no-loss-of-precision](https://eslint.org/docs/latest/rules/no-loss-of-precision) |[noPrecisionLoss](/linter/rules/no-precision-loss) | +| [no-negated-condition](https://eslint.org/docs/latest/rules/no-negated-condition) |[noNegationElse](/linter/rules/no-negation-else) | +| [no-new-native-nonconstructor](https://eslint.org/docs/latest/rules/no-new-native-nonconstructor) |[noInvalidNewBuiltin](/linter/rules/no-invalid-new-builtin) | +| [no-new-symbol](https://eslint.org/docs/latest/rules/no-new-symbol) |[noNewSymbol](/linter/rules/no-new-symbol) | +| [no-nonoctal-decimal-escape](https://eslint.org/docs/latest/rules/no-nonoctal-decimal-escape) |[noNonoctalDecimalEscape](/linter/rules/no-nonoctal-decimal-escape) | +| [no-obj-calls](https://eslint.org/docs/latest/rules/no-obj-calls) |[noGlobalObjectCalls](/linter/rules/no-global-object-calls) | +| [no-param-reassign](https://eslint.org/docs/latest/rules/no-param-reassign) |[noParameterAssign](/linter/rules/no-parameter-assign) | +| [no-prototype-builtins](https://eslint.org/docs/latest/rules/no-prototype-builtins) |[noPrototypeBuiltins](/linter/rules/no-prototype-builtins) | +| [no-regex-spaces](https://eslint.org/docs/latest/rules/no-regex-spaces) |[noMultipleSpacesInRegularExpressionLiterals](/linter/rules/no-multiple-spaces-in-regular-expression-literals) | +| [no-restricted-globals](https://eslint.org/docs/latest/rules/no-restricted-globals) |[noRestrictedGlobals](/linter/rules/no-restricted-globals) | +| [no-self-assign](https://eslint.org/docs/latest/rules/no-self-assign) |[noSelfAssign](/linter/rules/no-self-assign) | +| [no-self-compare](https://eslint.org/docs/latest/rules/no-self-compare) |[noSelfCompare](/linter/rules/no-self-compare) | +| [no-sequences](https://eslint.org/docs/latest/rules/no-sequences) |[noCommaOperator](/linter/rules/no-comma-operator) | +| [no-setter-return](https://eslint.org/docs/latest/rules/no-setter-return) |[noSetterReturn](/linter/rules/no-setter-return) | +| [no-shadow-restricted-names](https://eslint.org/docs/latest/rules/no-shadow-restricted-names) |[noShadowRestrictedNames](/linter/rules/no-shadow-restricted-names) | +| [no-sparse-array](https://eslint.org/docs/latest/rules/no-sparse-array) |[noSparseArray](/linter/rules/no-sparse-array) | +| [no-this-before-super](https://eslint.org/docs/latest/rules/no-this-before-super) |[noUnreachableSuper](/linter/rules/no-unreachable-super) | +| [no-undef](https://eslint.org/docs/latest/rules/no-undef) |[noUndeclaredVariables](/linter/rules/no-undeclared-variables) | +| [no-unreachable](https://eslint.org/docs/latest/rules/no-unreachable) |[noUnreachable](/linter/rules/no-unreachable) | +| [no-unsafe-finally](https://eslint.org/docs/latest/rules/no-unsafe-finally) |[noUnsafeFinally](/linter/rules/no-unsafe-finally) | +| [no-unsafe-negation](https://eslint.org/docs/latest/rules/no-unsafe-negation) |[noUnsafeNegation](/linter/rules/no-unsafe-negation) | +| [no-unsafe-optional-chaining](https://eslint.org/docs/latest/rules/no-unsafe-optional-chaining) |[noUnsafeOptionalChaining](/linter/rules/no-unsafe-optional-chaining) | +| [no-unused-labels](https://eslint.org/docs/latest/rules/no-unused-labels) |[noUnusedLabels](/linter/rules/no-unused-labels) | +| [no-unused-vars](https://eslint.org/docs/latest/rules/no-unused-vars) |[noUnusedVariables](/linter/rules/no-unused-variables) | +| [no-useless-catch](https://eslint.org/docs/latest/rules/no-useless-catch) |[noUselessCatch](/linter/rules/no-useless-catch) | +| [no-useless-rename](https://eslint.org/docs/latest/rules/no-useless-rename) |[noUselessRename](/linter/rules/no-useless-rename) | +| [no-var](https://eslint.org/docs/latest/rules/no-var) |[noVar](/linter/rules/no-var) | +| [no-void](https://eslint.org/docs/latest/rules/no-void) |[noVoid](/linter/rules/no-void) | +| [no-with](https://eslint.org/docs/latest/rules/no-with) |[noWith](/linter/rules/no-with) | +| [one-var](https://eslint.org/docs/latest/rules/one-var) |[useSingleVarDeclarator](/linter/rules/use-single-var-declarator) | +| [operator-assignment](https://eslint.org/docs/latest/rules/operator-assignment) |[useShorthandAssign](/linter/rules/use-shorthand-assign) | +| [prefer-arrow-callback](https://eslint.org/docs/latest/rules/prefer-arrow-callback) |[useArrowFunction](/linter/rules/use-arrow-function) | +| [prefer-const](https://eslint.org/docs/latest/rules/prefer-const) |[useConst](/linter/rules/use-const) | +| [prefer-exponentiation-operator](https://eslint.org/docs/latest/rules/prefer-exponentiation-operator) |[useExponentiationOperator](/linter/rules/use-exponentiation-operator) | +| [prefer-numeric-literals](https://eslint.org/docs/latest/rules/prefer-numeric-literals) |[useNumericLiterals](/linter/rules/use-numeric-literals) | +| [prefer-regex-literals](https://eslint.org/docs/latest/rules/prefer-regex-literals) |[useRegexLiterals](/linter/rules/use-regex-literals) | +| [prefer-rest-params](https://eslint.org/docs/latest/rules/prefer-rest-params) |[noArguments](/linter/rules/no-arguments) | +| [prefer-template](https://eslint.org/docs/latest/rules/prefer-template) |[useTemplate](/linter/rules/use-template) | +| [require-yield](https://eslint.org/docs/latest/rules/require-yield) |[useYield](/linter/rules/use-yield) | +| [use-isnan](https://eslint.org/docs/latest/rules/use-isnan) |[useIsNan](/linter/rules/use-is-nan) | +| [valid-typeof](https://eslint.org/docs/latest/rules/valid-typeof) |[useValidTypeof](/linter/rules/use-valid-typeof) | +## `typescript-eslint` rules to Biome +| `typescript-eslint` rule name | Biome rule name | +| ---- | ---- | +| [array-type](https://typescript-eslint.io/rules/array-type) |[useShorthandArrayType](/linter/rules/use-shorthand-array-type) | +| [ban-types](https://typescript-eslint.io/rules/ban-types) |[noBannedTypes](/linter/rules/no-banned-types) | +| [naming-convention](https://typescript-eslint.io/rules/naming-convention) |[useNamingConvention](/linter/rules/use-naming-convention) | +| [no-empty-interface](https://typescript-eslint.io/rules/no-empty-interface) |[noEmptyInterface](/linter/rules/no-empty-interface) | +| [no-explicit-any](https://typescript-eslint.io/rules/no-explicit-any) |[noExplicitAny](/linter/rules/no-explicit-any) | +| [no-extra-non-null-assertion](https://typescript-eslint.io/rules/no-extra-non-null-assertion) |[noExtraNonNullAssertion](/linter/rules/no-extra-non-null-assertion) | +| [no-extraneous-class](https://typescript-eslint.io/rules/no-extraneous-class) |[noStaticOnlyClass](/linter/rules/no-static-only-class) | +| [no-inferrable-types](https://typescript-eslint.io/rules/no-inferrable-types) |[noInferrableTypes](/linter/rules/no-inferrable-types) | +| [no-invalid-void-type](https://typescript-eslint.io/rules/no-invalid-void-type) |[noConfusingVoidType](/linter/rules/no-confusing-void-type) | +| [no-misused-new](https://typescript-eslint.io/rules/no-misused-new) |[noMisleadingInstantiator](/linter/rules/no-misleading-instantiator) | +| [no-namespace](https://typescript-eslint.io/rules/no-namespace) |[noNamespace](/linter/rules/no-namespace) | +| [no-non-null-assertion](https://typescript-eslint.io/rules/no-non-null-assertion) |[noNonNullAssertion](/linter/rules/no-non-null-assertion) | +| [no-redeclare](https://typescript-eslint.io/rules/no-redeclare) |[noRedeclare](/linter/rules/no-redeclare) | +| [no-this-alias](https://typescript-eslint.io/rules/no-this-alias) |[noUselessThisAlias](/linter/rules/no-useless-this-alias) | +| [no-unnecessary-type-constraint](https://typescript-eslint.io/rules/no-unnecessary-type-constraint) |[noUselessTypeConstraint](/linter/rules/no-useless-type-constraint) | +| [no-unsafe-declaration-merging](https://typescript-eslint.io/rules/no-unsafe-declaration-merging) |[noUnsafeDeclarationMerging](/linter/rules/no-unsafe-declaration-merging) | +| [no-useless-constructor](https://typescript-eslint.io/rules/no-useless-constructor) |[noUselessConstructor](/linter/rules/no-useless-constructor) | +| [no-useless-empty-export](https://typescript-eslint.io/rules/no-useless-empty-export) |[noUselessEmptyExport](/linter/rules/no-useless-empty-export) | +| [no-useless-template-literals](https://typescript-eslint.io/rules/no-useless-template-literals) |[noUnusedTemplateLiteral](/linter/rules/no-unused-template-literal) | +| [parameter-properties](https://typescript-eslint.io/rules/parameter-properties) |[noParameterProperties](/linter/rules/no-parameter-properties) | +| [prefer-as-const](https://typescript-eslint.io/rules/prefer-as-const) |[useAsConstAssertion](/linter/rules/use-as-const-assertion) | +| [prefer-enum-initializers](https://typescript-eslint.io/rules/prefer-enum-initializers) |[useEnumInitializers](/linter/rules/use-enum-initializers) | +| [prefer-literal-enum-member](https://typescript-eslint.io/rules/prefer-literal-enum-member) |[useLiteralEnumMembers](/linter/rules/use-literal-enum-members) | +| [prefer-namespace-keyword](https://typescript-eslint.io/rules/prefer-namespace-keyword) |[useNamespaceKeyword](/linter/rules/use-namespace-keyword) | +| [prefer-optional-chain](https://typescript-eslint.io/rules/prefer-optional-chain) |[useOptionalChain](/linter/rules/use-optional-chain) | +## ESlint plugin rules to Biome +| Plugin name | Plugin rule name | Biome rule name | +| ---- | ---- | --- | +| `eslint-plugin-jsx-a11y` | [alt-text](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/alt-text.md) |[useAltText](/linter/rules/use-alt-text) | +| `eslint-plugin-jsx-a11y` | [anchor-has-content](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/anchor-has-content.md) |[useAnchorContent](/linter/rules/use-anchor-content) | +| `eslint-plugin-jsx-a11y` | [anchor-is-valid](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/anchor-is-valid.md) |[useValidAnchor](/linter/rules/use-valid-anchor) | +| `eslint-plugin-jsx-a11y` | [aria-activedescendant-has-tabindex](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-activedescendant-has-tabindex.md) |[useAriaActivedescendantWithTabindex](/linter/rules/use-aria-activedescendant-with-tabindex) | +| `eslint-plugin-jsx-a11y` | [aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-props.md) |[useValidAriaProps](/linter/rules/use-valid-aria-props) | +| `eslint-plugin-jsx-a11y` | [aria-proptypes](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-proptypes.md) |[useValidAriaValues](/linter/rules/use-valid-aria-values) | +| `eslint-plugin-jsx-a11y` | [aria-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-role.md) |[useValidAriaRole](/linter/rules/use-valid-aria-role) | +| `eslint-plugin-jsx-a11y` | [aria-unsupported-elements](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-unsupported-elements.md) |[noAriaUnsupportedElements](/linter/rules/no-aria-unsupported-elements) | +| `eslint-plugin-react` | [button-has-type](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/button-has-type.md) |[useButtonType](/linter/rules/use-button-type) | +| `eslint-plugin-jsx-a11y` | [click-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/click-events-have-key-events.md) |[useKeyWithClickEvents](/linter/rules/use-key-with-click-events) | +| `eslint-plugin-sonarjs` | [cognitive-complexity](https://github.com/SonarSource/eslint-plugin-sonarjs/blob/HEAD/docs/rules/cognitive-complexity.md) |[noExcessiveCognitiveComplexity](/linter/rules/no-excessive-cognitive-complexity) | +| `eslint-plugin-react-hooks` | [exhaustive-deps](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md) |[useExhaustiveDependencies](/linter/rules/use-exhaustive-dependencies) | +| `eslint-plugin-jsx-a11y` | [heading-has-content](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/heading-has-content.md) |[useHeadingContent](/linter/rules/use-heading-content) | +| `eslint-plugin-jsx-a11y` | [html-has-lang](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/html-has-lang.md) |[useHtmlLang](/linter/rules/use-html-lang) | +| `eslint-plugin-jsx-a11y` | [iframe-has-title](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/iframe-has-title.md) |[useIframeTitle](/linter/rules/use-iframe-title) | +| `eslint-plugin-react` | [jsx-boolean-value](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-boolean-value.md) |[noImplicitBoolean](/linter/rules/no-implicit-boolean) | +| `eslint-plugin-react` | [jsx-fragments](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-fragments.md) |[useFragmentSyntax](/linter/rules/use-fragment-syntax) | +| `eslint-plugin-react` | [jsx-no-comment-textnodes](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-comment-textnodes.md) |[noCommentText](/linter/rules/no-comment-text) | +| `eslint-plugin-react` | [jsx-no-duplicate-props](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-duplicate-props.md) |[noDuplicateJsxProps](/linter/rules/no-duplicate-jsx-props) | +| `eslint-plugin-react` | [jsx-no-target-blank](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-target-blank.md) |[noBlankTarget](/linter/rules/no-blank-target) | +| `eslint-plugin-react` | [jsx-no-useless-fragment](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-useless-fragment.md) |[noUselessFragments](/linter/rules/no-useless-fragments) | +| `eslint-plugin-stylistic` | [jsx-self-closing-comp](https://eslint.style/rules/default/jsx-self-closing-comp) |[useSelfClosingElements](/linter/rules/use-self-closing-elements) | +| `eslint-plugin-jsx-a11y` | [lang](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/lang.md) |[useValidLang](/linter/rules/use-valid-lang) | +| `eslint-plugin-jsx-a11y` | [media-has-caption](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/media-has-caption.md) |[useMediaCaption](/linter/rules/use-media-caption) | +| `eslint-plugin-jsx-a11y` | [mouse-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/mouse-events-have-key-events.md) |[useKeyWithMouseEvents](/linter/rules/use-key-with-mouse-events) | +| `eslint-plugin-jsx-a11y` | [no-access-key](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-access-key.md) |[noAccessKey](/linter/rules/no-access-key) | +| `eslint-plugin-jsx-a11y` | [no-aria-hidden-on-focusable](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-aria-hidden-on-focusable.md) |[noAriaHiddenOnFocusable](/linter/rules/no-aria-hidden-on-focusable) | +| `eslint-plugin-unicorn` | [no-array-for-each](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-array-for-each.md) |[noForEach](/linter/rules/no-for-each) | +| `eslint-plugin-react` | [no-array-index-key](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-array-index-key.md) |[noArrayIndexKey](/linter/rules/no-array-index-key) | +| `eslint-plugin-jsx-a11y` | [no-autofocus](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-autofocus.md) |[noAutofocus](/linter/rules/no-autofocus) | +| `eslint-plugin-react` | [no-children-prop](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-children-prop.md) |[noChildrenProp](/linter/rules/no-children-prop) | +| `eslint-plugin-react` | [no-danger](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger.md) |[noDangerouslySetInnerHtmlWithChildren](/linter/rules/no-dangerously-set-inner-html-with-children) | +| `eslint-plugin-react` | [no-danger-with-children](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger-with-children.md) |[noDangerouslySetInnerHtml](/linter/rules/no-dangerously-set-inner-html) | +| `eslint-plugin-import` | [no-default-export](https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-default-export.md) |[noDefaultExport](/linter/rules/no-default-export) | +| `eslint-plugin-jsx-a11y` | [no-distracting-elements](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-distracting-elements.md) |[noDistractingElements](/linter/rules/no-distracting-elements) | +| `eslint-plugin-unicorn` | [no-instanceof-array](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-instanceof-array.md) |[useIsArray](/linter/rules/use-is-array) | +| `eslint-plugin-jsx-a11y` | [no-interactive-element-to-noninteractive-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-interactive-element-to-noninteractive-role.md) |[noInteractiveElementToNoninteractiveRole](/linter/rules/no-interactive-element-to-noninteractive-role) | +| `eslint-plugin-jsx-a11y` | [no-noninteractive-element-to-interactive-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-noninteractive-element-to-interactive-role.md) |[noNoninteractiveElementToInteractiveRole](/linter/rules/no-noninteractive-element-to-interactive-role) | +| `eslint-plugin-jsx-a11y` | [no-noninteractive-tabindex](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-noninteractive-tabindex.md) |[noNoninteractiveTabindex](/linter/rules/no-noninteractive-tabindex) | +| `eslint-plugin-jsx-a11y` | [no-redundant-roles](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-redundant-roles.md) |[noRedundantRoles](/linter/rules/no-redundant-roles) | +| `eslint-plugin-unicorn` | [no-useless-switch-case](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-useless-switch-case.md) |[noUselessSwitchCase](/linter/rules/no-useless-switch-case) | +| `eslint-plugin-unicorn` | [prefer-array-flat-map](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-array-flat-map.md) |[useFlatMap](/linter/rules/use-flat-map) | +| `eslint-plugin-jsx-a11y` | [role-has-required-aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/role-has-required-aria-props.md) |[useAriaPropsForRole](/linter/rules/use-aria-props-for-role) | +| `eslint-plugin-react-hooks` | [rules-of-hooks](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md) |[useHookAtTopLevel](/linter/rules/use-hook-at-top-level) | +| `eslint-plugin-jsx-a11y` | [scope](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/scope.md) |[noHeaderScope](/linter/rules/no-header-scope) | +| `eslint-plugin-jsx-a11y` | [tabindex-no-positive](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/tabindex-no-positive.md) |[noPositiveTabindex](/linter/rules/no-positive-tabindex) | +| `eslint-plugin-react` | [void-dom-elements-no-children](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/void-dom-elements-no-children.md) |[noVoidElementsWithChildren](/linter/rules/no-void-elements-with-children) | diff --git a/website/src/content/docs/linter/rule-sources.mdx b/website/src/content/docs/linter/rule-sources.mdx new file mode 100644 index 000000000000..d21c2188ac2b --- /dev/null +++ b/website/src/content/docs/linter/rule-sources.mdx @@ -0,0 +1,163 @@ +--- +title: Rules sources +description: A page that maps lint rules from other sources to Biome +--- + +## ESlint rules to Biome + | ESLint Rule name | Biome Rule name | + | ---- | ---- | +| [constructor-super](https://eslint.org/docs/latest/rules/constructor-super) |[noInvalidConstructorSuper](/linter/rules/no-invalid-constructor-super) | +| [curly](https://eslint.org/docs/latest/rules/curly) |[useBlockStatements](/linter/rules/use-block-statements) | +| [default-case-last](https://eslint.org/docs/latest/rules/default-case-last) |[useDefaultSwitchClauseLast](/linter/rules/use-default-switch-clause-last) | +| [default-param-last](https://eslint.org/docs/latest/rules/default-param-last) |[useDefaultParameterLast](/linter/rules/use-default-parameter-last) | +| [dot-notation](https://eslint.org/docs/latest/rules/dot-notation) |[useLiteralKeys](/linter/rules/use-literal-keys) | +| [eqeqeq](https://eslint.org/docs/latest/rules/eqeqeq) |[noDoubleEquals](/linter/rules/no-double-equals) | +| [for-direction](https://eslint.org/docs/latest/rules/for-direction) |[useValidForDirection](/linter/rules/use-valid-for-direction) | +| [getter-return](https://eslint.org/docs/latest/rules/getter-return) |[useGetterReturn](/linter/rules/use-getter-return) | +| [no-async-promise-executor](https://eslint.org/docs/latest/rules/no-async-promise-executor) |[noAsyncPromiseExecutor](/linter/rules/no-async-promise-executor) | +| [no-case-declarations](https://eslint.org/docs/latest/rules/no-case-declarations) |[noSwitchDeclarations](/linter/rules/no-switch-declarations) | +| [no-class-assign](https://eslint.org/docs/latest/rules/no-class-assign) |[noClassAssign](/linter/rules/no-class-assign) | +| [no-compare-neg-zero](https://eslint.org/docs/latest/rules/no-compare-neg-zero) |[noCompareNegZero](/linter/rules/no-compare-neg-zero) | +| [no-cond-assign](https://eslint.org/docs/latest/rules/no-cond-assign) |[noAssignInExpressions](/linter/rules/no-assign-in-expressions) | +| [no-console](https://eslint.org/docs/latest/rules/no-console) |[noConsoleLog](/linter/rules/no-console-log) | +| [no-const-assign](https://eslint.org/docs/latest/rules/no-const-assign) |[noConstAssign](/linter/rules/no-const-assign) | +| [no-constant-condition](https://eslint.org/docs/latest/rules/no-constant-condition) |[noConstantCondition](/linter/rules/no-constant-condition) | +| [no-constructor-return](https://eslint.org/docs/latest/rules/no-constructor-return) |[noConstructorReturn](/linter/rules/no-constructor-return) | +| [no-control-regex](https://eslint.org/docs/latest/rules/no-control-regex) |[noControlCharactersInRegex](/linter/rules/no-control-characters-in-regex) | +| [no-debugger](https://eslint.org/docs/latest/rules/no-debugger) |[noDebugger](/linter/rules/no-debugger) | +| [no-dupe-args](https://eslint.org/docs/latest/rules/no-dupe-args) |[noDuplicateParameters](/linter/rules/no-duplicate-parameters) | +| [no-dupe-class-members](https://eslint.org/docs/latest/rules/no-dupe-class-members) |[noDuplicateClassMembers](/linter/rules/no-duplicate-class-members) | +| [no-dupe-keys](https://eslint.org/docs/latest/rules/no-dupe-keys) |[noDuplicateObjectKeys](/linter/rules/no-duplicate-object-keys) | +| [no-duplicate-case](https://eslint.org/docs/latest/rules/no-duplicate-case) |[noDuplicateCase](/linter/rules/no-duplicate-case) | +| [no-else-return](https://eslint.org/docs/latest/rules/no-else-return) |[noUselessElse](/linter/rules/no-useless-else) | +| [no-empty-character-class](https://eslint.org/docs/latest/rules/no-empty-character-class) |[noEmptyCharacterClassInRegex](/linter/rules/no-empty-character-class-in-regex) | +| [no-empty-pattern](https://eslint.org/docs/latest/rules/no-empty-pattern) |[noEmptyPattern](/linter/rules/no-empty-pattern) | +| [no-ex-assign](https://eslint.org/docs/latest/rules/no-ex-assign) |[noCatchAssign](/linter/rules/no-catch-assign) | +| [no-extra-boolean-cast](https://eslint.org/docs/latest/rules/no-extra-boolean-cast) |[noExtraBooleanCast](/linter/rules/no-extra-boolean-cast) | +| [no-extra-label](https://eslint.org/docs/latest/rules/no-extra-label) |[noUselessLabel](/linter/rules/no-useless-label) | +| [no-fallthrough](https://eslint.org/docs/latest/rules/no-fallthrough) |[noFallthroughSwitchClause](/linter/rules/no-fallthrough-switch-clause) | +| [no-func-assign](https://eslint.org/docs/latest/rules/no-func-assign) |[noFunctionAssign](/linter/rules/no-function-assign) | +| [no-import-assign](https://eslint.org/docs/latest/rules/no-import-assign) |[noImportAssign](/linter/rules/no-import-assign) | +| [no-inner-declarations](https://eslint.org/docs/latest/rules/no-inner-declarations) |[noInnerDeclarations](/linter/rules/no-inner-declarations) | +| [no-label-var](https://eslint.org/docs/latest/rules/no-label-var) |[noLabelVar](/linter/rules/no-label-var) | +| [no-labels](https://eslint.org/docs/latest/rules/no-labels) |[noConfusingLabels](/linter/rules/no-confusing-labels) | +| [no-lonely-if](https://eslint.org/docs/latest/rules/no-lonely-if) |[useCollapsedElseIf](/linter/rules/use-collapsed-else-if) | +| [no-loss-of-precision](https://eslint.org/docs/latest/rules/no-loss-of-precision) |[noPrecisionLoss](/linter/rules/no-precision-loss) | +| [no-negated-condition](https://eslint.org/docs/latest/rules/no-negated-condition) |[noNegationElse](/linter/rules/no-negation-else) | +| [no-new-native-nonconstructor](https://eslint.org/docs/latest/rules/no-new-native-nonconstructor) |[noInvalidNewBuiltin](/linter/rules/no-invalid-new-builtin) | +| [no-new-symbol](https://eslint.org/docs/latest/rules/no-new-symbol) |[noNewSymbol](/linter/rules/no-new-symbol) | +| [no-nonoctal-decimal-escape](https://eslint.org/docs/latest/rules/no-nonoctal-decimal-escape) |[noNonoctalDecimalEscape](/linter/rules/no-nonoctal-decimal-escape) | +| [no-obj-calls](https://eslint.org/docs/latest/rules/no-obj-calls) |[noGlobalObjectCalls](/linter/rules/no-global-object-calls) | +| [no-param-reassign](https://eslint.org/docs/latest/rules/no-param-reassign) |[noParameterAssign](/linter/rules/no-parameter-assign) | +| [no-prototype-builtins](https://eslint.org/docs/latest/rules/no-prototype-builtins) |[noPrototypeBuiltins](/linter/rules/no-prototype-builtins) | +| [no-regex-spaces](https://eslint.org/docs/latest/rules/no-regex-spaces) |[noMultipleSpacesInRegularExpressionLiterals](/linter/rules/no-multiple-spaces-in-regular-expression-literals) | +| [no-restricted-globals](https://eslint.org/docs/latest/rules/no-restricted-globals) |[noRestrictedGlobals](/linter/rules/no-restricted-globals) | +| [no-self-assign](https://eslint.org/docs/latest/rules/no-self-assign) |[noSelfAssign](/linter/rules/no-self-assign) | +| [no-self-compare](https://eslint.org/docs/latest/rules/no-self-compare) |[noSelfCompare](/linter/rules/no-self-compare) | +| [no-sequences](https://eslint.org/docs/latest/rules/no-sequences) |[noCommaOperator](/linter/rules/no-comma-operator) | +| [no-setter-return](https://eslint.org/docs/latest/rules/no-setter-return) |[noSetterReturn](/linter/rules/no-setter-return) | +| [no-shadow-restricted-names](https://eslint.org/docs/latest/rules/no-shadow-restricted-names) |[noShadowRestrictedNames](/linter/rules/no-shadow-restricted-names) | +| [no-sparse-array](https://eslint.org/docs/latest/rules/no-sparse-array) |[noSparseArray](/linter/rules/no-sparse-array) | +| [no-this-before-super](https://eslint.org/docs/latest/rules/no-this-before-super) |[noUnreachableSuper](/linter/rules/no-unreachable-super) | +| [no-undef](https://eslint.org/docs/latest/rules/no-undef) |[noUndeclaredVariables](/linter/rules/no-undeclared-variables) | +| [no-unreachable](https://eslint.org/docs/latest/rules/no-unreachable) |[noUnreachable](/linter/rules/no-unreachable) | +| [no-unsafe-finally](https://eslint.org/docs/latest/rules/no-unsafe-finally) |[noUnsafeFinally](/linter/rules/no-unsafe-finally) | +| [no-unsafe-negation](https://eslint.org/docs/latest/rules/no-unsafe-negation) |[noUnsafeNegation](/linter/rules/no-unsafe-negation) | +| [no-unsafe-optional-chaining](https://eslint.org/docs/latest/rules/no-unsafe-optional-chaining) |[noUnsafeOptionalChaining](/linter/rules/no-unsafe-optional-chaining) | +| [no-unused-labels](https://eslint.org/docs/latest/rules/no-unused-labels) |[noUnusedLabels](/linter/rules/no-unused-labels) | +| [no-unused-vars](https://eslint.org/docs/latest/rules/no-unused-vars) |[noUnusedVariables](/linter/rules/no-unused-variables) | +| [no-useless-catch](https://eslint.org/docs/latest/rules/no-useless-catch) |[noUselessCatch](/linter/rules/no-useless-catch) | +| [no-useless-rename](https://eslint.org/docs/latest/rules/no-useless-rename) |[noUselessRename](/linter/rules/no-useless-rename) | +| [no-var](https://eslint.org/docs/latest/rules/no-var) |[noVar](/linter/rules/no-var) | +| [no-void](https://eslint.org/docs/latest/rules/no-void) |[noVoid](/linter/rules/no-void) | +| [no-with](https://eslint.org/docs/latest/rules/no-with) |[noWith](/linter/rules/no-with) | +| [one-var](https://eslint.org/docs/latest/rules/one-var) |[useSingleVarDeclarator](/linter/rules/use-single-var-declarator) | +| [operator-assignment](https://eslint.org/docs/latest/rules/operator-assignment) |[useShorthandAssign](/linter/rules/use-shorthand-assign) | +| [prefer-arrow-callback](https://eslint.org/docs/latest/rules/prefer-arrow-callback) |[useArrowFunction](/linter/rules/use-arrow-function) | +| [prefer-const](https://eslint.org/docs/latest/rules/prefer-const) |[useConst](/linter/rules/use-const) | +| [prefer-exponentiation-operator](https://eslint.org/docs/latest/rules/prefer-exponentiation-operator) |[useExponentiationOperator](/linter/rules/use-exponentiation-operator) | +| [prefer-numeric-literals](https://eslint.org/docs/latest/rules/prefer-numeric-literals) |[useNumericLiterals](/linter/rules/use-numeric-literals) | +| [prefer-regex-literals](https://eslint.org/docs/latest/rules/prefer-regex-literals) |[useRegexLiterals](/linter/rules/use-regex-literals) | +| [prefer-rest-params](https://eslint.org/docs/latest/rules/prefer-rest-params) |[noArguments](/linter/rules/no-arguments) | +| [prefer-template](https://eslint.org/docs/latest/rules/prefer-template) |[useTemplate](/linter/rules/use-template) | +| [require-yield](https://eslint.org/docs/latest/rules/require-yield) |[useYield](/linter/rules/use-yield) | +| [use-isnan](https://eslint.org/docs/latest/rules/use-isnan) |[useIsNan](/linter/rules/use-is-nan) | +| [valid-typeof](https://eslint.org/docs/latest/rules/valid-typeof) |[useValidTypeof](/linter/rules/use-valid-typeof) | +## `typescript-eslint` rules to Biome + | `typescript-eslint` rule name | Biome rule name | + | ---- | ---- | +| [array-type](https://typescript-eslint.io/rules/array-type) |[useShorthandArrayType](/linter/rules/use-shorthand-array-type) | +| [ban-types](https://typescript-eslint.io/rules/ban-types) |[noBannedTypes](/linter/rules/no-banned-types) | +| [naming-convention](https://typescript-eslint.io/rules/naming-convention) |[useNamingConvention](/linter/rules/use-naming-convention) | +| [no-empty-interface](https://typescript-eslint.io/rules/no-empty-interface) |[noEmptyInterface](/linter/rules/no-empty-interface) | +| [no-explicit-any](https://typescript-eslint.io/rules/no-explicit-any) |[noExplicitAny](/linter/rules/no-explicit-any) | +| [no-extra-non-null-assertion](https://typescript-eslint.io/rules/no-extra-non-null-assertion) |[noExtraNonNullAssertion](/linter/rules/no-extra-non-null-assertion) | +| [no-extraneous-class](https://typescript-eslint.io/rules/no-extraneous-class) |[noStaticOnlyClass](/linter/rules/no-static-only-class) | +| [no-inferrable-types](https://typescript-eslint.io/rules/no-inferrable-types) |[noInferrableTypes](/linter/rules/no-inferrable-types) | +| [no-invalid-void-type](https://typescript-eslint.io/rules/no-invalid-void-type) |[noConfusingVoidType](/linter/rules/no-confusing-void-type) | +| [no-misused-new](https://typescript-eslint.io/rules/no-misused-new) |[noMisleadingInstantiator](/linter/rules/no-misleading-instantiator) | +| [no-namespace](https://typescript-eslint.io/rules/no-namespace) |[noNamespace](/linter/rules/no-namespace) | +| [no-non-null-assertion](https://typescript-eslint.io/rules/no-non-null-assertion) |[noNonNullAssertion](/linter/rules/no-non-null-assertion) | +| [no-redeclare](https://typescript-eslint.io/rules/no-redeclare) |[noRedeclare](/linter/rules/no-redeclare) | +| [no-this-alias](https://typescript-eslint.io/rules/no-this-alias) |[noUselessThisAlias](/linter/rules/no-useless-this-alias) | +| [no-unnecessary-type-constraint](https://typescript-eslint.io/rules/no-unnecessary-type-constraint) |[noUselessTypeConstraint](/linter/rules/no-useless-type-constraint) | +| [no-unsafe-declaration-merging](https://typescript-eslint.io/rules/no-unsafe-declaration-merging) |[noUnsafeDeclarationMerging](/linter/rules/no-unsafe-declaration-merging) | +| [no-useless-constructor](https://typescript-eslint.io/rules/no-useless-constructor) |[noUselessConstructor](/linter/rules/no-useless-constructor) | +| [no-useless-empty-export](https://typescript-eslint.io/rules/no-useless-empty-export) |[noUselessEmptyExport](/linter/rules/no-useless-empty-export) | +| [no-useless-template-literals](https://typescript-eslint.io/rules/no-useless-template-literals) |[noUnusedTemplateLiteral](/linter/rules/no-unused-template-literal) | +| [parameter-properties](https://typescript-eslint.io/rules/parameter-properties) |[noParameterProperties](/linter/rules/no-parameter-properties) | +| [prefer-as-const](https://typescript-eslint.io/rules/prefer-as-const) |[useAsConstAssertion](/linter/rules/use-as-const-assertion) | +| [prefer-enum-initializers](https://typescript-eslint.io/rules/prefer-enum-initializers) |[useEnumInitializers](/linter/rules/use-enum-initializers) | +| [prefer-literal-enum-member](https://typescript-eslint.io/rules/prefer-literal-enum-member) |[useLiteralEnumMembers](/linter/rules/use-literal-enum-members) | +| [prefer-namespace-keyword](https://typescript-eslint.io/rules/prefer-namespace-keyword) |[useNamespaceKeyword](/linter/rules/use-namespace-keyword) | +| [prefer-optional-chain](https://typescript-eslint.io/rules/prefer-optional-chain) |[useOptionalChain](/linter/rules/use-optional-chain) | +## ESlint plugin rules to Biome + | Plugin name | Plugin rule name | Biome rule name | + | ---- | ---- | --- | +| `eslint-plugin-import` | [no-default-export](https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-default-export.md) |[noDefaultExport](/linter/rules/no-default-export) | +| `eslint-plugin-jsx-a11y` | [alt-text](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/alt-text.md) |[useAltText](/linter/rules/use-alt-text) | +| `eslint-plugin-jsx-a11y` | [anchor-has-content](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/anchor-has-content.md) |[useAnchorContent](/linter/rules/use-anchor-content) | +| `eslint-plugin-jsx-a11y` | [anchor-is-valid](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/anchor-is-valid.md) |[useValidAnchor](/linter/rules/use-valid-anchor) | +| `eslint-plugin-jsx-a11y` | [aria-activedescendant-has-tabindex](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-activedescendant-has-tabindex.md) |[useAriaActivedescendantWithTabindex](/linter/rules/use-aria-activedescendant-with-tabindex) | +| `eslint-plugin-jsx-a11y` | [aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-props.md) |[useValidAriaProps](/linter/rules/use-valid-aria-props) | +| `eslint-plugin-jsx-a11y` | [aria-proptypes](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-proptypes.md) |[useValidAriaValues](/linter/rules/use-valid-aria-values) | +| `eslint-plugin-jsx-a11y` | [aria-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-role.md) |[useValidAriaRole](/linter/rules/use-valid-aria-role) | +| `eslint-plugin-jsx-a11y` | [aria-unsupported-elements](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-unsupported-elements.md) |[noAriaUnsupportedElements](/linter/rules/no-aria-unsupported-elements) | +| `eslint-plugin-jsx-a11y` | [click-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/click-events-have-key-events.md) |[useKeyWithClickEvents](/linter/rules/use-key-with-click-events) | +| `eslint-plugin-jsx-a11y` | [heading-has-content](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/heading-has-content.md) |[useHeadingContent](/linter/rules/use-heading-content) | +| `eslint-plugin-jsx-a11y` | [html-has-lang](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/html-has-lang.md) |[useHtmlLang](/linter/rules/use-html-lang) | +| `eslint-plugin-jsx-a11y` | [iframe-has-title](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/iframe-has-title.md) |[useIframeTitle](/linter/rules/use-iframe-title) | +| `eslint-plugin-jsx-a11y` | [lang](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/lang.md) |[useValidLang](/linter/rules/use-valid-lang) | +| `eslint-plugin-jsx-a11y` | [media-has-caption](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/media-has-caption.md) |[useMediaCaption](/linter/rules/use-media-caption) | +| `eslint-plugin-jsx-a11y` | [mouse-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/mouse-events-have-key-events.md) |[useKeyWithMouseEvents](/linter/rules/use-key-with-mouse-events) | +| `eslint-plugin-jsx-a11y` | [no-access-key](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-access-key.md) |[noAccessKey](/linter/rules/no-access-key) | +| `eslint-plugin-jsx-a11y` | [no-aria-hidden-on-focusable](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-aria-hidden-on-focusable.md) |[noAriaHiddenOnFocusable](/linter/rules/no-aria-hidden-on-focusable) | +| `eslint-plugin-jsx-a11y` | [no-autofocus](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-autofocus.md) |[noAutofocus](/linter/rules/no-autofocus) | +| `eslint-plugin-jsx-a11y` | [no-distracting-elements](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-distracting-elements.md) |[noDistractingElements](/linter/rules/no-distracting-elements) | +| `eslint-plugin-jsx-a11y` | [no-interactive-element-to-noninteractive-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-interactive-element-to-noninteractive-role.md) |[noInteractiveElementToNoninteractiveRole](/linter/rules/no-interactive-element-to-noninteractive-role) | +| `eslint-plugin-jsx-a11y` | [no-noninteractive-element-to-interactive-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-noninteractive-element-to-interactive-role.md) |[noNoninteractiveElementToInteractiveRole](/linter/rules/no-noninteractive-element-to-interactive-role) | +| `eslint-plugin-jsx-a11y` | [no-noninteractive-tabindex](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-noninteractive-tabindex.md) |[noNoninteractiveTabindex](/linter/rules/no-noninteractive-tabindex) | +| `eslint-plugin-jsx-a11y` | [no-redundant-roles](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-redundant-roles.md) |[noRedundantRoles](/linter/rules/no-redundant-roles) | +| `eslint-plugin-jsx-a11y` | [role-has-required-aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/role-has-required-aria-props.md) |[useAriaPropsForRole](/linter/rules/use-aria-props-for-role) | +| `eslint-plugin-jsx-a11y` | [scope](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/scope.md) |[noHeaderScope](/linter/rules/no-header-scope) | +| `eslint-plugin-jsx-a11y` | [tabindex-no-positive](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/tabindex-no-positive.md) |[noPositiveTabindex](/linter/rules/no-positive-tabindex) | +| `eslint-plugin-react` | [button-has-type](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/button-has-type.md) |[useButtonType](/linter/rules/use-button-type) | +| `eslint-plugin-react` | [jsx-boolean-value](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-boolean-value.md) |[noImplicitBoolean](/linter/rules/no-implicit-boolean) | +| `eslint-plugin-react` | [jsx-fragments](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-fragments.md) |[useFragmentSyntax](/linter/rules/use-fragment-syntax) | +| `eslint-plugin-react` | [jsx-no-comment-textnodes](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-comment-textnodes.md) |[noCommentText](/linter/rules/no-comment-text) | +| `eslint-plugin-react` | [jsx-no-duplicate-props](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-duplicate-props.md) |[noDuplicateJsxProps](/linter/rules/no-duplicate-jsx-props) | +| `eslint-plugin-react` | [jsx-no-target-blank](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-target-blank.md) |[noBlankTarget](/linter/rules/no-blank-target) | +| `eslint-plugin-react` | [jsx-no-useless-fragment](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-useless-fragment.md) |[noUselessFragments](/linter/rules/no-useless-fragments) | +| `eslint-plugin-react` | [no-array-index-key](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-array-index-key.md) |[noArrayIndexKey](/linter/rules/no-array-index-key) | +| `eslint-plugin-react` | [no-children-prop](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-children-prop.md) |[noChildrenProp](/linter/rules/no-children-prop) | +| `eslint-plugin-react` | [no-danger](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger.md) |[noDangerouslySetInnerHtmlWithChildren](/linter/rules/no-dangerously-set-inner-html-with-children) | +| `eslint-plugin-react` | [no-danger-with-children](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger-with-children.md) |[noDangerouslySetInnerHtml](/linter/rules/no-dangerously-set-inner-html) | +| `eslint-plugin-react` | [void-dom-elements-no-children](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/void-dom-elements-no-children.md) |[noVoidElementsWithChildren](/linter/rules/no-void-elements-with-children) | +| `eslint-plugin-react-hooks` | [exhaustive-deps](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md) |[useExhaustiveDependencies](/linter/rules/use-exhaustive-dependencies) | +| `eslint-plugin-react-hooks` | [rules-of-hooks](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md) |[useHookAtTopLevel](/linter/rules/use-hook-at-top-level) | +| `eslint-plugin-sonarjs` | [cognitive-complexity](https://github.com/SonarSource/eslint-plugin-sonarjs/blob/HEAD/docs/rules/cognitive-complexity.md) |[noExcessiveCognitiveComplexity](/linter/rules/no-excessive-cognitive-complexity) | +| `eslint-plugin-stylistic` | [jsx-self-closing-comp](https://eslint.style/rules/default/jsx-self-closing-comp) |[useSelfClosingElements](/linter/rules/use-self-closing-elements) | +| `eslint-plugin-unicorn` | [no-array-for-each](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-array-for-each.md) |[noForEach](/linter/rules/no-for-each) | +| `eslint-plugin-unicorn` | [no-instanceof-array](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-instanceof-array.md) |[useIsArray](/linter/rules/use-is-array) | +| `eslint-plugin-unicorn` | [no-useless-switch-case](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-useless-switch-case.md) |[noUselessSwitchCase](/linter/rules/no-useless-switch-case) | +| `eslint-plugin-unicorn` | [prefer-array-flat-map](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-array-flat-map.md) |[useFlatMap](/linter/rules/use-flat-map) | diff --git a/xtask/lintdoc/src/main.rs b/xtask/lintdoc/src/main.rs index 8de485f7eb2a..21916a29113c 100644 --- a/xtask/lintdoc/src/main.rs +++ b/xtask/lintdoc/src/main.rs @@ -1,3 +1,6 @@ +mod rules_sources; + +use crate::rules_sources::generate_rule_sources; use biome_analyze::{ AnalysisFilter, AnalyzerOptions, ControlFlow, FixKind, GroupCategory, Queryable, RegistryVisitor, Rule, RuleCategory, RuleFilter, RuleGroup, RuleMetadata, RuleSource, @@ -30,6 +33,7 @@ use xtask::{glue::fs2, *}; fn main() -> Result<()> { let root = project_root().join("website/src/content/docs/linter/rules"); let reference_groups = project_root().join("website/src/components/generated/Groups.astro"); + let rules_sources = project_root().join("website/src/content/docs/linter/linter-sources.mdx"); let reference_number_of_rules = project_root().join("website/src/components/generated/NumberOfRules.astro"); let reference_recommended_rules = @@ -145,6 +149,7 @@ fn main() -> Result<()> { reference_buffer, "" )?; + let rule_sources_buffer = generate_rule_sources(groups.clone())?; for (group, rules) in groups { generate_group( group, @@ -192,6 +197,7 @@ fn main() -> Result<()> { fs2::write(reference_groups, reference_buffer)?; fs2::write(reference_number_of_rules, number_of_rules_buffer)?; fs2::write(reference_recommended_rules, recommended_rules_buffer)?; + fs2::write(rules_sources, rule_sources_buffer)?; Ok(()) } diff --git a/xtask/lintdoc/src/rules_sources.rs b/xtask/lintdoc/src/rules_sources.rs new file mode 100644 index 000000000000..2cac71588ea8 --- /dev/null +++ b/xtask/lintdoc/src/rules_sources.rs @@ -0,0 +1,118 @@ +use biome_analyze::{RuleMetadata, RuleSource}; +use convert_case::{Case, Casing}; +use std::collections::BTreeMap; +use std::io::Write; +use xtask::*; + +pub(crate) fn generate_rule_sources( + rules: BTreeMap<&str, BTreeMap<&'static str, RuleMetadata>>, +) -> Result> { + let mut buffer = vec![]; + + writeln!( + buffer, + r#"--- +title: Linter sources +description: A page that maps lint rules from other sources to Biome +--- + "# + )?; + + let rules = rules + .into_iter() + .flat_map(|(_, rule)| rule) + .collect::>(); + + eslint_to_biome(&rules, &mut buffer)?; + typescript_to_biome(&rules, &mut buffer)?; + eslint_plugins_to_biome(&rules, &mut buffer)?; + + Ok(buffer) +} + +fn eslint_to_biome(map: &BTreeMap<&str, RuleMetadata>, buffer: &mut Vec) -> Result<()> { + writeln!(buffer, "## ESlint rules to Biome")?; + + writeln!(buffer, r#"| ESLint Rule name | Biome Rule name |"#)?; + writeln!(buffer, r#"| ---- | ---- |"#)?; + let mut eslint_to_biome = BTreeMap::new(); + + for (rule_name, metadata) in map { + if let Some(source) = &metadata.source { + if source.is_eslint() { + eslint_to_biome.insert(source, rule_name); + } + } + } + + push_to_table(eslint_to_biome, buffer)?; + Ok(()) +} + +fn typescript_to_biome(map: &BTreeMap<&str, RuleMetadata>, buffer: &mut Vec) -> Result<()> { + writeln!(buffer, "## `typescript-eslint` rules to Biome")?; + writeln!( + buffer, + r#"| `typescript-eslint` rule name | Biome rule name |"# + )?; + writeln!(buffer, r#"| ---- | ---- |"#)?; + let mut typescript_to_biome = BTreeMap::new(); + + for (rule_name, metadata) in map { + if let Some(source) = &metadata.source { + if source.is_eslint_typescript() { + typescript_to_biome.insert(source, rule_name); + } + } + } + + push_to_table(typescript_to_biome, buffer)?; + + Ok(()) +} + +fn eslint_plugins_to_biome(map: &BTreeMap<&str, RuleMetadata>, buffer: &mut Vec) -> Result<()> { + writeln!(buffer, "## ESlint plugin rules to Biome")?; + writeln!( + buffer, + r#"| Plugin name | Plugin rule name | Biome rule name |"# + )?; + writeln!(buffer, r#"| ---- | ---- | --- |"#)?; + let mut eslint_plugin_to_biome = BTreeMap::new(); + + for (rule_name, metadata) in map { + if let Some(source) = &metadata.source { + if source.is_eslint_plugin() { + eslint_plugin_to_biome.insert(source, rule_name); + } + } + } + + push_to_table(eslint_plugin_to_biome, buffer)?; + + Ok(()) +} + +fn push_to_table(map: BTreeMap<&RuleSource, &&str>, buffer: &mut Vec) -> Result<()> { + for (rule_source, rule_name) in map { + let biome_link = rule_name.to_case(Case::Kebab); + let source_rule_name = rule_source.as_rule_name(); + let source_link = rule_source.as_rule_url(); + + if rule_source.is_eslint_plugin() { + writeln!( + buffer, + "| `{}` | [{}]({}) |[{}](/linter/rules/{}) |", + rule_source, source_rule_name, source_link, rule_name, biome_link + )?; + } else { + writeln!( + buffer, + "| [{}]({}) |[{}](/linter/rules/{}) |", + source_rule_name, source_link, rule_name, biome_link + )?; + } + } + + Ok(()) +} From 41805308c904316831ea30ce96bbe9ef754ab1e2 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Thu, 18 Jan 2024 11:21:36 +0000 Subject: [PATCH 2/7] apply suggestions --- crates/biome_analyze/src/rule.rs | 20 +- website/astro.config.ts | 2 +- .../content/docs/linter/linter-sources.mdx | 340 ++++++++++-------- xtask/lintdoc/src/rules_sources.rs | 140 ++++---- 4 files changed, 260 insertions(+), 242 deletions(-) diff --git a/crates/biome_analyze/src/rule.rs b/crates/biome_analyze/src/rule.rs index 9c7c25f56b1f..d51ce4619c03 100644 --- a/crates/biome_analyze/src/rule.rs +++ b/crates/biome_analyze/src/rule.rs @@ -57,7 +57,7 @@ impl Display for FixKind { } } -#[derive(Debug, Clone, Eq, PartialEq, Hash)] +#[derive(Debug, Clone, Eq)] pub enum RuleSource { /// Rules from [Rust Clippy](https://rust-lang.github.io/rust-clippy/master/index.html) Clippy(&'static str), @@ -87,11 +87,17 @@ pub enum RuleSource { EslintMysticatea(&'static str), } +impl PartialEq for RuleSource { + fn eq(&self, other: &Self) -> bool { + std::mem::discriminant(self) == std::mem::discriminant(other) + } +} + impl std::fmt::Display for RuleSource { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - RuleSource::Clippy(_) => write!(f, "clippy"), - RuleSource::Eslint(_) => write!(f, "eslint"), + RuleSource::Clippy(_) => write!(f, "Clippy"), + RuleSource::Eslint(_) => write!(f, "ESLint"), RuleSource::EslintImport(_) => write!(f, "eslint-plugin-import"), RuleSource::EslintImportAccess(_) => write!(f, "eslint-plugin-import-access"), RuleSource::EslintJest(_) => write!(f, "eslint-plugin-jest"), @@ -148,7 +154,7 @@ impl RuleSource { } } - pub fn as_rule_url(&self) -> String { + pub fn to_rule_url(&self) -> String { match self { Self::Clippy(rule_name) => format!("https://rust-lang.github.io/rust-clippy/master/#/{rule_name}"), Self::Eslint(rule_name) => format!("https://eslint.org/docs/latest/rules/{rule_name}"), @@ -167,7 +173,7 @@ impl RuleSource { } pub fn as_url_and_rule_name(&self) -> (String, &'static str) { - (self.as_rule_url(), self.as_rule_name()) + (self.to_rule_url(), self.as_rule_name()) } /// Original ESLint rule @@ -195,6 +201,10 @@ impl RuleSource { | Self::EslintUnicorn(_) ) } + + pub const fn is_clippy(&self) -> bool { + matches!(self, Self::Clippy(_)) + } } #[derive(Debug, Default, Clone)] diff --git a/website/astro.config.ts b/website/astro.config.ts index 1279af35063f..26007266dbdf 100644 --- a/website/astro.config.ts +++ b/website/astro.config.ts @@ -221,7 +221,7 @@ export default defineConfig({ { label: "Linter sources", link: "/linter/linter-sources", - } + }, ], }, ], diff --git a/website/src/content/docs/linter/linter-sources.mdx b/website/src/content/docs/linter/linter-sources.mdx index 98d808874389..90e4bc8bc30a 100644 --- a/website/src/content/docs/linter/linter-sources.mdx +++ b/website/src/content/docs/linter/linter-sources.mdx @@ -3,161 +3,189 @@ title: Linter sources description: A page that maps lint rules from other sources to Biome --- -## ESlint rules to Biome -| ESLint Rule name | Biome Rule name | +## Clippy rules to Biome +| Clippy rule name | Biome rule name | | ---- | ---- | -| [constructor-super](https://eslint.org/docs/latest/rules/constructor-super) |[noInvalidConstructorSuper](/linter/rules/no-invalid-constructor-super) | -| [curly](https://eslint.org/docs/latest/rules/curly) |[useBlockStatements](/linter/rules/use-block-statements) | -| [default-case-last](https://eslint.org/docs/latest/rules/default-case-last) |[useDefaultSwitchClauseLast](/linter/rules/use-default-switch-clause-last) | -| [default-param-last](https://eslint.org/docs/latest/rules/default-param-last) |[useDefaultParameterLast](/linter/rules/use-default-parameter-last) | -| [dot-notation](https://eslint.org/docs/latest/rules/dot-notation) |[useLiteralKeys](/linter/rules/use-literal-keys) | -| [eqeqeq](https://eslint.org/docs/latest/rules/eqeqeq) |[noDoubleEquals](/linter/rules/no-double-equals) | -| [for-direction](https://eslint.org/docs/latest/rules/for-direction) |[useValidForDirection](/linter/rules/use-valid-for-direction) | -| [getter-return](https://eslint.org/docs/latest/rules/getter-return) |[useGetterReturn](/linter/rules/use-getter-return) | -| [no-async-promise-executor](https://eslint.org/docs/latest/rules/no-async-promise-executor) |[noAsyncPromiseExecutor](/linter/rules/no-async-promise-executor) | -| [no-case-declarations](https://eslint.org/docs/latest/rules/no-case-declarations) |[noSwitchDeclarations](/linter/rules/no-switch-declarations) | -| [no-class-assign](https://eslint.org/docs/latest/rules/no-class-assign) |[noClassAssign](/linter/rules/no-class-assign) | -| [no-compare-neg-zero](https://eslint.org/docs/latest/rules/no-compare-neg-zero) |[noCompareNegZero](/linter/rules/no-compare-neg-zero) | -| [no-cond-assign](https://eslint.org/docs/latest/rules/no-cond-assign) |[noAssignInExpressions](/linter/rules/no-assign-in-expressions) | -| [no-console](https://eslint.org/docs/latest/rules/no-console) |[noConsoleLog](/linter/rules/no-console-log) | -| [no-const-assign](https://eslint.org/docs/latest/rules/no-const-assign) |[noConstAssign](/linter/rules/no-const-assign) | -| [no-constant-condition](https://eslint.org/docs/latest/rules/no-constant-condition) |[noConstantCondition](/linter/rules/no-constant-condition) | -| [no-constructor-return](https://eslint.org/docs/latest/rules/no-constructor-return) |[noConstructorReturn](/linter/rules/no-constructor-return) | -| [no-control-regex](https://eslint.org/docs/latest/rules/no-control-regex) |[noControlCharactersInRegex](/linter/rules/no-control-characters-in-regex) | -| [no-debugger](https://eslint.org/docs/latest/rules/no-debugger) |[noDebugger](/linter/rules/no-debugger) | -| [no-dupe-args](https://eslint.org/docs/latest/rules/no-dupe-args) |[noDuplicateParameters](/linter/rules/no-duplicate-parameters) | -| [no-dupe-class-members](https://eslint.org/docs/latest/rules/no-dupe-class-members) |[noDuplicateClassMembers](/linter/rules/no-duplicate-class-members) | -| [no-dupe-keys](https://eslint.org/docs/latest/rules/no-dupe-keys) |[noDuplicateObjectKeys](/linter/rules/no-duplicate-object-keys) | -| [no-duplicate-case](https://eslint.org/docs/latest/rules/no-duplicate-case) |[noDuplicateCase](/linter/rules/no-duplicate-case) | -| [no-else-return](https://eslint.org/docs/latest/rules/no-else-return) |[noUselessElse](/linter/rules/no-useless-else) | -| [no-empty-character-class](https://eslint.org/docs/latest/rules/no-empty-character-class) |[noEmptyCharacterClassInRegex](/linter/rules/no-empty-character-class-in-regex) | -| [no-empty-pattern](https://eslint.org/docs/latest/rules/no-empty-pattern) |[noEmptyPattern](/linter/rules/no-empty-pattern) | -| [no-ex-assign](https://eslint.org/docs/latest/rules/no-ex-assign) |[noCatchAssign](/linter/rules/no-catch-assign) | -| [no-extra-boolean-cast](https://eslint.org/docs/latest/rules/no-extra-boolean-cast) |[noExtraBooleanCast](/linter/rules/no-extra-boolean-cast) | -| [no-extra-label](https://eslint.org/docs/latest/rules/no-extra-label) |[noUselessLabel](/linter/rules/no-useless-label) | -| [no-fallthrough](https://eslint.org/docs/latest/rules/no-fallthrough) |[noFallthroughSwitchClause](/linter/rules/no-fallthrough-switch-clause) | -| [no-func-assign](https://eslint.org/docs/latest/rules/no-func-assign) |[noFunctionAssign](/linter/rules/no-function-assign) | -| [no-import-assign](https://eslint.org/docs/latest/rules/no-import-assign) |[noImportAssign](/linter/rules/no-import-assign) | -| [no-inner-declarations](https://eslint.org/docs/latest/rules/no-inner-declarations) |[noInnerDeclarations](/linter/rules/no-inner-declarations) | -| [no-label-var](https://eslint.org/docs/latest/rules/no-label-var) |[noLabelVar](/linter/rules/no-label-var) | -| [no-labels](https://eslint.org/docs/latest/rules/no-labels) |[noConfusingLabels](/linter/rules/no-confusing-labels) | -| [no-lonely-if](https://eslint.org/docs/latest/rules/no-lonely-if) |[useCollapsedElseIf](/linter/rules/use-collapsed-else-if) | -| [no-loss-of-precision](https://eslint.org/docs/latest/rules/no-loss-of-precision) |[noPrecisionLoss](/linter/rules/no-precision-loss) | -| [no-negated-condition](https://eslint.org/docs/latest/rules/no-negated-condition) |[noNegationElse](/linter/rules/no-negation-else) | -| [no-new-native-nonconstructor](https://eslint.org/docs/latest/rules/no-new-native-nonconstructor) |[noInvalidNewBuiltin](/linter/rules/no-invalid-new-builtin) | -| [no-new-symbol](https://eslint.org/docs/latest/rules/no-new-symbol) |[noNewSymbol](/linter/rules/no-new-symbol) | -| [no-nonoctal-decimal-escape](https://eslint.org/docs/latest/rules/no-nonoctal-decimal-escape) |[noNonoctalDecimalEscape](/linter/rules/no-nonoctal-decimal-escape) | -| [no-obj-calls](https://eslint.org/docs/latest/rules/no-obj-calls) |[noGlobalObjectCalls](/linter/rules/no-global-object-calls) | -| [no-param-reassign](https://eslint.org/docs/latest/rules/no-param-reassign) |[noParameterAssign](/linter/rules/no-parameter-assign) | -| [no-prototype-builtins](https://eslint.org/docs/latest/rules/no-prototype-builtins) |[noPrototypeBuiltins](/linter/rules/no-prototype-builtins) | -| [no-regex-spaces](https://eslint.org/docs/latest/rules/no-regex-spaces) |[noMultipleSpacesInRegularExpressionLiterals](/linter/rules/no-multiple-spaces-in-regular-expression-literals) | -| [no-restricted-globals](https://eslint.org/docs/latest/rules/no-restricted-globals) |[noRestrictedGlobals](/linter/rules/no-restricted-globals) | -| [no-self-assign](https://eslint.org/docs/latest/rules/no-self-assign) |[noSelfAssign](/linter/rules/no-self-assign) | -| [no-self-compare](https://eslint.org/docs/latest/rules/no-self-compare) |[noSelfCompare](/linter/rules/no-self-compare) | -| [no-sequences](https://eslint.org/docs/latest/rules/no-sequences) |[noCommaOperator](/linter/rules/no-comma-operator) | -| [no-setter-return](https://eslint.org/docs/latest/rules/no-setter-return) |[noSetterReturn](/linter/rules/no-setter-return) | -| [no-shadow-restricted-names](https://eslint.org/docs/latest/rules/no-shadow-restricted-names) |[noShadowRestrictedNames](/linter/rules/no-shadow-restricted-names) | -| [no-sparse-array](https://eslint.org/docs/latest/rules/no-sparse-array) |[noSparseArray](/linter/rules/no-sparse-array) | -| [no-this-before-super](https://eslint.org/docs/latest/rules/no-this-before-super) |[noUnreachableSuper](/linter/rules/no-unreachable-super) | -| [no-undef](https://eslint.org/docs/latest/rules/no-undef) |[noUndeclaredVariables](/linter/rules/no-undeclared-variables) | -| [no-unreachable](https://eslint.org/docs/latest/rules/no-unreachable) |[noUnreachable](/linter/rules/no-unreachable) | -| [no-unsafe-finally](https://eslint.org/docs/latest/rules/no-unsafe-finally) |[noUnsafeFinally](/linter/rules/no-unsafe-finally) | -| [no-unsafe-negation](https://eslint.org/docs/latest/rules/no-unsafe-negation) |[noUnsafeNegation](/linter/rules/no-unsafe-negation) | -| [no-unsafe-optional-chaining](https://eslint.org/docs/latest/rules/no-unsafe-optional-chaining) |[noUnsafeOptionalChaining](/linter/rules/no-unsafe-optional-chaining) | -| [no-unused-labels](https://eslint.org/docs/latest/rules/no-unused-labels) |[noUnusedLabels](/linter/rules/no-unused-labels) | -| [no-unused-vars](https://eslint.org/docs/latest/rules/no-unused-vars) |[noUnusedVariables](/linter/rules/no-unused-variables) | -| [no-useless-catch](https://eslint.org/docs/latest/rules/no-useless-catch) |[noUselessCatch](/linter/rules/no-useless-catch) | -| [no-useless-rename](https://eslint.org/docs/latest/rules/no-useless-rename) |[noUselessRename](/linter/rules/no-useless-rename) | -| [no-var](https://eslint.org/docs/latest/rules/no-var) |[noVar](/linter/rules/no-var) | -| [no-void](https://eslint.org/docs/latest/rules/no-void) |[noVoid](/linter/rules/no-void) | -| [no-with](https://eslint.org/docs/latest/rules/no-with) |[noWith](/linter/rules/no-with) | -| [one-var](https://eslint.org/docs/latest/rules/one-var) |[useSingleVarDeclarator](/linter/rules/use-single-var-declarator) | -| [operator-assignment](https://eslint.org/docs/latest/rules/operator-assignment) |[useShorthandAssign](/linter/rules/use-shorthand-assign) | -| [prefer-arrow-callback](https://eslint.org/docs/latest/rules/prefer-arrow-callback) |[useArrowFunction](/linter/rules/use-arrow-function) | -| [prefer-const](https://eslint.org/docs/latest/rules/prefer-const) |[useConst](/linter/rules/use-const) | -| [prefer-exponentiation-operator](https://eslint.org/docs/latest/rules/prefer-exponentiation-operator) |[useExponentiationOperator](/linter/rules/use-exponentiation-operator) | -| [prefer-numeric-literals](https://eslint.org/docs/latest/rules/prefer-numeric-literals) |[useNumericLiterals](/linter/rules/use-numeric-literals) | -| [prefer-regex-literals](https://eslint.org/docs/latest/rules/prefer-regex-literals) |[useRegexLiterals](/linter/rules/use-regex-literals) | -| [prefer-rest-params](https://eslint.org/docs/latest/rules/prefer-rest-params) |[noArguments](/linter/rules/no-arguments) | -| [prefer-template](https://eslint.org/docs/latest/rules/prefer-template) |[useTemplate](/linter/rules/use-template) | -| [require-yield](https://eslint.org/docs/latest/rules/require-yield) |[useYield](/linter/rules/use-yield) | -| [use-isnan](https://eslint.org/docs/latest/rules/use-isnan) |[useIsNan](/linter/rules/use-is-nan) | -| [valid-typeof](https://eslint.org/docs/latest/rules/valid-typeof) |[useValidTypeof](/linter/rules/use-valid-typeof) | -## `typescript-eslint` rules to Biome -| `typescript-eslint` rule name | Biome rule name | +| [approx_constant](https://rust-lang.github.io/rust-clippy/master/#/approx_constant) |[noApproximativeNumericConstant](/linter/rules//lint/rules/no-approximative-numeric-constant) | +| [match_str_case_mismatch](https://rust-lang.github.io/rust-clippy/master/#/match_str_case_mismatch) |[noStringCaseMismatch](/linter/rules//lint/rules/no-string-case-mismatch) | +| [misrefactored_assign_op](https://rust-lang.github.io/rust-clippy/master/#/misrefactored_assign_op) |[noMisrefactoredShorthandAssign](/linter/rules//lint/rules/no-misrefactored-shorthand-assign) | +## ESLint rules to Biome +| ESLint rule name | Biome rule name | | ---- | ---- | -| [array-type](https://typescript-eslint.io/rules/array-type) |[useShorthandArrayType](/linter/rules/use-shorthand-array-type) | -| [ban-types](https://typescript-eslint.io/rules/ban-types) |[noBannedTypes](/linter/rules/no-banned-types) | -| [naming-convention](https://typescript-eslint.io/rules/naming-convention) |[useNamingConvention](/linter/rules/use-naming-convention) | -| [no-empty-interface](https://typescript-eslint.io/rules/no-empty-interface) |[noEmptyInterface](/linter/rules/no-empty-interface) | -| [no-explicit-any](https://typescript-eslint.io/rules/no-explicit-any) |[noExplicitAny](/linter/rules/no-explicit-any) | -| [no-extra-non-null-assertion](https://typescript-eslint.io/rules/no-extra-non-null-assertion) |[noExtraNonNullAssertion](/linter/rules/no-extra-non-null-assertion) | -| [no-extraneous-class](https://typescript-eslint.io/rules/no-extraneous-class) |[noStaticOnlyClass](/linter/rules/no-static-only-class) | -| [no-inferrable-types](https://typescript-eslint.io/rules/no-inferrable-types) |[noInferrableTypes](/linter/rules/no-inferrable-types) | -| [no-invalid-void-type](https://typescript-eslint.io/rules/no-invalid-void-type) |[noConfusingVoidType](/linter/rules/no-confusing-void-type) | -| [no-misused-new](https://typescript-eslint.io/rules/no-misused-new) |[noMisleadingInstantiator](/linter/rules/no-misleading-instantiator) | -| [no-namespace](https://typescript-eslint.io/rules/no-namespace) |[noNamespace](/linter/rules/no-namespace) | -| [no-non-null-assertion](https://typescript-eslint.io/rules/no-non-null-assertion) |[noNonNullAssertion](/linter/rules/no-non-null-assertion) | -| [no-redeclare](https://typescript-eslint.io/rules/no-redeclare) |[noRedeclare](/linter/rules/no-redeclare) | -| [no-this-alias](https://typescript-eslint.io/rules/no-this-alias) |[noUselessThisAlias](/linter/rules/no-useless-this-alias) | -| [no-unnecessary-type-constraint](https://typescript-eslint.io/rules/no-unnecessary-type-constraint) |[noUselessTypeConstraint](/linter/rules/no-useless-type-constraint) | -| [no-unsafe-declaration-merging](https://typescript-eslint.io/rules/no-unsafe-declaration-merging) |[noUnsafeDeclarationMerging](/linter/rules/no-unsafe-declaration-merging) | -| [no-useless-constructor](https://typescript-eslint.io/rules/no-useless-constructor) |[noUselessConstructor](/linter/rules/no-useless-constructor) | -| [no-useless-empty-export](https://typescript-eslint.io/rules/no-useless-empty-export) |[noUselessEmptyExport](/linter/rules/no-useless-empty-export) | -| [no-useless-template-literals](https://typescript-eslint.io/rules/no-useless-template-literals) |[noUnusedTemplateLiteral](/linter/rules/no-unused-template-literal) | -| [parameter-properties](https://typescript-eslint.io/rules/parameter-properties) |[noParameterProperties](/linter/rules/no-parameter-properties) | -| [prefer-as-const](https://typescript-eslint.io/rules/prefer-as-const) |[useAsConstAssertion](/linter/rules/use-as-const-assertion) | -| [prefer-enum-initializers](https://typescript-eslint.io/rules/prefer-enum-initializers) |[useEnumInitializers](/linter/rules/use-enum-initializers) | -| [prefer-literal-enum-member](https://typescript-eslint.io/rules/prefer-literal-enum-member) |[useLiteralEnumMembers](/linter/rules/use-literal-enum-members) | -| [prefer-namespace-keyword](https://typescript-eslint.io/rules/prefer-namespace-keyword) |[useNamespaceKeyword](/linter/rules/use-namespace-keyword) | -| [prefer-optional-chain](https://typescript-eslint.io/rules/prefer-optional-chain) |[useOptionalChain](/linter/rules/use-optional-chain) | -## ESlint plugin rules to Biome -| Plugin name | Plugin rule name | Biome rule name | -| ---- | ---- | --- | -| `eslint-plugin-jsx-a11y` | [alt-text](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/alt-text.md) |[useAltText](/linter/rules/use-alt-text) | -| `eslint-plugin-jsx-a11y` | [anchor-has-content](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/anchor-has-content.md) |[useAnchorContent](/linter/rules/use-anchor-content) | -| `eslint-plugin-jsx-a11y` | [anchor-is-valid](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/anchor-is-valid.md) |[useValidAnchor](/linter/rules/use-valid-anchor) | -| `eslint-plugin-jsx-a11y` | [aria-activedescendant-has-tabindex](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-activedescendant-has-tabindex.md) |[useAriaActivedescendantWithTabindex](/linter/rules/use-aria-activedescendant-with-tabindex) | -| `eslint-plugin-jsx-a11y` | [aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-props.md) |[useValidAriaProps](/linter/rules/use-valid-aria-props) | -| `eslint-plugin-jsx-a11y` | [aria-proptypes](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-proptypes.md) |[useValidAriaValues](/linter/rules/use-valid-aria-values) | -| `eslint-plugin-jsx-a11y` | [aria-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-role.md) |[useValidAriaRole](/linter/rules/use-valid-aria-role) | -| `eslint-plugin-jsx-a11y` | [aria-unsupported-elements](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-unsupported-elements.md) |[noAriaUnsupportedElements](/linter/rules/no-aria-unsupported-elements) | -| `eslint-plugin-react` | [button-has-type](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/button-has-type.md) |[useButtonType](/linter/rules/use-button-type) | -| `eslint-plugin-jsx-a11y` | [click-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/click-events-have-key-events.md) |[useKeyWithClickEvents](/linter/rules/use-key-with-click-events) | -| `eslint-plugin-sonarjs` | [cognitive-complexity](https://github.com/SonarSource/eslint-plugin-sonarjs/blob/HEAD/docs/rules/cognitive-complexity.md) |[noExcessiveCognitiveComplexity](/linter/rules/no-excessive-cognitive-complexity) | -| `eslint-plugin-react-hooks` | [exhaustive-deps](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md) |[useExhaustiveDependencies](/linter/rules/use-exhaustive-dependencies) | -| `eslint-plugin-jsx-a11y` | [heading-has-content](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/heading-has-content.md) |[useHeadingContent](/linter/rules/use-heading-content) | -| `eslint-plugin-jsx-a11y` | [html-has-lang](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/html-has-lang.md) |[useHtmlLang](/linter/rules/use-html-lang) | -| `eslint-plugin-jsx-a11y` | [iframe-has-title](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/iframe-has-title.md) |[useIframeTitle](/linter/rules/use-iframe-title) | -| `eslint-plugin-react` | [jsx-boolean-value](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-boolean-value.md) |[noImplicitBoolean](/linter/rules/no-implicit-boolean) | -| `eslint-plugin-react` | [jsx-fragments](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-fragments.md) |[useFragmentSyntax](/linter/rules/use-fragment-syntax) | -| `eslint-plugin-react` | [jsx-no-comment-textnodes](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-comment-textnodes.md) |[noCommentText](/linter/rules/no-comment-text) | -| `eslint-plugin-react` | [jsx-no-duplicate-props](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-duplicate-props.md) |[noDuplicateJsxProps](/linter/rules/no-duplicate-jsx-props) | -| `eslint-plugin-react` | [jsx-no-target-blank](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-target-blank.md) |[noBlankTarget](/linter/rules/no-blank-target) | -| `eslint-plugin-react` | [jsx-no-useless-fragment](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-useless-fragment.md) |[noUselessFragments](/linter/rules/no-useless-fragments) | -| `eslint-plugin-stylistic` | [jsx-self-closing-comp](https://eslint.style/rules/default/jsx-self-closing-comp) |[useSelfClosingElements](/linter/rules/use-self-closing-elements) | -| `eslint-plugin-jsx-a11y` | [lang](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/lang.md) |[useValidLang](/linter/rules/use-valid-lang) | -| `eslint-plugin-jsx-a11y` | [media-has-caption](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/media-has-caption.md) |[useMediaCaption](/linter/rules/use-media-caption) | -| `eslint-plugin-jsx-a11y` | [mouse-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/mouse-events-have-key-events.md) |[useKeyWithMouseEvents](/linter/rules/use-key-with-mouse-events) | -| `eslint-plugin-jsx-a11y` | [no-access-key](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-access-key.md) |[noAccessKey](/linter/rules/no-access-key) | -| `eslint-plugin-jsx-a11y` | [no-aria-hidden-on-focusable](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-aria-hidden-on-focusable.md) |[noAriaHiddenOnFocusable](/linter/rules/no-aria-hidden-on-focusable) | -| `eslint-plugin-unicorn` | [no-array-for-each](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-array-for-each.md) |[noForEach](/linter/rules/no-for-each) | -| `eslint-plugin-react` | [no-array-index-key](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-array-index-key.md) |[noArrayIndexKey](/linter/rules/no-array-index-key) | -| `eslint-plugin-jsx-a11y` | [no-autofocus](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-autofocus.md) |[noAutofocus](/linter/rules/no-autofocus) | -| `eslint-plugin-react` | [no-children-prop](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-children-prop.md) |[noChildrenProp](/linter/rules/no-children-prop) | -| `eslint-plugin-react` | [no-danger](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger.md) |[noDangerouslySetInnerHtmlWithChildren](/linter/rules/no-dangerously-set-inner-html-with-children) | -| `eslint-plugin-react` | [no-danger-with-children](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger-with-children.md) |[noDangerouslySetInnerHtml](/linter/rules/no-dangerously-set-inner-html) | -| `eslint-plugin-import` | [no-default-export](https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-default-export.md) |[noDefaultExport](/linter/rules/no-default-export) | -| `eslint-plugin-jsx-a11y` | [no-distracting-elements](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-distracting-elements.md) |[noDistractingElements](/linter/rules/no-distracting-elements) | -| `eslint-plugin-unicorn` | [no-instanceof-array](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-instanceof-array.md) |[useIsArray](/linter/rules/use-is-array) | -| `eslint-plugin-jsx-a11y` | [no-interactive-element-to-noninteractive-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-interactive-element-to-noninteractive-role.md) |[noInteractiveElementToNoninteractiveRole](/linter/rules/no-interactive-element-to-noninteractive-role) | -| `eslint-plugin-jsx-a11y` | [no-noninteractive-element-to-interactive-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-noninteractive-element-to-interactive-role.md) |[noNoninteractiveElementToInteractiveRole](/linter/rules/no-noninteractive-element-to-interactive-role) | -| `eslint-plugin-jsx-a11y` | [no-noninteractive-tabindex](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-noninteractive-tabindex.md) |[noNoninteractiveTabindex](/linter/rules/no-noninteractive-tabindex) | -| `eslint-plugin-jsx-a11y` | [no-redundant-roles](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-redundant-roles.md) |[noRedundantRoles](/linter/rules/no-redundant-roles) | -| `eslint-plugin-unicorn` | [no-useless-switch-case](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-useless-switch-case.md) |[noUselessSwitchCase](/linter/rules/no-useless-switch-case) | -| `eslint-plugin-unicorn` | [prefer-array-flat-map](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-array-flat-map.md) |[useFlatMap](/linter/rules/use-flat-map) | -| `eslint-plugin-jsx-a11y` | [role-has-required-aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/role-has-required-aria-props.md) |[useAriaPropsForRole](/linter/rules/use-aria-props-for-role) | -| `eslint-plugin-react-hooks` | [rules-of-hooks](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md) |[useHookAtTopLevel](/linter/rules/use-hook-at-top-level) | -| `eslint-plugin-jsx-a11y` | [scope](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/scope.md) |[noHeaderScope](/linter/rules/no-header-scope) | -| `eslint-plugin-jsx-a11y` | [tabindex-no-positive](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/tabindex-no-positive.md) |[noPositiveTabindex](/linter/rules/no-positive-tabindex) | -| `eslint-plugin-react` | [void-dom-elements-no-children](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/void-dom-elements-no-children.md) |[noVoidElementsWithChildren](/linter/rules/no-void-elements-with-children) | +| [constructor-super](https://eslint.org/docs/latest/rules/constructor-super) |[noInvalidConstructorSuper](/linter/rules//lint/rules/no-invalid-constructor-super) | +| [curly](https://eslint.org/docs/latest/rules/curly) |[useBlockStatements](/linter/rules//lint/rules/use-block-statements) | +| [default-case-last](https://eslint.org/docs/latest/rules/default-case-last) |[useDefaultSwitchClauseLast](/linter/rules//lint/rules/use-default-switch-clause-last) | +| [default-param-last](https://eslint.org/docs/latest/rules/default-param-last) |[useDefaultParameterLast](/linter/rules//lint/rules/use-default-parameter-last) | +| [dot-notation](https://eslint.org/docs/latest/rules/dot-notation) |[useLiteralKeys](/linter/rules//lint/rules/use-literal-keys) | +| [eqeqeq](https://eslint.org/docs/latest/rules/eqeqeq) |[noDoubleEquals](/linter/rules//lint/rules/no-double-equals) | +| [for-direction](https://eslint.org/docs/latest/rules/for-direction) |[useValidForDirection](/linter/rules//lint/rules/use-valid-for-direction) | +| [getter-return](https://eslint.org/docs/latest/rules/getter-return) |[useGetterReturn](/linter/rules//lint/rules/use-getter-return) | +| [no-async-promise-executor](https://eslint.org/docs/latest/rules/no-async-promise-executor) |[noAsyncPromiseExecutor](/linter/rules//lint/rules/no-async-promise-executor) | +| [no-case-declarations](https://eslint.org/docs/latest/rules/no-case-declarations) |[noSwitchDeclarations](/linter/rules//lint/rules/no-switch-declarations) | +| [no-class-assign](https://eslint.org/docs/latest/rules/no-class-assign) |[noClassAssign](/linter/rules//lint/rules/no-class-assign) | +| [no-compare-neg-zero](https://eslint.org/docs/latest/rules/no-compare-neg-zero) |[noCompareNegZero](/linter/rules//lint/rules/no-compare-neg-zero) | +| [no-cond-assign](https://eslint.org/docs/latest/rules/no-cond-assign) |[noAssignInExpressions](/linter/rules//lint/rules/no-assign-in-expressions) | +| [no-console](https://eslint.org/docs/latest/rules/no-console) |[noConsoleLog](/linter/rules//lint/rules/no-console-log) | +| [no-const-assign](https://eslint.org/docs/latest/rules/no-const-assign) |[noConstAssign](/linter/rules//lint/rules/no-const-assign) | +| [no-constant-condition](https://eslint.org/docs/latest/rules/no-constant-condition) |[noConstantCondition](/linter/rules//lint/rules/no-constant-condition) | +| [no-constructor-return](https://eslint.org/docs/latest/rules/no-constructor-return) |[noConstructorReturn](/linter/rules//lint/rules/no-constructor-return) | +| [no-control-regex](https://eslint.org/docs/latest/rules/no-control-regex) |[noControlCharactersInRegex](/linter/rules//lint/rules/no-control-characters-in-regex) | +| [no-debugger](https://eslint.org/docs/latest/rules/no-debugger) |[noDebugger](/linter/rules//lint/rules/no-debugger) | +| [no-dupe-args](https://eslint.org/docs/latest/rules/no-dupe-args) |[noDuplicateParameters](/linter/rules//lint/rules/no-duplicate-parameters) | +| [no-dupe-class-members](https://eslint.org/docs/latest/rules/no-dupe-class-members) |[noDuplicateClassMembers](/linter/rules//lint/rules/no-duplicate-class-members) | +| [no-dupe-keys](https://eslint.org/docs/latest/rules/no-dupe-keys) |[noDuplicateObjectKeys](/linter/rules//lint/rules/no-duplicate-object-keys) | +| [no-duplicate-case](https://eslint.org/docs/latest/rules/no-duplicate-case) |[noDuplicateCase](/linter/rules//lint/rules/no-duplicate-case) | +| [no-else-return](https://eslint.org/docs/latest/rules/no-else-return) |[noUselessElse](/linter/rules//lint/rules/no-useless-else) | +| [no-empty-character-class](https://eslint.org/docs/latest/rules/no-empty-character-class) |[noEmptyCharacterClassInRegex](/linter/rules//lint/rules/no-empty-character-class-in-regex) | +| [no-empty-pattern](https://eslint.org/docs/latest/rules/no-empty-pattern) |[noEmptyPattern](/linter/rules//lint/rules/no-empty-pattern) | +| [no-ex-assign](https://eslint.org/docs/latest/rules/no-ex-assign) |[noCatchAssign](/linter/rules//lint/rules/no-catch-assign) | +| [no-extra-boolean-cast](https://eslint.org/docs/latest/rules/no-extra-boolean-cast) |[noExtraBooleanCast](/linter/rules//lint/rules/no-extra-boolean-cast) | +| [no-extra-label](https://eslint.org/docs/latest/rules/no-extra-label) |[noUselessLabel](/linter/rules//lint/rules/no-useless-label) | +| [no-fallthrough](https://eslint.org/docs/latest/rules/no-fallthrough) |[noFallthroughSwitchClause](/linter/rules//lint/rules/no-fallthrough-switch-clause) | +| [no-func-assign](https://eslint.org/docs/latest/rules/no-func-assign) |[noFunctionAssign](/linter/rules//lint/rules/no-function-assign) | +| [no-import-assign](https://eslint.org/docs/latest/rules/no-import-assign) |[noImportAssign](/linter/rules//lint/rules/no-import-assign) | +| [no-inner-declarations](https://eslint.org/docs/latest/rules/no-inner-declarations) |[noInnerDeclarations](/linter/rules//lint/rules/no-inner-declarations) | +| [no-label-var](https://eslint.org/docs/latest/rules/no-label-var) |[noLabelVar](/linter/rules//lint/rules/no-label-var) | +| [no-labels](https://eslint.org/docs/latest/rules/no-labels) |[noConfusingLabels](/linter/rules//lint/rules/no-confusing-labels) | +| [no-lonely-if](https://eslint.org/docs/latest/rules/no-lonely-if) |[useCollapsedElseIf](/linter/rules//lint/rules/use-collapsed-else-if) | +| [no-loss-of-precision](https://eslint.org/docs/latest/rules/no-loss-of-precision) |[noPrecisionLoss](/linter/rules//lint/rules/no-precision-loss) | +| [no-negated-condition](https://eslint.org/docs/latest/rules/no-negated-condition) |[noNegationElse](/linter/rules//lint/rules/no-negation-else) | +| [no-new-native-nonconstructor](https://eslint.org/docs/latest/rules/no-new-native-nonconstructor) |[noInvalidNewBuiltin](/linter/rules//lint/rules/no-invalid-new-builtin) | +| [no-new-symbol](https://eslint.org/docs/latest/rules/no-new-symbol) |[noNewSymbol](/linter/rules//lint/rules/no-new-symbol) | +| [no-nonoctal-decimal-escape](https://eslint.org/docs/latest/rules/no-nonoctal-decimal-escape) |[noNonoctalDecimalEscape](/linter/rules//lint/rules/no-nonoctal-decimal-escape) | +| [no-obj-calls](https://eslint.org/docs/latest/rules/no-obj-calls) |[noGlobalObjectCalls](/linter/rules//lint/rules/no-global-object-calls) | +| [no-param-reassign](https://eslint.org/docs/latest/rules/no-param-reassign) |[noParameterAssign](/linter/rules//lint/rules/no-parameter-assign) | +| [no-prototype-builtins](https://eslint.org/docs/latest/rules/no-prototype-builtins) |[noPrototypeBuiltins](/linter/rules//lint/rules/no-prototype-builtins) | +| [no-regex-spaces](https://eslint.org/docs/latest/rules/no-regex-spaces) |[noMultipleSpacesInRegularExpressionLiterals](/linter/rules//lint/rules/no-multiple-spaces-in-regular-expression-literals) | +| [no-restricted-globals](https://eslint.org/docs/latest/rules/no-restricted-globals) |[noRestrictedGlobals](/linter/rules//lint/rules/no-restricted-globals) | +| [no-self-assign](https://eslint.org/docs/latest/rules/no-self-assign) |[noSelfAssign](/linter/rules//lint/rules/no-self-assign) | +| [no-self-compare](https://eslint.org/docs/latest/rules/no-self-compare) |[noSelfCompare](/linter/rules//lint/rules/no-self-compare) | +| [no-sequences](https://eslint.org/docs/latest/rules/no-sequences) |[noCommaOperator](/linter/rules//lint/rules/no-comma-operator) | +| [no-setter-return](https://eslint.org/docs/latest/rules/no-setter-return) |[noSetterReturn](/linter/rules//lint/rules/no-setter-return) | +| [no-shadow-restricted-names](https://eslint.org/docs/latest/rules/no-shadow-restricted-names) |[noShadowRestrictedNames](/linter/rules//lint/rules/no-shadow-restricted-names) | +| [no-sparse-array](https://eslint.org/docs/latest/rules/no-sparse-array) |[noSparseArray](/linter/rules//lint/rules/no-sparse-array) | +| [no-this-before-super](https://eslint.org/docs/latest/rules/no-this-before-super) |[noUnreachableSuper](/linter/rules//lint/rules/no-unreachable-super) | +| [no-undef](https://eslint.org/docs/latest/rules/no-undef) |[noUndeclaredVariables](/linter/rules//lint/rules/no-undeclared-variables) | +| [no-unreachable](https://eslint.org/docs/latest/rules/no-unreachable) |[noUnreachable](/linter/rules//lint/rules/no-unreachable) | +| [no-unsafe-finally](https://eslint.org/docs/latest/rules/no-unsafe-finally) |[noUnsafeFinally](/linter/rules//lint/rules/no-unsafe-finally) | +| [no-unsafe-negation](https://eslint.org/docs/latest/rules/no-unsafe-negation) |[noUnsafeNegation](/linter/rules//lint/rules/no-unsafe-negation) | +| [no-unsafe-optional-chaining](https://eslint.org/docs/latest/rules/no-unsafe-optional-chaining) |[noUnsafeOptionalChaining](/linter/rules//lint/rules/no-unsafe-optional-chaining) | +| [no-unused-labels](https://eslint.org/docs/latest/rules/no-unused-labels) |[noUnusedLabels](/linter/rules//lint/rules/no-unused-labels) | +| [no-unused-vars](https://eslint.org/docs/latest/rules/no-unused-vars) |[noUnusedVariables](/linter/rules//lint/rules/no-unused-variables) | +| [no-useless-catch](https://eslint.org/docs/latest/rules/no-useless-catch) |[noUselessCatch](/linter/rules//lint/rules/no-useless-catch) | +| [no-useless-rename](https://eslint.org/docs/latest/rules/no-useless-rename) |[noUselessRename](/linter/rules//lint/rules/no-useless-rename) | +| [no-var](https://eslint.org/docs/latest/rules/no-var) |[noVar](/linter/rules//lint/rules/no-var) | +| [no-void](https://eslint.org/docs/latest/rules/no-void) |[noVoid](/linter/rules//lint/rules/no-void) | +| [no-with](https://eslint.org/docs/latest/rules/no-with) |[noWith](/linter/rules//lint/rules/no-with) | +| [one-var](https://eslint.org/docs/latest/rules/one-var) |[useSingleVarDeclarator](/linter/rules//lint/rules/use-single-var-declarator) | +| [operator-assignment](https://eslint.org/docs/latest/rules/operator-assignment) |[useShorthandAssign](/linter/rules//lint/rules/use-shorthand-assign) | +| [prefer-arrow-callback](https://eslint.org/docs/latest/rules/prefer-arrow-callback) |[useArrowFunction](/linter/rules//lint/rules/use-arrow-function) | +| [prefer-const](https://eslint.org/docs/latest/rules/prefer-const) |[useConst](/linter/rules//lint/rules/use-const) | +| [prefer-exponentiation-operator](https://eslint.org/docs/latest/rules/prefer-exponentiation-operator) |[useExponentiationOperator](/linter/rules//lint/rules/use-exponentiation-operator) | +| [prefer-numeric-literals](https://eslint.org/docs/latest/rules/prefer-numeric-literals) |[useNumericLiterals](/linter/rules//lint/rules/use-numeric-literals) | +| [prefer-regex-literals](https://eslint.org/docs/latest/rules/prefer-regex-literals) |[useRegexLiterals](/linter/rules//lint/rules/use-regex-literals) | +| [prefer-rest-params](https://eslint.org/docs/latest/rules/prefer-rest-params) |[noArguments](/linter/rules//lint/rules/no-arguments) | +| [prefer-template](https://eslint.org/docs/latest/rules/prefer-template) |[useTemplate](/linter/rules//lint/rules/use-template) | +| [require-yield](https://eslint.org/docs/latest/rules/require-yield) |[useYield](/linter/rules//lint/rules/use-yield) | +| [use-isnan](https://eslint.org/docs/latest/rules/use-isnan) |[useIsNan](/linter/rules//lint/rules/use-is-nan) | +| [valid-typeof](https://eslint.org/docs/latest/rules/valid-typeof) |[useValidTypeof](/linter/rules//lint/rules/use-valid-typeof) | +## eslint-plugin-import rules to Biome +| eslint-plugin-import rule name | Biome rule name | +| ---- | ---- | +| [no-default-export](https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-default-export.md) |[noDefaultExport](/linter/rules//lint/rules/no-default-export) | +## eslint-plugin-jsx-a11y rules to Biome +| eslint-plugin-jsx-a11y rule name | Biome rule name | +| ---- | ---- | +| [alt-text](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/alt-text.md) |[useAltText](/linter/rules//lint/rules/use-alt-text) | +| [anchor-has-content](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/anchor-has-content.md) |[useAnchorContent](/linter/rules//lint/rules/use-anchor-content) | +| [anchor-is-valid](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/anchor-is-valid.md) |[useValidAnchor](/linter/rules//lint/rules/use-valid-anchor) | +| [aria-activedescendant-has-tabindex](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-activedescendant-has-tabindex.md) |[useAriaActivedescendantWithTabindex](/linter/rules//lint/rules/use-aria-activedescendant-with-tabindex) | +| [aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-props.md) |[useValidAriaProps](/linter/rules//lint/rules/use-valid-aria-props) | +| [aria-proptypes](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-proptypes.md) |[useValidAriaValues](/linter/rules//lint/rules/use-valid-aria-values) | +| [aria-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-role.md) |[useValidAriaRole](/linter/rules//lint/rules/use-valid-aria-role) | +| [aria-unsupported-elements](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-unsupported-elements.md) |[noAriaUnsupportedElements](/linter/rules//lint/rules/no-aria-unsupported-elements) | +| [click-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/click-events-have-key-events.md) |[useKeyWithClickEvents](/linter/rules//lint/rules/use-key-with-click-events) | +| [heading-has-content](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/heading-has-content.md) |[useHeadingContent](/linter/rules//lint/rules/use-heading-content) | +| [html-has-lang](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/html-has-lang.md) |[useHtmlLang](/linter/rules//lint/rules/use-html-lang) | +| [iframe-has-title](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/iframe-has-title.md) |[useIframeTitle](/linter/rules//lint/rules/use-iframe-title) | +| [lang](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/lang.md) |[useValidLang](/linter/rules//lint/rules/use-valid-lang) | +| [media-has-caption](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/media-has-caption.md) |[useMediaCaption](/linter/rules//lint/rules/use-media-caption) | +| [mouse-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/mouse-events-have-key-events.md) |[useKeyWithMouseEvents](/linter/rules//lint/rules/use-key-with-mouse-events) | +| [no-access-key](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-access-key.md) |[noAccessKey](/linter/rules//lint/rules/no-access-key) | +| [no-aria-hidden-on-focusable](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-aria-hidden-on-focusable.md) |[noAriaHiddenOnFocusable](/linter/rules//lint/rules/no-aria-hidden-on-focusable) | +| [no-autofocus](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-autofocus.md) |[noAutofocus](/linter/rules//lint/rules/no-autofocus) | +| [no-distracting-elements](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-distracting-elements.md) |[noDistractingElements](/linter/rules//lint/rules/no-distracting-elements) | +| [no-interactive-element-to-noninteractive-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-interactive-element-to-noninteractive-role.md) |[noInteractiveElementToNoninteractiveRole](/linter/rules//lint/rules/no-interactive-element-to-noninteractive-role) | +| [no-noninteractive-element-to-interactive-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-noninteractive-element-to-interactive-role.md) |[noNoninteractiveElementToInteractiveRole](/linter/rules//lint/rules/no-noninteractive-element-to-interactive-role) | +| [no-noninteractive-tabindex](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-noninteractive-tabindex.md) |[noNoninteractiveTabindex](/linter/rules//lint/rules/no-noninteractive-tabindex) | +| [no-redundant-roles](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-redundant-roles.md) |[noRedundantAlt](/linter/rules//lint/rules/no-redundant-alt) | +| [role-has-required-aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/role-has-required-aria-props.md) |[useAriaPropsForRole](/linter/rules//lint/rules/use-aria-props-for-role) | +| [scope](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/scope.md) |[noHeaderScope](/linter/rules//lint/rules/no-header-scope) | +| [tabindex-no-positive](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/tabindex-no-positive.md) |[noPositiveTabindex](/linter/rules//lint/rules/no-positive-tabindex) | +## eslint-plugin-mysticates rules to Biome +| eslint-plugin-mysticates rule name | Biome rule name | +| ---- | ---- | +| [no-this-in-static](https://github.com/mysticatea/eslint-plugin/blob/master/docs/rules/no-this-in-static.md) |[noThisInStatic](/linter/rules//lint/rules/no-this-in-static) | +## eslint-plugin-react rules to Biome +| eslint-plugin-react rule name | Biome rule name | +| ---- | ---- | +| [button-has-type](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/button-has-type.md) |[useButtonType](/linter/rules//lint/rules/use-button-type) | +| [jsx-boolean-value](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-boolean-value.md) |[noImplicitBoolean](/linter/rules//lint/rules/no-implicit-boolean) | +| [jsx-fragments](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-fragments.md) |[useFragmentSyntax](/linter/rules//lint/rules/use-fragment-syntax) | +| [jsx-no-comment-textnodes](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-comment-textnodes.md) |[noCommentText](/linter/rules//lint/rules/no-comment-text) | +| [jsx-no-duplicate-props](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-duplicate-props.md) |[noDuplicateJsxProps](/linter/rules//lint/rules/no-duplicate-jsx-props) | +| [jsx-no-target-blank](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-target-blank.md) |[noBlankTarget](/linter/rules//lint/rules/no-blank-target) | +| [jsx-no-useless-fragment](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-useless-fragment.md) |[noUselessFragments](/linter/rules//lint/rules/no-useless-fragments) | +| [no-array-index-key](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-array-index-key.md) |[noArrayIndexKey](/linter/rules//lint/rules/no-array-index-key) | +| [no-children-prop](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-children-prop.md) |[noChildrenProp](/linter/rules//lint/rules/no-children-prop) | +| [no-danger](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger.md) |[noDangerouslySetInnerHtmlWithChildren](/linter/rules//lint/rules/no-dangerously-set-inner-html-with-children) | +| [no-danger-with-children](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger-with-children.md) |[noDangerouslySetInnerHtml](/linter/rules//lint/rules/no-dangerously-set-inner-html) | +| [void-dom-elements-no-children](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/void-dom-elements-no-children.md) |[noVoidElementsWithChildren](/linter/rules//lint/rules/no-void-elements-with-children) | +## eslint-plugin-react-hooks rules to Biome +| eslint-plugin-react-hooks rule name | Biome rule name | +| ---- | ---- | +| [exhaustive-deps](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md) |[useExhaustiveDependencies](/linter/rules//lint/rules/use-exhaustive-dependencies) | +| [rules-of-hooks](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md) |[useHookAtTopLevel](/linter/rules//lint/rules/use-hook-at-top-level) | +## eslint-plugin-sonarjs rules to Biome +| eslint-plugin-sonarjs rule name | Biome rule name | +| ---- | ---- | +| [cognitive-complexity](https://github.com/SonarSource/eslint-plugin-sonarjs/blob/HEAD/docs/rules/cognitive-complexity.md) |[noExcessiveCognitiveComplexity](/linter/rules//lint/rules/no-excessive-cognitive-complexity) | +## eslint-plugin-stylistic rules to Biome +| eslint-plugin-stylistic rule name | Biome rule name | +| ---- | ---- | +| [jsx-self-closing-comp](https://eslint.style/rules/default/jsx-self-closing-comp) |[useSelfClosingElements](/linter/rules//lint/rules/use-self-closing-elements) | +## eslint-plugin-typescript rules to Biome +| eslint-plugin-typescript rule name | Biome rule name | +| ---- | ---- | +| [array-type](https://typescript-eslint.io/rules/array-type) |[useShorthandArrayType](/linter/rules//lint/rules/use-shorthand-array-type) | +| [ban-types](https://typescript-eslint.io/rules/ban-types) |[noBannedTypes](/linter/rules//lint/rules/no-banned-types) | +| [naming-convention](https://typescript-eslint.io/rules/naming-convention) |[useNamingConvention](/linter/rules//lint/rules/use-naming-convention) | +| [no-empty-interface](https://typescript-eslint.io/rules/no-empty-interface) |[noEmptyInterface](/linter/rules//lint/rules/no-empty-interface) | +| [no-explicit-any](https://typescript-eslint.io/rules/no-explicit-any) |[noExplicitAny](/linter/rules//lint/rules/no-explicit-any) | +| [no-extra-non-null-assertion](https://typescript-eslint.io/rules/no-extra-non-null-assertion) |[noExtraNonNullAssertion](/linter/rules//lint/rules/no-extra-non-null-assertion) | +| [no-extraneous-class](https://typescript-eslint.io/rules/no-extraneous-class) |[noStaticOnlyClass](/linter/rules//lint/rules/no-static-only-class) | +| [no-inferrable-types](https://typescript-eslint.io/rules/no-inferrable-types) |[noInferrableTypes](/linter/rules//lint/rules/no-inferrable-types) | +| [no-invalid-void-type](https://typescript-eslint.io/rules/no-invalid-void-type) |[noConfusingVoidType](/linter/rules//lint/rules/no-confusing-void-type) | +| [no-misused-new](https://typescript-eslint.io/rules/no-misused-new) |[noMisleadingInstantiator](/linter/rules//lint/rules/no-misleading-instantiator) | +| [no-namespace](https://typescript-eslint.io/rules/no-namespace) |[noNamespace](/linter/rules//lint/rules/no-namespace) | +| [no-non-null-assertion](https://typescript-eslint.io/rules/no-non-null-assertion) |[noNonNullAssertion](/linter/rules//lint/rules/no-non-null-assertion) | +| [no-redeclare](https://typescript-eslint.io/rules/no-redeclare) |[noRedeclare](/linter/rules//lint/rules/no-redeclare) | +| [no-this-alias](https://typescript-eslint.io/rules/no-this-alias) |[noUselessThisAlias](/linter/rules//lint/rules/no-useless-this-alias) | +| [no-unnecessary-type-constraint](https://typescript-eslint.io/rules/no-unnecessary-type-constraint) |[noUselessTypeConstraint](/linter/rules//lint/rules/no-useless-type-constraint) | +| [no-unsafe-declaration-merging](https://typescript-eslint.io/rules/no-unsafe-declaration-merging) |[noUnsafeDeclarationMerging](/linter/rules//lint/rules/no-unsafe-declaration-merging) | +| [no-useless-constructor](https://typescript-eslint.io/rules/no-useless-constructor) |[noUselessConstructor](/linter/rules//lint/rules/no-useless-constructor) | +| [no-useless-empty-export](https://typescript-eslint.io/rules/no-useless-empty-export) |[noUselessEmptyExport](/linter/rules//lint/rules/no-useless-empty-export) | +| [no-useless-template-literals](https://typescript-eslint.io/rules/no-useless-template-literals) |[noUnusedTemplateLiteral](/linter/rules//lint/rules/no-unused-template-literal) | +| [parameter-properties](https://typescript-eslint.io/rules/parameter-properties) |[noParameterProperties](/linter/rules//lint/rules/no-parameter-properties) | +| [prefer-as-const](https://typescript-eslint.io/rules/prefer-as-const) |[useAsConstAssertion](/linter/rules//lint/rules/use-as-const-assertion) | +| [prefer-enum-initializers](https://typescript-eslint.io/rules/prefer-enum-initializers) |[useEnumInitializers](/linter/rules//lint/rules/use-enum-initializers) | +| [prefer-literal-enum-member](https://typescript-eslint.io/rules/prefer-literal-enum-member) |[useLiteralEnumMembers](/linter/rules//lint/rules/use-literal-enum-members) | +| [prefer-namespace-keyword](https://typescript-eslint.io/rules/prefer-namespace-keyword) |[useNamespaceKeyword](/linter/rules//lint/rules/use-namespace-keyword) | +| [prefer-optional-chain](https://typescript-eslint.io/rules/prefer-optional-chain) |[useOptionalChain](/linter/rules//lint/rules/use-optional-chain) | +## eslint-plugin-unicorn rules to Biome +| eslint-plugin-unicorn rule name | Biome rule name | +| ---- | ---- | +| [no-array-for-each](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-array-for-each.md) |[noForEach](/linter/rules//lint/rules/no-for-each) | +| [no-instanceof-array](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-instanceof-array.md) |[useIsArray](/linter/rules//lint/rules/use-is-array) | +| [no-useless-switch-case](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-useless-switch-case.md) |[noUselessSwitchCase](/linter/rules//lint/rules/no-useless-switch-case) | +| [prefer-array-flat-map](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-array-flat-map.md) |[useFlatMap](/linter/rules//lint/rules/use-flat-map) | diff --git a/xtask/lintdoc/src/rules_sources.rs b/xtask/lintdoc/src/rules_sources.rs index 2cac71588ea8..a43cff44293a 100644 --- a/xtask/lintdoc/src/rules_sources.rs +++ b/xtask/lintdoc/src/rules_sources.rs @@ -1,9 +1,32 @@ -use biome_analyze::{RuleMetadata, RuleSource}; +use biome_analyze::RuleMetadata; use convert_case::{Case, Casing}; -use std::collections::BTreeMap; +use std::cmp::Ordering; +use std::collections::{BTreeMap, BTreeSet}; use std::io::Write; use xtask::*; +#[derive(Debug, Eq, PartialEq)] +struct SourceSet { + source_rule_name: String, + source_link: String, + biome_rule_name: String, + biome_link: String, +} + +impl Ord for SourceSet { + fn cmp(&self, other: &Self) -> Ordering { + self.source_rule_name.cmp(&other.source_rule_name) + } +} + +impl PartialOrd for SourceSet { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl SourceSet {} + pub(crate) fn generate_rule_sources( rules: BTreeMap<&str, BTreeMap<&'static str, RuleMetadata>>, ) -> Result> { @@ -23,95 +46,52 @@ description: A page that maps lint rules from other sources to Biome .flat_map(|(_, rule)| rule) .collect::>(); - eslint_to_biome(&rules, &mut buffer)?; - typescript_to_biome(&rules, &mut buffer)?; - eslint_plugins_to_biome(&rules, &mut buffer)?; + let mut rules_by_source = BTreeMap::>::new(); - Ok(buffer) -} - -fn eslint_to_biome(map: &BTreeMap<&str, RuleMetadata>, buffer: &mut Vec) -> Result<()> { - writeln!(buffer, "## ESlint rules to Biome")?; - - writeln!(buffer, r#"| ESLint Rule name | Biome Rule name |"#)?; - writeln!(buffer, r#"| ---- | ---- |"#)?; - let mut eslint_to_biome = BTreeMap::new(); - - for (rule_name, metadata) in map { + for (rule_name, metadata) in rules { if let Some(source) = &metadata.source { - if source.is_eslint() { - eslint_to_biome.insert(source, rule_name); + let set = rules_by_source.get_mut(&format!("{source}")); + if let Some(set) = set { + set.insert(SourceSet { + biome_rule_name: rule_name.to_string(), + biome_link: format!("/lint/rules/{}", rule_name.to_case(Case::Kebab)), + source_link: source.to_rule_url(), + source_rule_name: source.as_rule_name().to_string(), + }); + } else { + let mut set = BTreeSet::new(); + set.insert(SourceSet { + biome_rule_name: rule_name.to_string(), + biome_link: format!("/lint/rules/{}", rule_name.to_case(Case::Kebab)), + source_link: source.to_rule_url(), + source_rule_name: source.as_rule_name().to_string(), + }); + rules_by_source.insert(format!("{source}"), set); } } } - push_to_table(eslint_to_biome, buffer)?; - Ok(()) -} - -fn typescript_to_biome(map: &BTreeMap<&str, RuleMetadata>, buffer: &mut Vec) -> Result<()> { - writeln!(buffer, "## `typescript-eslint` rules to Biome")?; - writeln!( - buffer, - r#"| `typescript-eslint` rule name | Biome rule name |"# - )?; - writeln!(buffer, r#"| ---- | ---- |"#)?; - let mut typescript_to_biome = BTreeMap::new(); + for (source, rules) in rules_by_source { + writeln!(buffer, "## {source} rules to Biome")?; + writeln!(buffer, r#"| {source} rule name | Biome rule name |"#)?; + writeln!(buffer, r#"| ---- | ---- |"#)?; - for (rule_name, metadata) in map { - if let Some(source) = &metadata.source { - if source.is_eslint_typescript() { - typescript_to_biome.insert(source, rule_name); - } - } - } - - push_to_table(typescript_to_biome, buffer)?; - - Ok(()) -} - -fn eslint_plugins_to_biome(map: &BTreeMap<&str, RuleMetadata>, buffer: &mut Vec) -> Result<()> { - writeln!(buffer, "## ESlint plugin rules to Biome")?; - writeln!( - buffer, - r#"| Plugin name | Plugin rule name | Biome rule name |"# - )?; - writeln!(buffer, r#"| ---- | ---- | --- |"#)?; - let mut eslint_plugin_to_biome = BTreeMap::new(); - - for (rule_name, metadata) in map { - if let Some(source) = &metadata.source { - if source.is_eslint_plugin() { - eslint_plugin_to_biome.insert(source, rule_name); - } - } + push_to_table(rules, &mut buffer)?; } - push_to_table(eslint_plugin_to_biome, buffer)?; - - Ok(()) + Ok(buffer) } -fn push_to_table(map: BTreeMap<&RuleSource, &&str>, buffer: &mut Vec) -> Result<()> { - for (rule_source, rule_name) in map { - let biome_link = rule_name.to_case(Case::Kebab); - let source_rule_name = rule_source.as_rule_name(); - let source_link = rule_source.as_rule_url(); - - if rule_source.is_eslint_plugin() { - writeln!( - buffer, - "| `{}` | [{}]({}) |[{}](/linter/rules/{}) |", - rule_source, source_rule_name, source_link, rule_name, biome_link - )?; - } else { - writeln!( - buffer, - "| [{}]({}) |[{}](/linter/rules/{}) |", - source_rule_name, source_link, rule_name, biome_link - )?; - } +fn push_to_table(source_set: BTreeSet, buffer: &mut Vec) -> Result<()> { + for source_set in source_set { + writeln!( + buffer, + "| [{}]({}) |[{}](/linter/rules/{}) |", + source_set.source_rule_name, + source_set.source_link, + source_set.biome_rule_name, + source_set.biome_link + )?; } Ok(()) From c21310512df3a934228b77141183c7e33cc38b62 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Thu, 18 Jan 2024 11:56:22 +0000 Subject: [PATCH 3/7] footnotes --- crates/biome_analyze/src/rule.rs | 6 + .../src/components/generated/Sources.astro | 426 ------------------ website/src/components/generated/Sources.md | 186 ++++++++ .../content/docs/linter/linter-sources.mdx | 330 +++++++------- .../src/content/docs/linter/rule-sources.mdx | 163 ------- xtask/lintdoc/src/rules_sources.rs | 46 +- 6 files changed, 410 insertions(+), 747 deletions(-) delete mode 100644 website/src/components/generated/Sources.astro create mode 100644 website/src/components/generated/Sources.md delete mode 100644 website/src/content/docs/linter/rule-sources.mdx diff --git a/crates/biome_analyze/src/rule.rs b/crates/biome_analyze/src/rule.rs index d51ce4619c03..018365e85653 100644 --- a/crates/biome_analyze/src/rule.rs +++ b/crates/biome_analyze/src/rule.rs @@ -216,6 +216,12 @@ pub enum RuleSourceKind { Inspired, } +impl RuleSourceKind { + pub const fn is_inspired(&self) -> bool { + matches!(self, Self::Inspired) + } +} + impl RuleMetadata { pub const fn new(version: &'static str, name: &'static str, docs: &'static str) -> Self { Self { diff --git a/website/src/components/generated/Sources.astro b/website/src/components/generated/Sources.astro deleted file mode 100644 index c7f0453d4105..000000000000 --- a/website/src/components/generated/Sources.astro +++ /dev/null @@ -1,426 +0,0 @@ -

ESlint rules to Biome

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ESLint Rule nameBiome Rule name
constructor-supernoInvalidConstructorSuper
curlyuseBlockStatements
default-case-lastuseDefaultSwitchClauseLast
default-param-lastuseDefaultParameterLast
dot-notationuseLiteralKeys
eqeqeqnoDoubleEquals
for-directionuseValidForDirection
getter-returnuseGetterReturn
no-async-promise-executornoAsyncPromiseExecutor
no-case-declarationsnoSwitchDeclarations
no-class-assignnoClassAssign
no-compare-neg-zeronoCompareNegZero
no-cond-assignnoAssignInExpressions
no-consolenoConsoleLog
no-const-assignnoConstAssign
no-constant-conditionnoConstantCondition
no-constructor-returnnoConstructorReturn
no-control-regexnoControlCharactersInRegex
no-debuggernoDebugger
no-dupe-argsnoDuplicateParameters
no-dupe-class-membersnoDuplicateClassMembers
no-dupe-keysnoDuplicateObjectKeys
no-duplicate-casenoDuplicateCase
no-else-returnnoUselessElse
no-empty-character-classnoEmptyCharacterClassInRegex
no-empty-patternnoEmptyPattern
no-ex-assignnoCatchAssign
no-extra-boolean-castnoExtraBooleanCast
no-extra-labelnoUselessLabel
no-fallthroughnoFallthroughSwitchClause
no-func-assignnoFunctionAssign
no-import-assignnoImportAssign
no-inner-declarationsnoInnerDeclarations
no-label-varnoLabelVar
no-labelsnoConfusingLabels
no-lonely-ifuseCollapsedElseIf
no-loss-of-precisionnoPrecisionLoss
no-negated-conditionnoNegationElse
no-new-native-nonconstructornoInvalidNewBuiltin
no-new-symbolnoNewSymbol
no-nonoctal-decimal-escapenoNonoctalDecimalEscape
no-obj-callsnoGlobalObjectCalls
no-param-reassignnoParameterAssign
no-prototype-builtinsnoPrototypeBuiltins
no-regex-spacesnoMultipleSpacesInRegularExpressionLiterals
no-restricted-globalsnoRestrictedGlobals
no-self-assignnoSelfAssign
no-self-comparenoSelfCompare
no-sequencesnoCommaOperator
no-setter-returnnoSetterReturn
no-shadow-restricted-namesnoShadowRestrictedNames
no-sparse-arraynoSparseArray
no-this-before-supernoUnreachableSuper
no-undefnoUndeclaredVariables
no-unreachablenoUnreachable
no-unsafe-finallynoUnsafeFinally
no-unsafe-negationnoUnsafeNegation
no-unsafe-optional-chainingnoUnsafeOptionalChaining
no-unused-labelsnoUnusedLabels
no-unused-varsnoUnusedVariables
no-useless-catchnoUselessCatch
no-useless-renamenoUselessRename
no-varnoVar
no-voidnoVoid
no-withnoWith
one-varuseSingleVarDeclarator
operator-assignmentuseShorthandAssign
prefer-arrow-callbackuseArrowFunction
prefer-constuseConst
prefer-exponentiation-operatoruseExponentiationOperator
prefer-numeric-literalsuseNumericLiterals
prefer-regex-literalsuseRegexLiterals
prefer-rest-paramsnoArguments
prefer-templateuseTemplate
require-yielduseYield
use-isnanuseIsNan
valid-typeofuseValidTypeof
-

typescript-eslint rules to Biome

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
typescript-eslint Rule nameBiome Rule name
array-typeuseShorthandArrayType
ban-typesnoBannedTypes
naming-conventionuseNamingConvention
no-empty-interfacenoEmptyInterface
no-explicit-anynoExplicitAny
no-extra-non-null-assertionnoExtraNonNullAssertion
no-extraneous-classnoStaticOnlyClass
no-inferrable-typesnoInferrableTypes
no-invalid-void-typenoConfusingVoidType
no-misused-newnoMisleadingInstantiator
no-namespacenoNamespace
no-non-null-assertionnoNonNullAssertion
no-redeclarenoRedeclare
no-this-aliasnoUselessThisAlias
no-unnecessary-type-constraintnoUselessTypeConstraint
no-unsafe-declaration-mergingnoUnsafeDeclarationMerging
no-useless-constructornoUselessConstructor
no-useless-empty-exportnoUselessEmptyExport
no-useless-template-literalsnoUnusedTemplateLiteral
parameter-propertiesnoParameterProperties
prefer-as-constuseAsConstAssertion
prefer-enum-initializersuseEnumInitializers
prefer-literal-enum-memberuseLiteralEnumMembers
prefer-namespace-keyworduseNamespaceKeyword
prefer-optional-chainuseOptionalChain
diff --git a/website/src/components/generated/Sources.md b/website/src/components/generated/Sources.md new file mode 100644 index 000000000000..9305ba17b0bf --- /dev/null +++ b/website/src/components/generated/Sources.md @@ -0,0 +1,186 @@ +## Clippy rules to Biome +| Clippy rule name | Biome rule name | +| ---- | ---- | +| [approx_constant](https://rust-lang.github.io/rust-clippy/master/#/approx_constant) |[noApproximativeNumericConstant](/linter/rules//lint/rules/no-approximative-numeric-constant) | +| [match_str_case_mismatch](https://rust-lang.github.io/rust-clippy/master/#/match_str_case_mismatch) |[noStringCaseMismatch](/linter/rules//lint/rules/no-string-case-mismatch) | +| [misrefactored_assign_op](https://rust-lang.github.io/rust-clippy/master/#/misrefactored_assign_op) |[noMisrefactoredShorthandAssign](/linter/rules//lint/rules/no-misrefactored-shorthand-assign) | +## ESLint rules to Biome +| ESLint rule name | Biome rule name | +| ---- | ---- | +| [constructor-super](https://eslint.org/docs/latest/rules/constructor-super) |[noInvalidConstructorSuper](/linter/rules//lint/rules/no-invalid-constructor-super) | +| [curly](https://eslint.org/docs/latest/rules/curly) |[useBlockStatements](/linter/rules//lint/rules/use-block-statements) | +| [default-case-last](https://eslint.org/docs/latest/rules/default-case-last) |[useDefaultSwitchClauseLast](/linter/rules//lint/rules/use-default-switch-clause-last) | +| [default-param-last](https://eslint.org/docs/latest/rules/default-param-last) |[useDefaultParameterLast](/linter/rules//lint/rules/use-default-parameter-last) | +| [dot-notation](https://eslint.org/docs/latest/rules/dot-notation) |[useLiteralKeys](/linter/rules//lint/rules/use-literal-keys) | +| [eqeqeq](https://eslint.org/docs/latest/rules/eqeqeq) |[noDoubleEquals](/linter/rules//lint/rules/no-double-equals) | +| [for-direction](https://eslint.org/docs/latest/rules/for-direction) |[useValidForDirection](/linter/rules//lint/rules/use-valid-for-direction) | +| [getter-return](https://eslint.org/docs/latest/rules/getter-return) |[useGetterReturn](/linter/rules//lint/rules/use-getter-return) | +| [no-async-promise-executor](https://eslint.org/docs/latest/rules/no-async-promise-executor) |[noAsyncPromiseExecutor](/linter/rules//lint/rules/no-async-promise-executor) | +| [no-case-declarations](https://eslint.org/docs/latest/rules/no-case-declarations) |[noSwitchDeclarations](/linter/rules//lint/rules/no-switch-declarations) | +| [no-class-assign](https://eslint.org/docs/latest/rules/no-class-assign) |[noClassAssign](/linter/rules//lint/rules/no-class-assign) | +| [no-compare-neg-zero](https://eslint.org/docs/latest/rules/no-compare-neg-zero) |[noCompareNegZero](/linter/rules//lint/rules/no-compare-neg-zero) | +| [no-cond-assign](https://eslint.org/docs/latest/rules/no-cond-assign) |[noAssignInExpressions](/linter/rules//lint/rules/no-assign-in-expressions) | +| [no-console](https://eslint.org/docs/latest/rules/no-console) |[noConsoleLog](/linter/rules//lint/rules/no-console-log) | +| [no-const-assign](https://eslint.org/docs/latest/rules/no-const-assign) |[noConstAssign](/linter/rules//lint/rules/no-const-assign) | +| [no-constant-condition](https://eslint.org/docs/latest/rules/no-constant-condition) |[noConstantCondition](/linter/rules//lint/rules/no-constant-condition) | +| [no-constructor-return](https://eslint.org/docs/latest/rules/no-constructor-return) |[noConstructorReturn](/linter/rules//lint/rules/no-constructor-return) | +| [no-control-regex](https://eslint.org/docs/latest/rules/no-control-regex) |[noControlCharactersInRegex](/linter/rules//lint/rules/no-control-characters-in-regex) | +| [no-debugger](https://eslint.org/docs/latest/rules/no-debugger) |[noDebugger](/linter/rules//lint/rules/no-debugger) | +| [no-dupe-args](https://eslint.org/docs/latest/rules/no-dupe-args) |[noDuplicateParameters](/linter/rules//lint/rules/no-duplicate-parameters) | +| [no-dupe-class-members](https://eslint.org/docs/latest/rules/no-dupe-class-members) |[noDuplicateClassMembers](/linter/rules//lint/rules/no-duplicate-class-members) | +| [no-dupe-keys](https://eslint.org/docs/latest/rules/no-dupe-keys) |[noDuplicateObjectKeys](/linter/rules//lint/rules/no-duplicate-object-keys) | +| [no-duplicate-case](https://eslint.org/docs/latest/rules/no-duplicate-case) |[noDuplicateCase](/linter/rules//lint/rules/no-duplicate-case) | +| [no-else-return](https://eslint.org/docs/latest/rules/no-else-return) |[noUselessElse](/linter/rules//lint/rules/no-useless-else) | +| [no-empty-character-class](https://eslint.org/docs/latest/rules/no-empty-character-class) |[noEmptyCharacterClassInRegex](/linter/rules//lint/rules/no-empty-character-class-in-regex) | +| [no-empty-pattern](https://eslint.org/docs/latest/rules/no-empty-pattern) |[noEmptyPattern](/linter/rules//lint/rules/no-empty-pattern) | +| [no-ex-assign](https://eslint.org/docs/latest/rules/no-ex-assign) |[noCatchAssign](/linter/rules//lint/rules/no-catch-assign) | +| [no-extra-boolean-cast](https://eslint.org/docs/latest/rules/no-extra-boolean-cast) |[noExtraBooleanCast](/linter/rules//lint/rules/no-extra-boolean-cast) | +| [no-extra-label](https://eslint.org/docs/latest/rules/no-extra-label) |[noUselessLabel](/linter/rules//lint/rules/no-useless-label) | +| [no-fallthrough](https://eslint.org/docs/latest/rules/no-fallthrough) |[noFallthroughSwitchClause](/linter/rules//lint/rules/no-fallthrough-switch-clause) | +| [no-func-assign](https://eslint.org/docs/latest/rules/no-func-assign) |[noFunctionAssign](/linter/rules//lint/rules/no-function-assign) | +| [no-import-assign](https://eslint.org/docs/latest/rules/no-import-assign) |[noImportAssign](/linter/rules//lint/rules/no-import-assign) | +| [no-inner-declarations](https://eslint.org/docs/latest/rules/no-inner-declarations) |[noInnerDeclarations](/linter/rules//lint/rules/no-inner-declarations) | +| [no-label-var](https://eslint.org/docs/latest/rules/no-label-var) |[noLabelVar](/linter/rules//lint/rules/no-label-var) | +| [no-labels](https://eslint.org/docs/latest/rules/no-labels) |[noConfusingLabels](/linter/rules//lint/rules/no-confusing-labels) | +| [no-lonely-if](https://eslint.org/docs/latest/rules/no-lonely-if) |[useCollapsedElseIf](/linter/rules//lint/rules/use-collapsed-else-if) | +| [no-loss-of-precision](https://eslint.org/docs/latest/rules/no-loss-of-precision) |[noPrecisionLoss](/linter/rules//lint/rules/no-precision-loss) | +| [no-negated-condition](https://eslint.org/docs/latest/rules/no-negated-condition) |[noNegationElse](/linter/rules//lint/rules/no-negation-else) | +| [no-new-native-nonconstructor](https://eslint.org/docs/latest/rules/no-new-native-nonconstructor) |[noInvalidNewBuiltin](/linter/rules//lint/rules/no-invalid-new-builtin) | +| [no-new-symbol](https://eslint.org/docs/latest/rules/no-new-symbol) |[noNewSymbol](/linter/rules//lint/rules/no-new-symbol) | +| [no-nonoctal-decimal-escape](https://eslint.org/docs/latest/rules/no-nonoctal-decimal-escape) |[noNonoctalDecimalEscape](/linter/rules//lint/rules/no-nonoctal-decimal-escape) | +| [no-obj-calls](https://eslint.org/docs/latest/rules/no-obj-calls) |[noGlobalObjectCalls](/linter/rules//lint/rules/no-global-object-calls) | +| [no-param-reassign](https://eslint.org/docs/latest/rules/no-param-reassign) |[noParameterAssign](/linter/rules//lint/rules/no-parameter-assign) | +| [no-prototype-builtins](https://eslint.org/docs/latest/rules/no-prototype-builtins) |[noPrototypeBuiltins](/linter/rules//lint/rules/no-prototype-builtins) | +| [no-regex-spaces](https://eslint.org/docs/latest/rules/no-regex-spaces) |[noMultipleSpacesInRegularExpressionLiterals](/linter/rules//lint/rules/no-multiple-spaces-in-regular-expression-literals) | +| [no-restricted-globals](https://eslint.org/docs/latest/rules/no-restricted-globals) |[noRestrictedGlobals](/linter/rules//lint/rules/no-restricted-globals) | +| [no-self-assign](https://eslint.org/docs/latest/rules/no-self-assign) |[noSelfAssign](/linter/rules//lint/rules/no-self-assign) | +| [no-self-compare](https://eslint.org/docs/latest/rules/no-self-compare) |[noSelfCompare](/linter/rules//lint/rules/no-self-compare) | +| [no-sequences](https://eslint.org/docs/latest/rules/no-sequences) |[noCommaOperator](/linter/rules//lint/rules/no-comma-operator) | +| [no-setter-return](https://eslint.org/docs/latest/rules/no-setter-return) |[noSetterReturn](/linter/rules//lint/rules/no-setter-return) | +| [no-shadow-restricted-names](https://eslint.org/docs/latest/rules/no-shadow-restricted-names) |[noShadowRestrictedNames](/linter/rules//lint/rules/no-shadow-restricted-names) | +| [no-sparse-array](https://eslint.org/docs/latest/rules/no-sparse-array) |[noSparseArray](/linter/rules//lint/rules/no-sparse-array) | +| [no-this-before-super](https://eslint.org/docs/latest/rules/no-this-before-super) |[noUnreachableSuper](/linter/rules//lint/rules/no-unreachable-super) | +| [no-undef](https://eslint.org/docs/latest/rules/no-undef) |[noUndeclaredVariables](/linter/rules//lint/rules/no-undeclared-variables) | +| [no-unreachable](https://eslint.org/docs/latest/rules/no-unreachable) |[noUnreachable](/linter/rules//lint/rules/no-unreachable) | +| [no-unsafe-finally](https://eslint.org/docs/latest/rules/no-unsafe-finally) |[noUnsafeFinally](/linter/rules//lint/rules/no-unsafe-finally) | +| [no-unsafe-negation](https://eslint.org/docs/latest/rules/no-unsafe-negation) |[noUnsafeNegation](/linter/rules//lint/rules/no-unsafe-negation) | +| [no-unsafe-optional-chaining](https://eslint.org/docs/latest/rules/no-unsafe-optional-chaining) |[noUnsafeOptionalChaining](/linter/rules//lint/rules/no-unsafe-optional-chaining) | +| [no-unused-labels](https://eslint.org/docs/latest/rules/no-unused-labels) |[noUnusedLabels](/linter/rules//lint/rules/no-unused-labels) | +| [no-unused-vars](https://eslint.org/docs/latest/rules/no-unused-vars) |[noUnusedVariables](/linter/rules//lint/rules/no-unused-variables) | +| [no-useless-catch](https://eslint.org/docs/latest/rules/no-useless-catch) |[noUselessCatch](/linter/rules//lint/rules/no-useless-catch) | +| [no-useless-rename](https://eslint.org/docs/latest/rules/no-useless-rename) |[noUselessRename](/linter/rules//lint/rules/no-useless-rename) | +| [no-var](https://eslint.org/docs/latest/rules/no-var) |[noVar](/linter/rules//lint/rules/no-var) | +| [no-void](https://eslint.org/docs/latest/rules/no-void) |[noVoid](/linter/rules//lint/rules/no-void) | +| [no-with](https://eslint.org/docs/latest/rules/no-with) |[noWith](/linter/rules//lint/rules/no-with) | +| [one-var](https://eslint.org/docs/latest/rules/one-var) |[useSingleVarDeclarator](/linter/rules//lint/rules/use-single-var-declarator) | +| [operator-assignment](https://eslint.org/docs/latest/rules/operator-assignment) |[useShorthandAssign](/linter/rules//lint/rules/use-shorthand-assign) | +| [prefer-arrow-callback](https://eslint.org/docs/latest/rules/prefer-arrow-callback) |[useArrowFunction](/linter/rules//lint/rules/use-arrow-function) | +| [prefer-const](https://eslint.org/docs/latest/rules/prefer-const) |[useConst](/linter/rules//lint/rules/use-const) | +| [prefer-exponentiation-operator](https://eslint.org/docs/latest/rules/prefer-exponentiation-operator) |[useExponentiationOperator](/linter/rules//lint/rules/use-exponentiation-operator) | +| [prefer-numeric-literals](https://eslint.org/docs/latest/rules/prefer-numeric-literals) |[useNumericLiterals](/linter/rules//lint/rules/use-numeric-literals) | +| [prefer-regex-literals](https://eslint.org/docs/latest/rules/prefer-regex-literals) |[useRegexLiterals](/linter/rules//lint/rules/use-regex-literals) | +| [prefer-rest-params](https://eslint.org/docs/latest/rules/prefer-rest-params) |[noArguments](/linter/rules//lint/rules/no-arguments) | +| [prefer-template](https://eslint.org/docs/latest/rules/prefer-template) |[useTemplate](/linter/rules//lint/rules/use-template) | +| [require-yield](https://eslint.org/docs/latest/rules/require-yield) |[useYield](/linter/rules//lint/rules/use-yield) | +| [use-isnan](https://eslint.org/docs/latest/rules/use-isnan) |[useIsNan](/linter/rules//lint/rules/use-is-nan) | +| [valid-typeof](https://eslint.org/docs/latest/rules/valid-typeof) |[useValidTypeof](/linter/rules//lint/rules/use-valid-typeof) | +## eslint-plugin-import rules to Biome +| eslint-plugin-import rule name | Biome rule name | +| ---- | ---- | +| [no-default-export](https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-default-export.md) |[noDefaultExport](/linter/rules//lint/rules/no-default-export) | +## eslint-plugin-jsx-a11y rules to Biome +| eslint-plugin-jsx-a11y rule name | Biome rule name | +| ---- | ---- | +| [alt-text](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/alt-text.md) |[useAltText](/linter/rules//lint/rules/use-alt-text) | +| [anchor-has-content](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/anchor-has-content.md) |[useAnchorContent](/linter/rules//lint/rules/use-anchor-content) | +| [anchor-is-valid](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/anchor-is-valid.md) |[useValidAnchor](/linter/rules//lint/rules/use-valid-anchor) | +| [aria-activedescendant-has-tabindex](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-activedescendant-has-tabindex.md) |[useAriaActivedescendantWithTabindex](/linter/rules//lint/rules/use-aria-activedescendant-with-tabindex) | +| [aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-props.md) |[useValidAriaProps](/linter/rules//lint/rules/use-valid-aria-props) | +| [aria-proptypes](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-proptypes.md) |[useValidAriaValues](/linter/rules//lint/rules/use-valid-aria-values) | +| [aria-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-role.md) |[useValidAriaRole](/linter/rules//lint/rules/use-valid-aria-role) | +| [aria-unsupported-elements](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-unsupported-elements.md) |[noAriaUnsupportedElements](/linter/rules//lint/rules/no-aria-unsupported-elements) | +| [click-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/click-events-have-key-events.md) |[useKeyWithClickEvents](/linter/rules//lint/rules/use-key-with-click-events) | +| [heading-has-content](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/heading-has-content.md) |[useHeadingContent](/linter/rules//lint/rules/use-heading-content) | +| [html-has-lang](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/html-has-lang.md) |[useHtmlLang](/linter/rules//lint/rules/use-html-lang) | +| [iframe-has-title](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/iframe-has-title.md) |[useIframeTitle](/linter/rules//lint/rules/use-iframe-title) | +| [lang](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/lang.md) |[useValidLang](/linter/rules//lint/rules/use-valid-lang) | +| [media-has-caption](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/media-has-caption.md) |[useMediaCaption](/linter/rules//lint/rules/use-media-caption) | +| [mouse-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/mouse-events-have-key-events.md) |[useKeyWithMouseEvents](/linter/rules//lint/rules/use-key-with-mouse-events) | +| [no-access-key](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-access-key.md) |[noAccessKey](/linter/rules//lint/rules/no-access-key) | +| [no-aria-hidden-on-focusable](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-aria-hidden-on-focusable.md) |[noAriaHiddenOnFocusable](/linter/rules//lint/rules/no-aria-hidden-on-focusable) | +| [no-autofocus](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-autofocus.md) |[noAutofocus](/linter/rules//lint/rules/no-autofocus) | +| [no-distracting-elements](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-distracting-elements.md) |[noDistractingElements](/linter/rules//lint/rules/no-distracting-elements) | +| [no-interactive-element-to-noninteractive-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-interactive-element-to-noninteractive-role.md) |[noInteractiveElementToNoninteractiveRole](/linter/rules//lint/rules/no-interactive-element-to-noninteractive-role) | +| [no-noninteractive-element-to-interactive-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-noninteractive-element-to-interactive-role.md) |[noNoninteractiveElementToInteractiveRole](/linter/rules//lint/rules/no-noninteractive-element-to-interactive-role) | +| [no-noninteractive-tabindex](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-noninteractive-tabindex.md) |[noNoninteractiveTabindex](/linter/rules//lint/rules/no-noninteractive-tabindex) | +| [no-redundant-roles](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-redundant-roles.md) |[noRedundantAlt](/linter/rules//lint/rules/no-redundant-alt) | +| [role-has-required-aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/role-has-required-aria-props.md) |[useAriaPropsForRole](/linter/rules//lint/rules/use-aria-props-for-role) | +| [scope](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/scope.md) |[noHeaderScope](/linter/rules//lint/rules/no-header-scope) | +| [tabindex-no-positive](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/tabindex-no-positive.md) |[noPositiveTabindex](/linter/rules//lint/rules/no-positive-tabindex) | +## eslint-plugin-mysticates rules to Biome +| eslint-plugin-mysticates rule name | Biome rule name | +| ---- | ---- | +| [no-this-in-static](https://github.com/mysticatea/eslint-plugin/blob/master/docs/rules/no-this-in-static.md) |[noThisInStatic](/linter/rules//lint/rules/no-this-in-static) | +## eslint-plugin-react rules to Biome +| eslint-plugin-react rule name | Biome rule name | +| ---- | ---- | +| [button-has-type](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/button-has-type.md) |[useButtonType](/linter/rules//lint/rules/use-button-type) | +| [jsx-boolean-value](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-boolean-value.md) |[noImplicitBoolean](/linter/rules//lint/rules/no-implicit-boolean) | +| [jsx-fragments](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-fragments.md) |[useFragmentSyntax](/linter/rules//lint/rules/use-fragment-syntax) | +| [jsx-no-comment-textnodes](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-comment-textnodes.md) |[noCommentText](/linter/rules//lint/rules/no-comment-text) | +| [jsx-no-duplicate-props](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-duplicate-props.md) |[noDuplicateJsxProps](/linter/rules//lint/rules/no-duplicate-jsx-props) | +| [jsx-no-target-blank](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-target-blank.md) |[noBlankTarget](/linter/rules//lint/rules/no-blank-target) | +| [jsx-no-useless-fragment](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-useless-fragment.md) |[noUselessFragments](/linter/rules//lint/rules/no-useless-fragments) | +| [no-array-index-key](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-array-index-key.md) |[noArrayIndexKey](/linter/rules//lint/rules/no-array-index-key) | +| [no-children-prop](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-children-prop.md) |[noChildrenProp](/linter/rules//lint/rules/no-children-prop) | +| [no-danger](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger.md) |[noDangerouslySetInnerHtmlWithChildren](/linter/rules//lint/rules/no-dangerously-set-inner-html-with-children) | +| [no-danger-with-children](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger-with-children.md) |[noDangerouslySetInnerHtml](/linter/rules//lint/rules/no-dangerously-set-inner-html) | +| [void-dom-elements-no-children](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/void-dom-elements-no-children.md) |[noVoidElementsWithChildren](/linter/rules//lint/rules/no-void-elements-with-children) | +## eslint-plugin-react-hooks rules to Biome +| eslint-plugin-react-hooks rule name | Biome rule name | +| ---- | ---- | +| [exhaustive-deps](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md) |[useExhaustiveDependencies](/linter/rules//lint/rules/use-exhaustive-dependencies) | +| [rules-of-hooks](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md) |[useHookAtTopLevel](/linter/rules//lint/rules/use-hook-at-top-level) | +## eslint-plugin-sonarjs rules to Biome +| eslint-plugin-sonarjs rule name | Biome rule name | +| ---- | ---- | +| [cognitive-complexity](https://github.com/SonarSource/eslint-plugin-sonarjs/blob/HEAD/docs/rules/cognitive-complexity.md) |[noExcessiveCognitiveComplexity](/linter/rules//lint/rules/no-excessive-cognitive-complexity) | +## eslint-plugin-stylistic rules to Biome +| eslint-plugin-stylistic rule name | Biome rule name | +| ---- | ---- | +| [jsx-self-closing-comp](https://eslint.style/rules/default/jsx-self-closing-comp) |[useSelfClosingElements](/linter/rules//lint/rules/use-self-closing-elements) | +## eslint-plugin-typescript rules to Biome +| eslint-plugin-typescript rule name | Biome rule name | +| ---- | ---- | +| [array-type](https://typescript-eslint.io/rules/array-type) |[useShorthandArrayType](/linter/rules//lint/rules/use-shorthand-array-type) | +| [ban-types](https://typescript-eslint.io/rules/ban-types) |[noBannedTypes](/linter/rules//lint/rules/no-banned-types) | +| [naming-convention](https://typescript-eslint.io/rules/naming-convention) |[useNamingConvention](/linter/rules//lint/rules/use-naming-convention) | +| [no-empty-interface](https://typescript-eslint.io/rules/no-empty-interface) |[noEmptyInterface](/linter/rules//lint/rules/no-empty-interface) | +| [no-explicit-any](https://typescript-eslint.io/rules/no-explicit-any) |[noExplicitAny](/linter/rules//lint/rules/no-explicit-any) | +| [no-extra-non-null-assertion](https://typescript-eslint.io/rules/no-extra-non-null-assertion) |[noExtraNonNullAssertion](/linter/rules//lint/rules/no-extra-non-null-assertion) | +| [no-extraneous-class](https://typescript-eslint.io/rules/no-extraneous-class) |[noStaticOnlyClass](/linter/rules//lint/rules/no-static-only-class) | +| [no-inferrable-types](https://typescript-eslint.io/rules/no-inferrable-types) |[noInferrableTypes](/linter/rules//lint/rules/no-inferrable-types) | +| [no-invalid-void-type](https://typescript-eslint.io/rules/no-invalid-void-type) |[noConfusingVoidType](/linter/rules//lint/rules/no-confusing-void-type) | +| [no-misused-new](https://typescript-eslint.io/rules/no-misused-new) |[noMisleadingInstantiator](/linter/rules//lint/rules/no-misleading-instantiator) | +| [no-namespace](https://typescript-eslint.io/rules/no-namespace) |[noNamespace](/linter/rules//lint/rules/no-namespace) | +| [no-non-null-assertion](https://typescript-eslint.io/rules/no-non-null-assertion) |[noNonNullAssertion](/linter/rules//lint/rules/no-non-null-assertion) | +| [no-redeclare](https://typescript-eslint.io/rules/no-redeclare) |[noRedeclare](/linter/rules//lint/rules/no-redeclare) | +| [no-this-alias](https://typescript-eslint.io/rules/no-this-alias) |[noUselessThisAlias](/linter/rules//lint/rules/no-useless-this-alias) | +| [no-unnecessary-type-constraint](https://typescript-eslint.io/rules/no-unnecessary-type-constraint) |[noUselessTypeConstraint](/linter/rules//lint/rules/no-useless-type-constraint) | +| [no-unsafe-declaration-merging](https://typescript-eslint.io/rules/no-unsafe-declaration-merging) |[noUnsafeDeclarationMerging](/linter/rules//lint/rules/no-unsafe-declaration-merging) | +| [no-useless-constructor](https://typescript-eslint.io/rules/no-useless-constructor) |[noUselessConstructor](/linter/rules//lint/rules/no-useless-constructor) | +| [no-useless-empty-export](https://typescript-eslint.io/rules/no-useless-empty-export) |[noUselessEmptyExport](/linter/rules//lint/rules/no-useless-empty-export) | +| [no-useless-template-literals](https://typescript-eslint.io/rules/no-useless-template-literals) |[noUnusedTemplateLiteral](/linter/rules//lint/rules/no-unused-template-literal) | +| [parameter-properties](https://typescript-eslint.io/rules/parameter-properties) |[noParameterProperties](/linter/rules//lint/rules/no-parameter-properties) | +| [prefer-as-const](https://typescript-eslint.io/rules/prefer-as-const) |[useAsConstAssertion](/linter/rules//lint/rules/use-as-const-assertion) | +| [prefer-enum-initializers](https://typescript-eslint.io/rules/prefer-enum-initializers) |[useEnumInitializers](/linter/rules//lint/rules/use-enum-initializers) | +| [prefer-literal-enum-member](https://typescript-eslint.io/rules/prefer-literal-enum-member) |[useLiteralEnumMembers](/linter/rules//lint/rules/use-literal-enum-members) | +| [prefer-namespace-keyword](https://typescript-eslint.io/rules/prefer-namespace-keyword) |[useNamespaceKeyword](/linter/rules//lint/rules/use-namespace-keyword) | +| [prefer-optional-chain](https://typescript-eslint.io/rules/prefer-optional-chain) |[useOptionalChain](/linter/rules//lint/rules/use-optional-chain) | +## eslint-plugin-unicorn rules to Biome +| eslint-plugin-unicorn rule name | Biome rule name | +| ---- | ---- | +| [no-array-for-each](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-array-for-each.md) |[noForEach](/linter/rules//lint/rules/no-for-each) | +| [no-instanceof-array](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-instanceof-array.md) |[useIsArray](/linter/rules//lint/rules/use-is-array) | +| [no-useless-switch-case](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-useless-switch-case.md) |[noUselessSwitchCase](/linter/rules//lint/rules/no-useless-switch-case) | +| [prefer-array-flat-map](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-array-flat-map.md) |[useFlatMap](/linter/rules//lint/rules/use-flat-map) | diff --git a/website/src/content/docs/linter/linter-sources.mdx b/website/src/content/docs/linter/linter-sources.mdx index 90e4bc8bc30a..a56ec12f6995 100644 --- a/website/src/content/docs/linter/linter-sources.mdx +++ b/website/src/content/docs/linter/linter-sources.mdx @@ -3,189 +3,213 @@ title: Linter sources description: A page that maps lint rules from other sources to Biome --- +:::note +Some **Biome** rules might **not** have options, compared to the original rule. +::: ## Clippy rules to Biome | Clippy rule name | Biome rule name | | ---- | ---- | -| [approx_constant](https://rust-lang.github.io/rust-clippy/master/#/approx_constant) |[noApproximativeNumericConstant](/linter/rules//lint/rules/no-approximative-numeric-constant) | -| [match_str_case_mismatch](https://rust-lang.github.io/rust-clippy/master/#/match_str_case_mismatch) |[noStringCaseMismatch](/linter/rules//lint/rules/no-string-case-mismatch) | -| [misrefactored_assign_op](https://rust-lang.github.io/rust-clippy/master/#/misrefactored_assign_op) |[noMisrefactoredShorthandAssign](/linter/rules//lint/rules/no-misrefactored-shorthand-assign) | +| [approx_constant](https://rust-lang.github.io/rust-clippy/master/#/approx_constant) |[noApproximativeNumericConstant](/linter/rules//lint/rules/no-approximative-numeric-constant)[^1] | +| [match_str_case_mismatch](https://rust-lang.github.io/rust-clippy/master/#/match_str_case_mismatch) |[noStringCaseMismatch](/linter/rules//lint/rules/no-string-case-mismatch) | +| [misrefactored_assign_op](https://rust-lang.github.io/rust-clippy/master/#/misrefactored_assign_op) |[noMisrefactoredShorthandAssign](/linter/rules//lint/rules/no-misrefactored-shorthand-assign) | ## ESLint rules to Biome | ESLint rule name | Biome rule name | | ---- | ---- | -| [constructor-super](https://eslint.org/docs/latest/rules/constructor-super) |[noInvalidConstructorSuper](/linter/rules//lint/rules/no-invalid-constructor-super) | -| [curly](https://eslint.org/docs/latest/rules/curly) |[useBlockStatements](/linter/rules//lint/rules/use-block-statements) | -| [default-case-last](https://eslint.org/docs/latest/rules/default-case-last) |[useDefaultSwitchClauseLast](/linter/rules//lint/rules/use-default-switch-clause-last) | -| [default-param-last](https://eslint.org/docs/latest/rules/default-param-last) |[useDefaultParameterLast](/linter/rules//lint/rules/use-default-parameter-last) | -| [dot-notation](https://eslint.org/docs/latest/rules/dot-notation) |[useLiteralKeys](/linter/rules//lint/rules/use-literal-keys) | -| [eqeqeq](https://eslint.org/docs/latest/rules/eqeqeq) |[noDoubleEquals](/linter/rules//lint/rules/no-double-equals) | -| [for-direction](https://eslint.org/docs/latest/rules/for-direction) |[useValidForDirection](/linter/rules//lint/rules/use-valid-for-direction) | -| [getter-return](https://eslint.org/docs/latest/rules/getter-return) |[useGetterReturn](/linter/rules//lint/rules/use-getter-return) | -| [no-async-promise-executor](https://eslint.org/docs/latest/rules/no-async-promise-executor) |[noAsyncPromiseExecutor](/linter/rules//lint/rules/no-async-promise-executor) | -| [no-case-declarations](https://eslint.org/docs/latest/rules/no-case-declarations) |[noSwitchDeclarations](/linter/rules//lint/rules/no-switch-declarations) | -| [no-class-assign](https://eslint.org/docs/latest/rules/no-class-assign) |[noClassAssign](/linter/rules//lint/rules/no-class-assign) | -| [no-compare-neg-zero](https://eslint.org/docs/latest/rules/no-compare-neg-zero) |[noCompareNegZero](/linter/rules//lint/rules/no-compare-neg-zero) | -| [no-cond-assign](https://eslint.org/docs/latest/rules/no-cond-assign) |[noAssignInExpressions](/linter/rules//lint/rules/no-assign-in-expressions) | -| [no-console](https://eslint.org/docs/latest/rules/no-console) |[noConsoleLog](/linter/rules//lint/rules/no-console-log) | -| [no-const-assign](https://eslint.org/docs/latest/rules/no-const-assign) |[noConstAssign](/linter/rules//lint/rules/no-const-assign) | -| [no-constant-condition](https://eslint.org/docs/latest/rules/no-constant-condition) |[noConstantCondition](/linter/rules//lint/rules/no-constant-condition) | -| [no-constructor-return](https://eslint.org/docs/latest/rules/no-constructor-return) |[noConstructorReturn](/linter/rules//lint/rules/no-constructor-return) | -| [no-control-regex](https://eslint.org/docs/latest/rules/no-control-regex) |[noControlCharactersInRegex](/linter/rules//lint/rules/no-control-characters-in-regex) | -| [no-debugger](https://eslint.org/docs/latest/rules/no-debugger) |[noDebugger](/linter/rules//lint/rules/no-debugger) | -| [no-dupe-args](https://eslint.org/docs/latest/rules/no-dupe-args) |[noDuplicateParameters](/linter/rules//lint/rules/no-duplicate-parameters) | -| [no-dupe-class-members](https://eslint.org/docs/latest/rules/no-dupe-class-members) |[noDuplicateClassMembers](/linter/rules//lint/rules/no-duplicate-class-members) | -| [no-dupe-keys](https://eslint.org/docs/latest/rules/no-dupe-keys) |[noDuplicateObjectKeys](/linter/rules//lint/rules/no-duplicate-object-keys) | -| [no-duplicate-case](https://eslint.org/docs/latest/rules/no-duplicate-case) |[noDuplicateCase](/linter/rules//lint/rules/no-duplicate-case) | -| [no-else-return](https://eslint.org/docs/latest/rules/no-else-return) |[noUselessElse](/linter/rules//lint/rules/no-useless-else) | -| [no-empty-character-class](https://eslint.org/docs/latest/rules/no-empty-character-class) |[noEmptyCharacterClassInRegex](/linter/rules//lint/rules/no-empty-character-class-in-regex) | -| [no-empty-pattern](https://eslint.org/docs/latest/rules/no-empty-pattern) |[noEmptyPattern](/linter/rules//lint/rules/no-empty-pattern) | -| [no-ex-assign](https://eslint.org/docs/latest/rules/no-ex-assign) |[noCatchAssign](/linter/rules//lint/rules/no-catch-assign) | -| [no-extra-boolean-cast](https://eslint.org/docs/latest/rules/no-extra-boolean-cast) |[noExtraBooleanCast](/linter/rules//lint/rules/no-extra-boolean-cast) | -| [no-extra-label](https://eslint.org/docs/latest/rules/no-extra-label) |[noUselessLabel](/linter/rules//lint/rules/no-useless-label) | -| [no-fallthrough](https://eslint.org/docs/latest/rules/no-fallthrough) |[noFallthroughSwitchClause](/linter/rules//lint/rules/no-fallthrough-switch-clause) | -| [no-func-assign](https://eslint.org/docs/latest/rules/no-func-assign) |[noFunctionAssign](/linter/rules//lint/rules/no-function-assign) | -| [no-import-assign](https://eslint.org/docs/latest/rules/no-import-assign) |[noImportAssign](/linter/rules//lint/rules/no-import-assign) | -| [no-inner-declarations](https://eslint.org/docs/latest/rules/no-inner-declarations) |[noInnerDeclarations](/linter/rules//lint/rules/no-inner-declarations) | -| [no-label-var](https://eslint.org/docs/latest/rules/no-label-var) |[noLabelVar](/linter/rules//lint/rules/no-label-var) | -| [no-labels](https://eslint.org/docs/latest/rules/no-labels) |[noConfusingLabels](/linter/rules//lint/rules/no-confusing-labels) | -| [no-lonely-if](https://eslint.org/docs/latest/rules/no-lonely-if) |[useCollapsedElseIf](/linter/rules//lint/rules/use-collapsed-else-if) | -| [no-loss-of-precision](https://eslint.org/docs/latest/rules/no-loss-of-precision) |[noPrecisionLoss](/linter/rules//lint/rules/no-precision-loss) | -| [no-negated-condition](https://eslint.org/docs/latest/rules/no-negated-condition) |[noNegationElse](/linter/rules//lint/rules/no-negation-else) | -| [no-new-native-nonconstructor](https://eslint.org/docs/latest/rules/no-new-native-nonconstructor) |[noInvalidNewBuiltin](/linter/rules//lint/rules/no-invalid-new-builtin) | -| [no-new-symbol](https://eslint.org/docs/latest/rules/no-new-symbol) |[noNewSymbol](/linter/rules//lint/rules/no-new-symbol) | -| [no-nonoctal-decimal-escape](https://eslint.org/docs/latest/rules/no-nonoctal-decimal-escape) |[noNonoctalDecimalEscape](/linter/rules//lint/rules/no-nonoctal-decimal-escape) | -| [no-obj-calls](https://eslint.org/docs/latest/rules/no-obj-calls) |[noGlobalObjectCalls](/linter/rules//lint/rules/no-global-object-calls) | -| [no-param-reassign](https://eslint.org/docs/latest/rules/no-param-reassign) |[noParameterAssign](/linter/rules//lint/rules/no-parameter-assign) | -| [no-prototype-builtins](https://eslint.org/docs/latest/rules/no-prototype-builtins) |[noPrototypeBuiltins](/linter/rules//lint/rules/no-prototype-builtins) | -| [no-regex-spaces](https://eslint.org/docs/latest/rules/no-regex-spaces) |[noMultipleSpacesInRegularExpressionLiterals](/linter/rules//lint/rules/no-multiple-spaces-in-regular-expression-literals) | -| [no-restricted-globals](https://eslint.org/docs/latest/rules/no-restricted-globals) |[noRestrictedGlobals](/linter/rules//lint/rules/no-restricted-globals) | -| [no-self-assign](https://eslint.org/docs/latest/rules/no-self-assign) |[noSelfAssign](/linter/rules//lint/rules/no-self-assign) | -| [no-self-compare](https://eslint.org/docs/latest/rules/no-self-compare) |[noSelfCompare](/linter/rules//lint/rules/no-self-compare) | -| [no-sequences](https://eslint.org/docs/latest/rules/no-sequences) |[noCommaOperator](/linter/rules//lint/rules/no-comma-operator) | -| [no-setter-return](https://eslint.org/docs/latest/rules/no-setter-return) |[noSetterReturn](/linter/rules//lint/rules/no-setter-return) | -| [no-shadow-restricted-names](https://eslint.org/docs/latest/rules/no-shadow-restricted-names) |[noShadowRestrictedNames](/linter/rules//lint/rules/no-shadow-restricted-names) | -| [no-sparse-array](https://eslint.org/docs/latest/rules/no-sparse-array) |[noSparseArray](/linter/rules//lint/rules/no-sparse-array) | -| [no-this-before-super](https://eslint.org/docs/latest/rules/no-this-before-super) |[noUnreachableSuper](/linter/rules//lint/rules/no-unreachable-super) | -| [no-undef](https://eslint.org/docs/latest/rules/no-undef) |[noUndeclaredVariables](/linter/rules//lint/rules/no-undeclared-variables) | -| [no-unreachable](https://eslint.org/docs/latest/rules/no-unreachable) |[noUnreachable](/linter/rules//lint/rules/no-unreachable) | -| [no-unsafe-finally](https://eslint.org/docs/latest/rules/no-unsafe-finally) |[noUnsafeFinally](/linter/rules//lint/rules/no-unsafe-finally) | -| [no-unsafe-negation](https://eslint.org/docs/latest/rules/no-unsafe-negation) |[noUnsafeNegation](/linter/rules//lint/rules/no-unsafe-negation) | -| [no-unsafe-optional-chaining](https://eslint.org/docs/latest/rules/no-unsafe-optional-chaining) |[noUnsafeOptionalChaining](/linter/rules//lint/rules/no-unsafe-optional-chaining) | -| [no-unused-labels](https://eslint.org/docs/latest/rules/no-unused-labels) |[noUnusedLabels](/linter/rules//lint/rules/no-unused-labels) | -| [no-unused-vars](https://eslint.org/docs/latest/rules/no-unused-vars) |[noUnusedVariables](/linter/rules//lint/rules/no-unused-variables) | -| [no-useless-catch](https://eslint.org/docs/latest/rules/no-useless-catch) |[noUselessCatch](/linter/rules//lint/rules/no-useless-catch) | -| [no-useless-rename](https://eslint.org/docs/latest/rules/no-useless-rename) |[noUselessRename](/linter/rules//lint/rules/no-useless-rename) | -| [no-var](https://eslint.org/docs/latest/rules/no-var) |[noVar](/linter/rules//lint/rules/no-var) | -| [no-void](https://eslint.org/docs/latest/rules/no-void) |[noVoid](/linter/rules//lint/rules/no-void) | -| [no-with](https://eslint.org/docs/latest/rules/no-with) |[noWith](/linter/rules//lint/rules/no-with) | -| [one-var](https://eslint.org/docs/latest/rules/one-var) |[useSingleVarDeclarator](/linter/rules//lint/rules/use-single-var-declarator) | -| [operator-assignment](https://eslint.org/docs/latest/rules/operator-assignment) |[useShorthandAssign](/linter/rules//lint/rules/use-shorthand-assign) | -| [prefer-arrow-callback](https://eslint.org/docs/latest/rules/prefer-arrow-callback) |[useArrowFunction](/linter/rules//lint/rules/use-arrow-function) | -| [prefer-const](https://eslint.org/docs/latest/rules/prefer-const) |[useConst](/linter/rules//lint/rules/use-const) | -| [prefer-exponentiation-operator](https://eslint.org/docs/latest/rules/prefer-exponentiation-operator) |[useExponentiationOperator](/linter/rules//lint/rules/use-exponentiation-operator) | -| [prefer-numeric-literals](https://eslint.org/docs/latest/rules/prefer-numeric-literals) |[useNumericLiterals](/linter/rules//lint/rules/use-numeric-literals) | -| [prefer-regex-literals](https://eslint.org/docs/latest/rules/prefer-regex-literals) |[useRegexLiterals](/linter/rules//lint/rules/use-regex-literals) | -| [prefer-rest-params](https://eslint.org/docs/latest/rules/prefer-rest-params) |[noArguments](/linter/rules//lint/rules/no-arguments) | -| [prefer-template](https://eslint.org/docs/latest/rules/prefer-template) |[useTemplate](/linter/rules//lint/rules/use-template) | -| [require-yield](https://eslint.org/docs/latest/rules/require-yield) |[useYield](/linter/rules//lint/rules/use-yield) | -| [use-isnan](https://eslint.org/docs/latest/rules/use-isnan) |[useIsNan](/linter/rules//lint/rules/use-is-nan) | -| [valid-typeof](https://eslint.org/docs/latest/rules/valid-typeof) |[useValidTypeof](/linter/rules//lint/rules/use-valid-typeof) | +| [constructor-super](https://eslint.org/docs/latest/rules/constructor-super) |[noInvalidConstructorSuper](/linter/rules//lint/rules/no-invalid-constructor-super) | +| [curly](https://eslint.org/docs/latest/rules/curly) |[useBlockStatements](/linter/rules//lint/rules/use-block-statements) | +| [default-case-last](https://eslint.org/docs/latest/rules/default-case-last) |[useDefaultSwitchClauseLast](/linter/rules//lint/rules/use-default-switch-clause-last) | +| [default-param-last](https://eslint.org/docs/latest/rules/default-param-last) |[useDefaultParameterLast](/linter/rules//lint/rules/use-default-parameter-last) | +| [dot-notation](https://eslint.org/docs/latest/rules/dot-notation) |[useLiteralKeys](/linter/rules//lint/rules/use-literal-keys) | +| [eqeqeq](https://eslint.org/docs/latest/rules/eqeqeq) |[noDoubleEquals](/linter/rules//lint/rules/no-double-equals) | +| [for-direction](https://eslint.org/docs/latest/rules/for-direction) |[useValidForDirection](/linter/rules//lint/rules/use-valid-for-direction) | +| [getter-return](https://eslint.org/docs/latest/rules/getter-return) |[useGetterReturn](/linter/rules//lint/rules/use-getter-return) | +| [no-async-promise-executor](https://eslint.org/docs/latest/rules/no-async-promise-executor) |[noAsyncPromiseExecutor](/linter/rules//lint/rules/no-async-promise-executor) | +| [no-case-declarations](https://eslint.org/docs/latest/rules/no-case-declarations) |[noSwitchDeclarations](/linter/rules//lint/rules/no-switch-declarations) | +| [no-class-assign](https://eslint.org/docs/latest/rules/no-class-assign) |[noClassAssign](/linter/rules//lint/rules/no-class-assign) | +| [no-compare-neg-zero](https://eslint.org/docs/latest/rules/no-compare-neg-zero) |[noCompareNegZero](/linter/rules//lint/rules/no-compare-neg-zero) | +| [no-cond-assign](https://eslint.org/docs/latest/rules/no-cond-assign) |[noAssignInExpressions](/linter/rules//lint/rules/no-assign-in-expressions)[^2] | +| [no-console](https://eslint.org/docs/latest/rules/no-console) |[noConsoleLog](/linter/rules//lint/rules/no-console-log)[^3] | +| [no-const-assign](https://eslint.org/docs/latest/rules/no-const-assign) |[noConstAssign](/linter/rules//lint/rules/no-const-assign) | +| [no-constant-condition](https://eslint.org/docs/latest/rules/no-constant-condition) |[noConstantCondition](/linter/rules//lint/rules/no-constant-condition) | +| [no-constructor-return](https://eslint.org/docs/latest/rules/no-constructor-return) |[noConstructorReturn](/linter/rules//lint/rules/no-constructor-return) | +| [no-control-regex](https://eslint.org/docs/latest/rules/no-control-regex) |[noControlCharactersInRegex](/linter/rules//lint/rules/no-control-characters-in-regex) | +| [no-debugger](https://eslint.org/docs/latest/rules/no-debugger) |[noDebugger](/linter/rules//lint/rules/no-debugger) | +| [no-dupe-args](https://eslint.org/docs/latest/rules/no-dupe-args) |[noDuplicateParameters](/linter/rules//lint/rules/no-duplicate-parameters) | +| [no-dupe-class-members](https://eslint.org/docs/latest/rules/no-dupe-class-members) |[noDuplicateClassMembers](/linter/rules//lint/rules/no-duplicate-class-members) | +| [no-dupe-keys](https://eslint.org/docs/latest/rules/no-dupe-keys) |[noDuplicateObjectKeys](/linter/rules//lint/rules/no-duplicate-object-keys) | +| [no-duplicate-case](https://eslint.org/docs/latest/rules/no-duplicate-case) |[noDuplicateCase](/linter/rules//lint/rules/no-duplicate-case) | +| [no-else-return](https://eslint.org/docs/latest/rules/no-else-return) |[noUselessElse](/linter/rules//lint/rules/no-useless-else)[^4] | +| [no-empty-character-class](https://eslint.org/docs/latest/rules/no-empty-character-class) |[noEmptyCharacterClassInRegex](/linter/rules//lint/rules/no-empty-character-class-in-regex) | +| [no-empty-pattern](https://eslint.org/docs/latest/rules/no-empty-pattern) |[noEmptyPattern](/linter/rules//lint/rules/no-empty-pattern) | +| [no-ex-assign](https://eslint.org/docs/latest/rules/no-ex-assign) |[noCatchAssign](/linter/rules//lint/rules/no-catch-assign) | +| [no-extra-boolean-cast](https://eslint.org/docs/latest/rules/no-extra-boolean-cast) |[noExtraBooleanCast](/linter/rules//lint/rules/no-extra-boolean-cast) | +| [no-extra-label](https://eslint.org/docs/latest/rules/no-extra-label) |[noUselessLabel](/linter/rules//lint/rules/no-useless-label) | +| [no-fallthrough](https://eslint.org/docs/latest/rules/no-fallthrough) |[noFallthroughSwitchClause](/linter/rules//lint/rules/no-fallthrough-switch-clause) | +| [no-func-assign](https://eslint.org/docs/latest/rules/no-func-assign) |[noFunctionAssign](/linter/rules//lint/rules/no-function-assign) | +| [no-import-assign](https://eslint.org/docs/latest/rules/no-import-assign) |[noImportAssign](/linter/rules//lint/rules/no-import-assign) | +| [no-inner-declarations](https://eslint.org/docs/latest/rules/no-inner-declarations) |[noInnerDeclarations](/linter/rules//lint/rules/no-inner-declarations) | +| [no-label-var](https://eslint.org/docs/latest/rules/no-label-var) |[noLabelVar](/linter/rules//lint/rules/no-label-var) | +| [no-labels](https://eslint.org/docs/latest/rules/no-labels) |[noConfusingLabels](/linter/rules//lint/rules/no-confusing-labels)[^5] | +| [no-lonely-if](https://eslint.org/docs/latest/rules/no-lonely-if) |[useCollapsedElseIf](/linter/rules//lint/rules/use-collapsed-else-if) | +| [no-loss-of-precision](https://eslint.org/docs/latest/rules/no-loss-of-precision) |[noPrecisionLoss](/linter/rules//lint/rules/no-precision-loss) | +| [no-negated-condition](https://eslint.org/docs/latest/rules/no-negated-condition) |[noNegationElse](/linter/rules//lint/rules/no-negation-else) | +| [no-new-native-nonconstructor](https://eslint.org/docs/latest/rules/no-new-native-nonconstructor) |[noInvalidNewBuiltin](/linter/rules//lint/rules/no-invalid-new-builtin) | +| [no-new-symbol](https://eslint.org/docs/latest/rules/no-new-symbol) |[noNewSymbol](/linter/rules//lint/rules/no-new-symbol) | +| [no-nonoctal-decimal-escape](https://eslint.org/docs/latest/rules/no-nonoctal-decimal-escape) |[noNonoctalDecimalEscape](/linter/rules//lint/rules/no-nonoctal-decimal-escape) | +| [no-obj-calls](https://eslint.org/docs/latest/rules/no-obj-calls) |[noGlobalObjectCalls](/linter/rules//lint/rules/no-global-object-calls) | +| [no-param-reassign](https://eslint.org/docs/latest/rules/no-param-reassign) |[noParameterAssign](/linter/rules//lint/rules/no-parameter-assign) | +| [no-prototype-builtins](https://eslint.org/docs/latest/rules/no-prototype-builtins) |[noPrototypeBuiltins](/linter/rules//lint/rules/no-prototype-builtins) | +| [no-regex-spaces](https://eslint.org/docs/latest/rules/no-regex-spaces) |[noMultipleSpacesInRegularExpressionLiterals](/linter/rules//lint/rules/no-multiple-spaces-in-regular-expression-literals) | +| [no-restricted-globals](https://eslint.org/docs/latest/rules/no-restricted-globals) |[noRestrictedGlobals](/linter/rules//lint/rules/no-restricted-globals) | +| [no-self-assign](https://eslint.org/docs/latest/rules/no-self-assign) |[noSelfAssign](/linter/rules//lint/rules/no-self-assign) | +| [no-self-compare](https://eslint.org/docs/latest/rules/no-self-compare) |[noSelfCompare](/linter/rules//lint/rules/no-self-compare) | +| [no-sequences](https://eslint.org/docs/latest/rules/no-sequences) |[noCommaOperator](/linter/rules//lint/rules/no-comma-operator) | +| [no-setter-return](https://eslint.org/docs/latest/rules/no-setter-return) |[noSetterReturn](/linter/rules//lint/rules/no-setter-return) | +| [no-shadow-restricted-names](https://eslint.org/docs/latest/rules/no-shadow-restricted-names) |[noShadowRestrictedNames](/linter/rules//lint/rules/no-shadow-restricted-names) | +| [no-sparse-array](https://eslint.org/docs/latest/rules/no-sparse-array) |[noSparseArray](/linter/rules//lint/rules/no-sparse-array) | +| [no-this-before-super](https://eslint.org/docs/latest/rules/no-this-before-super) |[noUnreachableSuper](/linter/rules//lint/rules/no-unreachable-super) | +| [no-undef](https://eslint.org/docs/latest/rules/no-undef) |[noUndeclaredVariables](/linter/rules//lint/rules/no-undeclared-variables) | +| [no-unreachable](https://eslint.org/docs/latest/rules/no-unreachable) |[noUnreachable](/linter/rules//lint/rules/no-unreachable) | +| [no-unsafe-finally](https://eslint.org/docs/latest/rules/no-unsafe-finally) |[noUnsafeFinally](/linter/rules//lint/rules/no-unsafe-finally) | +| [no-unsafe-negation](https://eslint.org/docs/latest/rules/no-unsafe-negation) |[noUnsafeNegation](/linter/rules//lint/rules/no-unsafe-negation) | +| [no-unsafe-optional-chaining](https://eslint.org/docs/latest/rules/no-unsafe-optional-chaining) |[noUnsafeOptionalChaining](/linter/rules//lint/rules/no-unsafe-optional-chaining) | +| [no-unused-labels](https://eslint.org/docs/latest/rules/no-unused-labels) |[noUnusedLabels](/linter/rules//lint/rules/no-unused-labels) | +| [no-unused-vars](https://eslint.org/docs/latest/rules/no-unused-vars) |[noUnusedVariables](/linter/rules//lint/rules/no-unused-variables) | +| [no-useless-catch](https://eslint.org/docs/latest/rules/no-useless-catch) |[noUselessCatch](/linter/rules//lint/rules/no-useless-catch) | +| [no-useless-rename](https://eslint.org/docs/latest/rules/no-useless-rename) |[noUselessRename](/linter/rules//lint/rules/no-useless-rename) | +| [no-var](https://eslint.org/docs/latest/rules/no-var) |[noVar](/linter/rules//lint/rules/no-var) | +| [no-void](https://eslint.org/docs/latest/rules/no-void) |[noVoid](/linter/rules//lint/rules/no-void) | +| [no-with](https://eslint.org/docs/latest/rules/no-with) |[noWith](/linter/rules//lint/rules/no-with) | +| [one-var](https://eslint.org/docs/latest/rules/one-var) |[useSingleVarDeclarator](/linter/rules//lint/rules/use-single-var-declarator) | +| [operator-assignment](https://eslint.org/docs/latest/rules/operator-assignment) |[useShorthandAssign](/linter/rules//lint/rules/use-shorthand-assign) | +| [prefer-arrow-callback](https://eslint.org/docs/latest/rules/prefer-arrow-callback) |[useArrowFunction](/linter/rules//lint/rules/use-arrow-function)[^6] | +| [prefer-const](https://eslint.org/docs/latest/rules/prefer-const) |[useConst](/linter/rules//lint/rules/use-const) | +| [prefer-exponentiation-operator](https://eslint.org/docs/latest/rules/prefer-exponentiation-operator) |[useExponentiationOperator](/linter/rules//lint/rules/use-exponentiation-operator) | +| [prefer-numeric-literals](https://eslint.org/docs/latest/rules/prefer-numeric-literals) |[useNumericLiterals](/linter/rules//lint/rules/use-numeric-literals) | +| [prefer-regex-literals](https://eslint.org/docs/latest/rules/prefer-regex-literals) |[useRegexLiterals](/linter/rules//lint/rules/use-regex-literals) | +| [prefer-rest-params](https://eslint.org/docs/latest/rules/prefer-rest-params) |[noArguments](/linter/rules//lint/rules/no-arguments)[^7] | +| [prefer-template](https://eslint.org/docs/latest/rules/prefer-template) |[useTemplate](/linter/rules//lint/rules/use-template) | +| [require-yield](https://eslint.org/docs/latest/rules/require-yield) |[useYield](/linter/rules//lint/rules/use-yield) | +| [use-isnan](https://eslint.org/docs/latest/rules/use-isnan) |[useIsNan](/linter/rules//lint/rules/use-is-nan) | +| [valid-typeof](https://eslint.org/docs/latest/rules/valid-typeof) |[useValidTypeof](/linter/rules//lint/rules/use-valid-typeof) | ## eslint-plugin-import rules to Biome | eslint-plugin-import rule name | Biome rule name | | ---- | ---- | -| [no-default-export](https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-default-export.md) |[noDefaultExport](/linter/rules//lint/rules/no-default-export) | +| [no-default-export](https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-default-export.md) |[noDefaultExport](/linter/rules//lint/rules/no-default-export)[^8] | ## eslint-plugin-jsx-a11y rules to Biome | eslint-plugin-jsx-a11y rule name | Biome rule name | | ---- | ---- | -| [alt-text](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/alt-text.md) |[useAltText](/linter/rules//lint/rules/use-alt-text) | -| [anchor-has-content](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/anchor-has-content.md) |[useAnchorContent](/linter/rules//lint/rules/use-anchor-content) | -| [anchor-is-valid](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/anchor-is-valid.md) |[useValidAnchor](/linter/rules//lint/rules/use-valid-anchor) | -| [aria-activedescendant-has-tabindex](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-activedescendant-has-tabindex.md) |[useAriaActivedescendantWithTabindex](/linter/rules//lint/rules/use-aria-activedescendant-with-tabindex) | -| [aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-props.md) |[useValidAriaProps](/linter/rules//lint/rules/use-valid-aria-props) | -| [aria-proptypes](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-proptypes.md) |[useValidAriaValues](/linter/rules//lint/rules/use-valid-aria-values) | -| [aria-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-role.md) |[useValidAriaRole](/linter/rules//lint/rules/use-valid-aria-role) | -| [aria-unsupported-elements](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-unsupported-elements.md) |[noAriaUnsupportedElements](/linter/rules//lint/rules/no-aria-unsupported-elements) | -| [click-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/click-events-have-key-events.md) |[useKeyWithClickEvents](/linter/rules//lint/rules/use-key-with-click-events) | -| [heading-has-content](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/heading-has-content.md) |[useHeadingContent](/linter/rules//lint/rules/use-heading-content) | -| [html-has-lang](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/html-has-lang.md) |[useHtmlLang](/linter/rules//lint/rules/use-html-lang) | -| [iframe-has-title](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/iframe-has-title.md) |[useIframeTitle](/linter/rules//lint/rules/use-iframe-title) | -| [lang](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/lang.md) |[useValidLang](/linter/rules//lint/rules/use-valid-lang) | -| [media-has-caption](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/media-has-caption.md) |[useMediaCaption](/linter/rules//lint/rules/use-media-caption) | -| [mouse-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/mouse-events-have-key-events.md) |[useKeyWithMouseEvents](/linter/rules//lint/rules/use-key-with-mouse-events) | -| [no-access-key](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-access-key.md) |[noAccessKey](/linter/rules//lint/rules/no-access-key) | -| [no-aria-hidden-on-focusable](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-aria-hidden-on-focusable.md) |[noAriaHiddenOnFocusable](/linter/rules//lint/rules/no-aria-hidden-on-focusable) | -| [no-autofocus](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-autofocus.md) |[noAutofocus](/linter/rules//lint/rules/no-autofocus) | -| [no-distracting-elements](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-distracting-elements.md) |[noDistractingElements](/linter/rules//lint/rules/no-distracting-elements) | -| [no-interactive-element-to-noninteractive-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-interactive-element-to-noninteractive-role.md) |[noInteractiveElementToNoninteractiveRole](/linter/rules//lint/rules/no-interactive-element-to-noninteractive-role) | -| [no-noninteractive-element-to-interactive-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-noninteractive-element-to-interactive-role.md) |[noNoninteractiveElementToInteractiveRole](/linter/rules//lint/rules/no-noninteractive-element-to-interactive-role) | -| [no-noninteractive-tabindex](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-noninteractive-tabindex.md) |[noNoninteractiveTabindex](/linter/rules//lint/rules/no-noninteractive-tabindex) | -| [no-redundant-roles](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-redundant-roles.md) |[noRedundantAlt](/linter/rules//lint/rules/no-redundant-alt) | -| [role-has-required-aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/role-has-required-aria-props.md) |[useAriaPropsForRole](/linter/rules//lint/rules/use-aria-props-for-role) | -| [scope](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/scope.md) |[noHeaderScope](/linter/rules//lint/rules/no-header-scope) | -| [tabindex-no-positive](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/tabindex-no-positive.md) |[noPositiveTabindex](/linter/rules//lint/rules/no-positive-tabindex) | +| [alt-text](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/alt-text.md) |[useAltText](/linter/rules//lint/rules/use-alt-text) | +| [anchor-has-content](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/anchor-has-content.md) |[useAnchorContent](/linter/rules//lint/rules/use-anchor-content) | +| [anchor-is-valid](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/anchor-is-valid.md) |[useValidAnchor](/linter/rules//lint/rules/use-valid-anchor) | +| [aria-activedescendant-has-tabindex](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-activedescendant-has-tabindex.md) |[useAriaActivedescendantWithTabindex](/linter/rules//lint/rules/use-aria-activedescendant-with-tabindex) | +| [aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-props.md) |[useValidAriaProps](/linter/rules//lint/rules/use-valid-aria-props) | +| [aria-proptypes](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-proptypes.md) |[useValidAriaValues](/linter/rules//lint/rules/use-valid-aria-values) | +| [aria-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-role.md) |[useValidAriaRole](/linter/rules//lint/rules/use-valid-aria-role) | +| [aria-unsupported-elements](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-unsupported-elements.md) |[noAriaUnsupportedElements](/linter/rules//lint/rules/no-aria-unsupported-elements) | +| [click-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/click-events-have-key-events.md) |[useKeyWithClickEvents](/linter/rules//lint/rules/use-key-with-click-events) | +| [heading-has-content](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/heading-has-content.md) |[useHeadingContent](/linter/rules//lint/rules/use-heading-content) | +| [html-has-lang](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/html-has-lang.md) |[useHtmlLang](/linter/rules//lint/rules/use-html-lang) | +| [iframe-has-title](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/iframe-has-title.md) |[useIframeTitle](/linter/rules//lint/rules/use-iframe-title) | +| [lang](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/lang.md) |[useValidLang](/linter/rules//lint/rules/use-valid-lang) | +| [media-has-caption](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/media-has-caption.md) |[useMediaCaption](/linter/rules//lint/rules/use-media-caption) | +| [mouse-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/mouse-events-have-key-events.md) |[useKeyWithMouseEvents](/linter/rules//lint/rules/use-key-with-mouse-events) | +| [no-access-key](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-access-key.md) |[noAccessKey](/linter/rules//lint/rules/no-access-key)[^9] | +| [no-aria-hidden-on-focusable](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-aria-hidden-on-focusable.md) |[noAriaHiddenOnFocusable](/linter/rules//lint/rules/no-aria-hidden-on-focusable) | +| [no-autofocus](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-autofocus.md) |[noAutofocus](/linter/rules//lint/rules/no-autofocus) | +| [no-distracting-elements](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-distracting-elements.md) |[noDistractingElements](/linter/rules//lint/rules/no-distracting-elements) | +| [no-interactive-element-to-noninteractive-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-interactive-element-to-noninteractive-role.md) |[noInteractiveElementToNoninteractiveRole](/linter/rules//lint/rules/no-interactive-element-to-noninteractive-role) | +| [no-noninteractive-element-to-interactive-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-noninteractive-element-to-interactive-role.md) |[noNoninteractiveElementToInteractiveRole](/linter/rules//lint/rules/no-noninteractive-element-to-interactive-role) | +| [no-noninteractive-tabindex](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-noninteractive-tabindex.md) |[noNoninteractiveTabindex](/linter/rules//lint/rules/no-noninteractive-tabindex) | +| [no-redundant-roles](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-redundant-roles.md) |[noRedundantAlt](/linter/rules//lint/rules/no-redundant-alt) | +| [role-has-required-aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/role-has-required-aria-props.md) |[useAriaPropsForRole](/linter/rules//lint/rules/use-aria-props-for-role) | +| [scope](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/scope.md) |[noHeaderScope](/linter/rules//lint/rules/no-header-scope) | +| [tabindex-no-positive](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/tabindex-no-positive.md) |[noPositiveTabindex](/linter/rules//lint/rules/no-positive-tabindex) | ## eslint-plugin-mysticates rules to Biome | eslint-plugin-mysticates rule name | Biome rule name | | ---- | ---- | -| [no-this-in-static](https://github.com/mysticatea/eslint-plugin/blob/master/docs/rules/no-this-in-static.md) |[noThisInStatic](/linter/rules//lint/rules/no-this-in-static) | +| [no-this-in-static](https://github.com/mysticatea/eslint-plugin/blob/master/docs/rules/no-this-in-static.md) |[noThisInStatic](/linter/rules//lint/rules/no-this-in-static)[^10] | ## eslint-plugin-react rules to Biome | eslint-plugin-react rule name | Biome rule name | | ---- | ---- | -| [button-has-type](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/button-has-type.md) |[useButtonType](/linter/rules//lint/rules/use-button-type) | -| [jsx-boolean-value](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-boolean-value.md) |[noImplicitBoolean](/linter/rules//lint/rules/no-implicit-boolean) | -| [jsx-fragments](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-fragments.md) |[useFragmentSyntax](/linter/rules//lint/rules/use-fragment-syntax) | -| [jsx-no-comment-textnodes](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-comment-textnodes.md) |[noCommentText](/linter/rules//lint/rules/no-comment-text) | -| [jsx-no-duplicate-props](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-duplicate-props.md) |[noDuplicateJsxProps](/linter/rules//lint/rules/no-duplicate-jsx-props) | -| [jsx-no-target-blank](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-target-blank.md) |[noBlankTarget](/linter/rules//lint/rules/no-blank-target) | -| [jsx-no-useless-fragment](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-useless-fragment.md) |[noUselessFragments](/linter/rules//lint/rules/no-useless-fragments) | -| [no-array-index-key](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-array-index-key.md) |[noArrayIndexKey](/linter/rules//lint/rules/no-array-index-key) | -| [no-children-prop](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-children-prop.md) |[noChildrenProp](/linter/rules//lint/rules/no-children-prop) | -| [no-danger](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger.md) |[noDangerouslySetInnerHtmlWithChildren](/linter/rules//lint/rules/no-dangerously-set-inner-html-with-children) | -| [no-danger-with-children](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger-with-children.md) |[noDangerouslySetInnerHtml](/linter/rules//lint/rules/no-dangerously-set-inner-html) | -| [void-dom-elements-no-children](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/void-dom-elements-no-children.md) |[noVoidElementsWithChildren](/linter/rules//lint/rules/no-void-elements-with-children) | +| [button-has-type](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/button-has-type.md) |[useButtonType](/linter/rules//lint/rules/use-button-type) | +| [jsx-boolean-value](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-boolean-value.md) |[noImplicitBoolean](/linter/rules//lint/rules/no-implicit-boolean) | +| [jsx-fragments](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-fragments.md) |[useFragmentSyntax](/linter/rules//lint/rules/use-fragment-syntax) | +| [jsx-no-comment-textnodes](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-comment-textnodes.md) |[noCommentText](/linter/rules//lint/rules/no-comment-text) | +| [jsx-no-duplicate-props](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-duplicate-props.md) |[noDuplicateJsxProps](/linter/rules//lint/rules/no-duplicate-jsx-props) | +| [jsx-no-target-blank](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-target-blank.md) |[noBlankTarget](/linter/rules//lint/rules/no-blank-target) | +| [jsx-no-useless-fragment](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-useless-fragment.md) |[noUselessFragments](/linter/rules//lint/rules/no-useless-fragments) | +| [no-array-index-key](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-array-index-key.md) |[noArrayIndexKey](/linter/rules//lint/rules/no-array-index-key)[^11] | +| [no-children-prop](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-children-prop.md) |[noChildrenProp](/linter/rules//lint/rules/no-children-prop) | +| [no-danger](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger.md) |[noDangerouslySetInnerHtmlWithChildren](/linter/rules//lint/rules/no-dangerously-set-inner-html-with-children) | +| [no-danger-with-children](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger-with-children.md) |[noDangerouslySetInnerHtml](/linter/rules//lint/rules/no-dangerously-set-inner-html) | +| [void-dom-elements-no-children](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/void-dom-elements-no-children.md) |[noVoidElementsWithChildren](/linter/rules//lint/rules/no-void-elements-with-children) | ## eslint-plugin-react-hooks rules to Biome | eslint-plugin-react-hooks rule name | Biome rule name | | ---- | ---- | -| [exhaustive-deps](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md) |[useExhaustiveDependencies](/linter/rules//lint/rules/use-exhaustive-dependencies) | -| [rules-of-hooks](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md) |[useHookAtTopLevel](/linter/rules//lint/rules/use-hook-at-top-level) | +| [exhaustive-deps](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md) |[useExhaustiveDependencies](/linter/rules//lint/rules/use-exhaustive-dependencies)[^12] | +| [rules-of-hooks](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md) |[useHookAtTopLevel](/linter/rules//lint/rules/use-hook-at-top-level) | ## eslint-plugin-sonarjs rules to Biome | eslint-plugin-sonarjs rule name | Biome rule name | | ---- | ---- | -| [cognitive-complexity](https://github.com/SonarSource/eslint-plugin-sonarjs/blob/HEAD/docs/rules/cognitive-complexity.md) |[noExcessiveCognitiveComplexity](/linter/rules//lint/rules/no-excessive-cognitive-complexity) | +| [cognitive-complexity](https://github.com/SonarSource/eslint-plugin-sonarjs/blob/HEAD/docs/rules/cognitive-complexity.md) |[noExcessiveCognitiveComplexity](/linter/rules//lint/rules/no-excessive-cognitive-complexity)[^13] | ## eslint-plugin-stylistic rules to Biome | eslint-plugin-stylistic rule name | Biome rule name | | ---- | ---- | -| [jsx-self-closing-comp](https://eslint.style/rules/default/jsx-self-closing-comp) |[useSelfClosingElements](/linter/rules//lint/rules/use-self-closing-elements) | +| [jsx-self-closing-comp](https://eslint.style/rules/default/jsx-self-closing-comp) |[useSelfClosingElements](/linter/rules//lint/rules/use-self-closing-elements)[^14] | ## eslint-plugin-typescript rules to Biome | eslint-plugin-typescript rule name | Biome rule name | | ---- | ---- | -| [array-type](https://typescript-eslint.io/rules/array-type) |[useShorthandArrayType](/linter/rules//lint/rules/use-shorthand-array-type) | -| [ban-types](https://typescript-eslint.io/rules/ban-types) |[noBannedTypes](/linter/rules//lint/rules/no-banned-types) | -| [naming-convention](https://typescript-eslint.io/rules/naming-convention) |[useNamingConvention](/linter/rules//lint/rules/use-naming-convention) | -| [no-empty-interface](https://typescript-eslint.io/rules/no-empty-interface) |[noEmptyInterface](/linter/rules//lint/rules/no-empty-interface) | -| [no-explicit-any](https://typescript-eslint.io/rules/no-explicit-any) |[noExplicitAny](/linter/rules//lint/rules/no-explicit-any) | -| [no-extra-non-null-assertion](https://typescript-eslint.io/rules/no-extra-non-null-assertion) |[noExtraNonNullAssertion](/linter/rules//lint/rules/no-extra-non-null-assertion) | -| [no-extraneous-class](https://typescript-eslint.io/rules/no-extraneous-class) |[noStaticOnlyClass](/linter/rules//lint/rules/no-static-only-class) | -| [no-inferrable-types](https://typescript-eslint.io/rules/no-inferrable-types) |[noInferrableTypes](/linter/rules//lint/rules/no-inferrable-types) | -| [no-invalid-void-type](https://typescript-eslint.io/rules/no-invalid-void-type) |[noConfusingVoidType](/linter/rules//lint/rules/no-confusing-void-type) | -| [no-misused-new](https://typescript-eslint.io/rules/no-misused-new) |[noMisleadingInstantiator](/linter/rules//lint/rules/no-misleading-instantiator) | -| [no-namespace](https://typescript-eslint.io/rules/no-namespace) |[noNamespace](/linter/rules//lint/rules/no-namespace) | -| [no-non-null-assertion](https://typescript-eslint.io/rules/no-non-null-assertion) |[noNonNullAssertion](/linter/rules//lint/rules/no-non-null-assertion) | -| [no-redeclare](https://typescript-eslint.io/rules/no-redeclare) |[noRedeclare](/linter/rules//lint/rules/no-redeclare) | -| [no-this-alias](https://typescript-eslint.io/rules/no-this-alias) |[noUselessThisAlias](/linter/rules//lint/rules/no-useless-this-alias) | -| [no-unnecessary-type-constraint](https://typescript-eslint.io/rules/no-unnecessary-type-constraint) |[noUselessTypeConstraint](/linter/rules//lint/rules/no-useless-type-constraint) | -| [no-unsafe-declaration-merging](https://typescript-eslint.io/rules/no-unsafe-declaration-merging) |[noUnsafeDeclarationMerging](/linter/rules//lint/rules/no-unsafe-declaration-merging) | -| [no-useless-constructor](https://typescript-eslint.io/rules/no-useless-constructor) |[noUselessConstructor](/linter/rules//lint/rules/no-useless-constructor) | -| [no-useless-empty-export](https://typescript-eslint.io/rules/no-useless-empty-export) |[noUselessEmptyExport](/linter/rules//lint/rules/no-useless-empty-export) | -| [no-useless-template-literals](https://typescript-eslint.io/rules/no-useless-template-literals) |[noUnusedTemplateLiteral](/linter/rules//lint/rules/no-unused-template-literal) | -| [parameter-properties](https://typescript-eslint.io/rules/parameter-properties) |[noParameterProperties](/linter/rules//lint/rules/no-parameter-properties) | -| [prefer-as-const](https://typescript-eslint.io/rules/prefer-as-const) |[useAsConstAssertion](/linter/rules//lint/rules/use-as-const-assertion) | -| [prefer-enum-initializers](https://typescript-eslint.io/rules/prefer-enum-initializers) |[useEnumInitializers](/linter/rules//lint/rules/use-enum-initializers) | -| [prefer-literal-enum-member](https://typescript-eslint.io/rules/prefer-literal-enum-member) |[useLiteralEnumMembers](/linter/rules//lint/rules/use-literal-enum-members) | -| [prefer-namespace-keyword](https://typescript-eslint.io/rules/prefer-namespace-keyword) |[useNamespaceKeyword](/linter/rules//lint/rules/use-namespace-keyword) | -| [prefer-optional-chain](https://typescript-eslint.io/rules/prefer-optional-chain) |[useOptionalChain](/linter/rules//lint/rules/use-optional-chain) | +| [array-type](https://typescript-eslint.io/rules/array-type) |[useShorthandArrayType](/linter/rules//lint/rules/use-shorthand-array-type)[^15] | +| [ban-types](https://typescript-eslint.io/rules/ban-types) |[noBannedTypes](/linter/rules//lint/rules/no-banned-types)[^16] | +| [naming-convention](https://typescript-eslint.io/rules/naming-convention) |[useNamingConvention](/linter/rules//lint/rules/use-naming-convention)[^17] | +| [no-empty-interface](https://typescript-eslint.io/rules/no-empty-interface) |[noEmptyInterface](/linter/rules//lint/rules/no-empty-interface)[^18] | +| [no-explicit-any](https://typescript-eslint.io/rules/no-explicit-any) |[noExplicitAny](/linter/rules//lint/rules/no-explicit-any) | +| [no-extra-non-null-assertion](https://typescript-eslint.io/rules/no-extra-non-null-assertion) |[noExtraNonNullAssertion](/linter/rules//lint/rules/no-extra-non-null-assertion) | +| [no-extraneous-class](https://typescript-eslint.io/rules/no-extraneous-class) |[noStaticOnlyClass](/linter/rules//lint/rules/no-static-only-class) | +| [no-inferrable-types](https://typescript-eslint.io/rules/no-inferrable-types) |[noInferrableTypes](/linter/rules//lint/rules/no-inferrable-types) | +| [no-invalid-void-type](https://typescript-eslint.io/rules/no-invalid-void-type) |[noConfusingVoidType](/linter/rules//lint/rules/no-confusing-void-type) | +| [no-misused-new](https://typescript-eslint.io/rules/no-misused-new) |[noMisleadingInstantiator](/linter/rules//lint/rules/no-misleading-instantiator) | +| [no-namespace](https://typescript-eslint.io/rules/no-namespace) |[noNamespace](/linter/rules//lint/rules/no-namespace) | +| [no-non-null-assertion](https://typescript-eslint.io/rules/no-non-null-assertion) |[noNonNullAssertion](/linter/rules//lint/rules/no-non-null-assertion) | +| [no-redeclare](https://typescript-eslint.io/rules/no-redeclare) |[noRedeclare](/linter/rules//lint/rules/no-redeclare) | +| [no-this-alias](https://typescript-eslint.io/rules/no-this-alias) |[noUselessThisAlias](/linter/rules//lint/rules/no-useless-this-alias)[^19] | +| [no-unnecessary-type-constraint](https://typescript-eslint.io/rules/no-unnecessary-type-constraint) |[noUselessTypeConstraint](/linter/rules//lint/rules/no-useless-type-constraint) | +| [no-unsafe-declaration-merging](https://typescript-eslint.io/rules/no-unsafe-declaration-merging) |[noUnsafeDeclarationMerging](/linter/rules//lint/rules/no-unsafe-declaration-merging) | +| [no-useless-constructor](https://typescript-eslint.io/rules/no-useless-constructor) |[noUselessConstructor](/linter/rules//lint/rules/no-useless-constructor) | +| [no-useless-empty-export](https://typescript-eslint.io/rules/no-useless-empty-export) |[noUselessEmptyExport](/linter/rules//lint/rules/no-useless-empty-export) | +| [no-useless-template-literals](https://typescript-eslint.io/rules/no-useless-template-literals) |[noUnusedTemplateLiteral](/linter/rules//lint/rules/no-unused-template-literal) | +| [parameter-properties](https://typescript-eslint.io/rules/parameter-properties) |[noParameterProperties](/linter/rules//lint/rules/no-parameter-properties)[^20] | +| [prefer-as-const](https://typescript-eslint.io/rules/prefer-as-const) |[useAsConstAssertion](/linter/rules//lint/rules/use-as-const-assertion) | +| [prefer-enum-initializers](https://typescript-eslint.io/rules/prefer-enum-initializers) |[useEnumInitializers](/linter/rules//lint/rules/use-enum-initializers) | +| [prefer-literal-enum-member](https://typescript-eslint.io/rules/prefer-literal-enum-member) |[useLiteralEnumMembers](/linter/rules//lint/rules/use-literal-enum-members) | +| [prefer-namespace-keyword](https://typescript-eslint.io/rules/prefer-namespace-keyword) |[useNamespaceKeyword](/linter/rules//lint/rules/use-namespace-keyword) | +| [prefer-optional-chain](https://typescript-eslint.io/rules/prefer-optional-chain) |[useOptionalChain](/linter/rules//lint/rules/use-optional-chain) | ## eslint-plugin-unicorn rules to Biome | eslint-plugin-unicorn rule name | Biome rule name | | ---- | ---- | -| [no-array-for-each](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-array-for-each.md) |[noForEach](/linter/rules//lint/rules/no-for-each) | -| [no-instanceof-array](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-instanceof-array.md) |[useIsArray](/linter/rules//lint/rules/use-is-array) | -| [no-useless-switch-case](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-useless-switch-case.md) |[noUselessSwitchCase](/linter/rules//lint/rules/no-useless-switch-case) | -| [prefer-array-flat-map](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-array-flat-map.md) |[useFlatMap](/linter/rules//lint/rules/use-flat-map) | +| [no-array-for-each](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-array-for-each.md) |[noForEach](/linter/rules//lint/rules/no-for-each)[^21] | +| [no-instanceof-array](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-instanceof-array.md) |[useIsArray](/linter/rules//lint/rules/use-is-array) | +| [no-useless-switch-case](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-useless-switch-case.md) |[noUselessSwitchCase](/linter/rules//lint/rules/no-useless-switch-case) | +| [prefer-array-flat-map](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-array-flat-map.md) |[useFlatMap](/linter/rules//lint/rules/use-flat-map) | +[^1]: This rule is inspired from the source, so its logic might be different. +[^2]: This rule is inspired from the source, so its logic might be different. +[^3]: This rule is inspired from the source, so its logic might be different. +[^4]: This rule is inspired from the source, so its logic might be different. +[^5]: This rule is inspired from the source, so its logic might be different. +[^6]: This rule is inspired from the source, so its logic might be different. +[^7]: This rule is inspired from the source, so its logic might be different. +[^8]: This rule is inspired from the source, so its logic might be different. +[^9]: This rule is inspired from the source, so its logic might be different. +[^10]: This rule is inspired from the source, so its logic might be different. +[^11]: This rule is inspired from the source, so its logic might be different. +[^12]: This rule is inspired from the source, so its logic might be different. +[^13]: This rule is inspired from the source, so its logic might be different. +[^14]: This rule is inspired from the source, so its logic might be different. +[^15]: This rule is inspired from the source, so its logic might be different. +[^16]: This rule is inspired from the source, so its logic might be different. +[^17]: This rule is inspired from the source, so its logic might be different. +[^18]: This rule is inspired from the source, so its logic might be different. +[^19]: This rule is inspired from the source, so its logic might be different. +[^20]: This rule is inspired from the source, so its logic might be different. +[^21]: This rule is inspired from the source, so its logic might be different. diff --git a/website/src/content/docs/linter/rule-sources.mdx b/website/src/content/docs/linter/rule-sources.mdx deleted file mode 100644 index d21c2188ac2b..000000000000 --- a/website/src/content/docs/linter/rule-sources.mdx +++ /dev/null @@ -1,163 +0,0 @@ ---- -title: Rules sources -description: A page that maps lint rules from other sources to Biome ---- - -## ESlint rules to Biome - | ESLint Rule name | Biome Rule name | - | ---- | ---- | -| [constructor-super](https://eslint.org/docs/latest/rules/constructor-super) |[noInvalidConstructorSuper](/linter/rules/no-invalid-constructor-super) | -| [curly](https://eslint.org/docs/latest/rules/curly) |[useBlockStatements](/linter/rules/use-block-statements) | -| [default-case-last](https://eslint.org/docs/latest/rules/default-case-last) |[useDefaultSwitchClauseLast](/linter/rules/use-default-switch-clause-last) | -| [default-param-last](https://eslint.org/docs/latest/rules/default-param-last) |[useDefaultParameterLast](/linter/rules/use-default-parameter-last) | -| [dot-notation](https://eslint.org/docs/latest/rules/dot-notation) |[useLiteralKeys](/linter/rules/use-literal-keys) | -| [eqeqeq](https://eslint.org/docs/latest/rules/eqeqeq) |[noDoubleEquals](/linter/rules/no-double-equals) | -| [for-direction](https://eslint.org/docs/latest/rules/for-direction) |[useValidForDirection](/linter/rules/use-valid-for-direction) | -| [getter-return](https://eslint.org/docs/latest/rules/getter-return) |[useGetterReturn](/linter/rules/use-getter-return) | -| [no-async-promise-executor](https://eslint.org/docs/latest/rules/no-async-promise-executor) |[noAsyncPromiseExecutor](/linter/rules/no-async-promise-executor) | -| [no-case-declarations](https://eslint.org/docs/latest/rules/no-case-declarations) |[noSwitchDeclarations](/linter/rules/no-switch-declarations) | -| [no-class-assign](https://eslint.org/docs/latest/rules/no-class-assign) |[noClassAssign](/linter/rules/no-class-assign) | -| [no-compare-neg-zero](https://eslint.org/docs/latest/rules/no-compare-neg-zero) |[noCompareNegZero](/linter/rules/no-compare-neg-zero) | -| [no-cond-assign](https://eslint.org/docs/latest/rules/no-cond-assign) |[noAssignInExpressions](/linter/rules/no-assign-in-expressions) | -| [no-console](https://eslint.org/docs/latest/rules/no-console) |[noConsoleLog](/linter/rules/no-console-log) | -| [no-const-assign](https://eslint.org/docs/latest/rules/no-const-assign) |[noConstAssign](/linter/rules/no-const-assign) | -| [no-constant-condition](https://eslint.org/docs/latest/rules/no-constant-condition) |[noConstantCondition](/linter/rules/no-constant-condition) | -| [no-constructor-return](https://eslint.org/docs/latest/rules/no-constructor-return) |[noConstructorReturn](/linter/rules/no-constructor-return) | -| [no-control-regex](https://eslint.org/docs/latest/rules/no-control-regex) |[noControlCharactersInRegex](/linter/rules/no-control-characters-in-regex) | -| [no-debugger](https://eslint.org/docs/latest/rules/no-debugger) |[noDebugger](/linter/rules/no-debugger) | -| [no-dupe-args](https://eslint.org/docs/latest/rules/no-dupe-args) |[noDuplicateParameters](/linter/rules/no-duplicate-parameters) | -| [no-dupe-class-members](https://eslint.org/docs/latest/rules/no-dupe-class-members) |[noDuplicateClassMembers](/linter/rules/no-duplicate-class-members) | -| [no-dupe-keys](https://eslint.org/docs/latest/rules/no-dupe-keys) |[noDuplicateObjectKeys](/linter/rules/no-duplicate-object-keys) | -| [no-duplicate-case](https://eslint.org/docs/latest/rules/no-duplicate-case) |[noDuplicateCase](/linter/rules/no-duplicate-case) | -| [no-else-return](https://eslint.org/docs/latest/rules/no-else-return) |[noUselessElse](/linter/rules/no-useless-else) | -| [no-empty-character-class](https://eslint.org/docs/latest/rules/no-empty-character-class) |[noEmptyCharacterClassInRegex](/linter/rules/no-empty-character-class-in-regex) | -| [no-empty-pattern](https://eslint.org/docs/latest/rules/no-empty-pattern) |[noEmptyPattern](/linter/rules/no-empty-pattern) | -| [no-ex-assign](https://eslint.org/docs/latest/rules/no-ex-assign) |[noCatchAssign](/linter/rules/no-catch-assign) | -| [no-extra-boolean-cast](https://eslint.org/docs/latest/rules/no-extra-boolean-cast) |[noExtraBooleanCast](/linter/rules/no-extra-boolean-cast) | -| [no-extra-label](https://eslint.org/docs/latest/rules/no-extra-label) |[noUselessLabel](/linter/rules/no-useless-label) | -| [no-fallthrough](https://eslint.org/docs/latest/rules/no-fallthrough) |[noFallthroughSwitchClause](/linter/rules/no-fallthrough-switch-clause) | -| [no-func-assign](https://eslint.org/docs/latest/rules/no-func-assign) |[noFunctionAssign](/linter/rules/no-function-assign) | -| [no-import-assign](https://eslint.org/docs/latest/rules/no-import-assign) |[noImportAssign](/linter/rules/no-import-assign) | -| [no-inner-declarations](https://eslint.org/docs/latest/rules/no-inner-declarations) |[noInnerDeclarations](/linter/rules/no-inner-declarations) | -| [no-label-var](https://eslint.org/docs/latest/rules/no-label-var) |[noLabelVar](/linter/rules/no-label-var) | -| [no-labels](https://eslint.org/docs/latest/rules/no-labels) |[noConfusingLabels](/linter/rules/no-confusing-labels) | -| [no-lonely-if](https://eslint.org/docs/latest/rules/no-lonely-if) |[useCollapsedElseIf](/linter/rules/use-collapsed-else-if) | -| [no-loss-of-precision](https://eslint.org/docs/latest/rules/no-loss-of-precision) |[noPrecisionLoss](/linter/rules/no-precision-loss) | -| [no-negated-condition](https://eslint.org/docs/latest/rules/no-negated-condition) |[noNegationElse](/linter/rules/no-negation-else) | -| [no-new-native-nonconstructor](https://eslint.org/docs/latest/rules/no-new-native-nonconstructor) |[noInvalidNewBuiltin](/linter/rules/no-invalid-new-builtin) | -| [no-new-symbol](https://eslint.org/docs/latest/rules/no-new-symbol) |[noNewSymbol](/linter/rules/no-new-symbol) | -| [no-nonoctal-decimal-escape](https://eslint.org/docs/latest/rules/no-nonoctal-decimal-escape) |[noNonoctalDecimalEscape](/linter/rules/no-nonoctal-decimal-escape) | -| [no-obj-calls](https://eslint.org/docs/latest/rules/no-obj-calls) |[noGlobalObjectCalls](/linter/rules/no-global-object-calls) | -| [no-param-reassign](https://eslint.org/docs/latest/rules/no-param-reassign) |[noParameterAssign](/linter/rules/no-parameter-assign) | -| [no-prototype-builtins](https://eslint.org/docs/latest/rules/no-prototype-builtins) |[noPrototypeBuiltins](/linter/rules/no-prototype-builtins) | -| [no-regex-spaces](https://eslint.org/docs/latest/rules/no-regex-spaces) |[noMultipleSpacesInRegularExpressionLiterals](/linter/rules/no-multiple-spaces-in-regular-expression-literals) | -| [no-restricted-globals](https://eslint.org/docs/latest/rules/no-restricted-globals) |[noRestrictedGlobals](/linter/rules/no-restricted-globals) | -| [no-self-assign](https://eslint.org/docs/latest/rules/no-self-assign) |[noSelfAssign](/linter/rules/no-self-assign) | -| [no-self-compare](https://eslint.org/docs/latest/rules/no-self-compare) |[noSelfCompare](/linter/rules/no-self-compare) | -| [no-sequences](https://eslint.org/docs/latest/rules/no-sequences) |[noCommaOperator](/linter/rules/no-comma-operator) | -| [no-setter-return](https://eslint.org/docs/latest/rules/no-setter-return) |[noSetterReturn](/linter/rules/no-setter-return) | -| [no-shadow-restricted-names](https://eslint.org/docs/latest/rules/no-shadow-restricted-names) |[noShadowRestrictedNames](/linter/rules/no-shadow-restricted-names) | -| [no-sparse-array](https://eslint.org/docs/latest/rules/no-sparse-array) |[noSparseArray](/linter/rules/no-sparse-array) | -| [no-this-before-super](https://eslint.org/docs/latest/rules/no-this-before-super) |[noUnreachableSuper](/linter/rules/no-unreachable-super) | -| [no-undef](https://eslint.org/docs/latest/rules/no-undef) |[noUndeclaredVariables](/linter/rules/no-undeclared-variables) | -| [no-unreachable](https://eslint.org/docs/latest/rules/no-unreachable) |[noUnreachable](/linter/rules/no-unreachable) | -| [no-unsafe-finally](https://eslint.org/docs/latest/rules/no-unsafe-finally) |[noUnsafeFinally](/linter/rules/no-unsafe-finally) | -| [no-unsafe-negation](https://eslint.org/docs/latest/rules/no-unsafe-negation) |[noUnsafeNegation](/linter/rules/no-unsafe-negation) | -| [no-unsafe-optional-chaining](https://eslint.org/docs/latest/rules/no-unsafe-optional-chaining) |[noUnsafeOptionalChaining](/linter/rules/no-unsafe-optional-chaining) | -| [no-unused-labels](https://eslint.org/docs/latest/rules/no-unused-labels) |[noUnusedLabels](/linter/rules/no-unused-labels) | -| [no-unused-vars](https://eslint.org/docs/latest/rules/no-unused-vars) |[noUnusedVariables](/linter/rules/no-unused-variables) | -| [no-useless-catch](https://eslint.org/docs/latest/rules/no-useless-catch) |[noUselessCatch](/linter/rules/no-useless-catch) | -| [no-useless-rename](https://eslint.org/docs/latest/rules/no-useless-rename) |[noUselessRename](/linter/rules/no-useless-rename) | -| [no-var](https://eslint.org/docs/latest/rules/no-var) |[noVar](/linter/rules/no-var) | -| [no-void](https://eslint.org/docs/latest/rules/no-void) |[noVoid](/linter/rules/no-void) | -| [no-with](https://eslint.org/docs/latest/rules/no-with) |[noWith](/linter/rules/no-with) | -| [one-var](https://eslint.org/docs/latest/rules/one-var) |[useSingleVarDeclarator](/linter/rules/use-single-var-declarator) | -| [operator-assignment](https://eslint.org/docs/latest/rules/operator-assignment) |[useShorthandAssign](/linter/rules/use-shorthand-assign) | -| [prefer-arrow-callback](https://eslint.org/docs/latest/rules/prefer-arrow-callback) |[useArrowFunction](/linter/rules/use-arrow-function) | -| [prefer-const](https://eslint.org/docs/latest/rules/prefer-const) |[useConst](/linter/rules/use-const) | -| [prefer-exponentiation-operator](https://eslint.org/docs/latest/rules/prefer-exponentiation-operator) |[useExponentiationOperator](/linter/rules/use-exponentiation-operator) | -| [prefer-numeric-literals](https://eslint.org/docs/latest/rules/prefer-numeric-literals) |[useNumericLiterals](/linter/rules/use-numeric-literals) | -| [prefer-regex-literals](https://eslint.org/docs/latest/rules/prefer-regex-literals) |[useRegexLiterals](/linter/rules/use-regex-literals) | -| [prefer-rest-params](https://eslint.org/docs/latest/rules/prefer-rest-params) |[noArguments](/linter/rules/no-arguments) | -| [prefer-template](https://eslint.org/docs/latest/rules/prefer-template) |[useTemplate](/linter/rules/use-template) | -| [require-yield](https://eslint.org/docs/latest/rules/require-yield) |[useYield](/linter/rules/use-yield) | -| [use-isnan](https://eslint.org/docs/latest/rules/use-isnan) |[useIsNan](/linter/rules/use-is-nan) | -| [valid-typeof](https://eslint.org/docs/latest/rules/valid-typeof) |[useValidTypeof](/linter/rules/use-valid-typeof) | -## `typescript-eslint` rules to Biome - | `typescript-eslint` rule name | Biome rule name | - | ---- | ---- | -| [array-type](https://typescript-eslint.io/rules/array-type) |[useShorthandArrayType](/linter/rules/use-shorthand-array-type) | -| [ban-types](https://typescript-eslint.io/rules/ban-types) |[noBannedTypes](/linter/rules/no-banned-types) | -| [naming-convention](https://typescript-eslint.io/rules/naming-convention) |[useNamingConvention](/linter/rules/use-naming-convention) | -| [no-empty-interface](https://typescript-eslint.io/rules/no-empty-interface) |[noEmptyInterface](/linter/rules/no-empty-interface) | -| [no-explicit-any](https://typescript-eslint.io/rules/no-explicit-any) |[noExplicitAny](/linter/rules/no-explicit-any) | -| [no-extra-non-null-assertion](https://typescript-eslint.io/rules/no-extra-non-null-assertion) |[noExtraNonNullAssertion](/linter/rules/no-extra-non-null-assertion) | -| [no-extraneous-class](https://typescript-eslint.io/rules/no-extraneous-class) |[noStaticOnlyClass](/linter/rules/no-static-only-class) | -| [no-inferrable-types](https://typescript-eslint.io/rules/no-inferrable-types) |[noInferrableTypes](/linter/rules/no-inferrable-types) | -| [no-invalid-void-type](https://typescript-eslint.io/rules/no-invalid-void-type) |[noConfusingVoidType](/linter/rules/no-confusing-void-type) | -| [no-misused-new](https://typescript-eslint.io/rules/no-misused-new) |[noMisleadingInstantiator](/linter/rules/no-misleading-instantiator) | -| [no-namespace](https://typescript-eslint.io/rules/no-namespace) |[noNamespace](/linter/rules/no-namespace) | -| [no-non-null-assertion](https://typescript-eslint.io/rules/no-non-null-assertion) |[noNonNullAssertion](/linter/rules/no-non-null-assertion) | -| [no-redeclare](https://typescript-eslint.io/rules/no-redeclare) |[noRedeclare](/linter/rules/no-redeclare) | -| [no-this-alias](https://typescript-eslint.io/rules/no-this-alias) |[noUselessThisAlias](/linter/rules/no-useless-this-alias) | -| [no-unnecessary-type-constraint](https://typescript-eslint.io/rules/no-unnecessary-type-constraint) |[noUselessTypeConstraint](/linter/rules/no-useless-type-constraint) | -| [no-unsafe-declaration-merging](https://typescript-eslint.io/rules/no-unsafe-declaration-merging) |[noUnsafeDeclarationMerging](/linter/rules/no-unsafe-declaration-merging) | -| [no-useless-constructor](https://typescript-eslint.io/rules/no-useless-constructor) |[noUselessConstructor](/linter/rules/no-useless-constructor) | -| [no-useless-empty-export](https://typescript-eslint.io/rules/no-useless-empty-export) |[noUselessEmptyExport](/linter/rules/no-useless-empty-export) | -| [no-useless-template-literals](https://typescript-eslint.io/rules/no-useless-template-literals) |[noUnusedTemplateLiteral](/linter/rules/no-unused-template-literal) | -| [parameter-properties](https://typescript-eslint.io/rules/parameter-properties) |[noParameterProperties](/linter/rules/no-parameter-properties) | -| [prefer-as-const](https://typescript-eslint.io/rules/prefer-as-const) |[useAsConstAssertion](/linter/rules/use-as-const-assertion) | -| [prefer-enum-initializers](https://typescript-eslint.io/rules/prefer-enum-initializers) |[useEnumInitializers](/linter/rules/use-enum-initializers) | -| [prefer-literal-enum-member](https://typescript-eslint.io/rules/prefer-literal-enum-member) |[useLiteralEnumMembers](/linter/rules/use-literal-enum-members) | -| [prefer-namespace-keyword](https://typescript-eslint.io/rules/prefer-namespace-keyword) |[useNamespaceKeyword](/linter/rules/use-namespace-keyword) | -| [prefer-optional-chain](https://typescript-eslint.io/rules/prefer-optional-chain) |[useOptionalChain](/linter/rules/use-optional-chain) | -## ESlint plugin rules to Biome - | Plugin name | Plugin rule name | Biome rule name | - | ---- | ---- | --- | -| `eslint-plugin-import` | [no-default-export](https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-default-export.md) |[noDefaultExport](/linter/rules/no-default-export) | -| `eslint-plugin-jsx-a11y` | [alt-text](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/alt-text.md) |[useAltText](/linter/rules/use-alt-text) | -| `eslint-plugin-jsx-a11y` | [anchor-has-content](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/anchor-has-content.md) |[useAnchorContent](/linter/rules/use-anchor-content) | -| `eslint-plugin-jsx-a11y` | [anchor-is-valid](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/anchor-is-valid.md) |[useValidAnchor](/linter/rules/use-valid-anchor) | -| `eslint-plugin-jsx-a11y` | [aria-activedescendant-has-tabindex](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-activedescendant-has-tabindex.md) |[useAriaActivedescendantWithTabindex](/linter/rules/use-aria-activedescendant-with-tabindex) | -| `eslint-plugin-jsx-a11y` | [aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-props.md) |[useValidAriaProps](/linter/rules/use-valid-aria-props) | -| `eslint-plugin-jsx-a11y` | [aria-proptypes](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-proptypes.md) |[useValidAriaValues](/linter/rules/use-valid-aria-values) | -| `eslint-plugin-jsx-a11y` | [aria-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-role.md) |[useValidAriaRole](/linter/rules/use-valid-aria-role) | -| `eslint-plugin-jsx-a11y` | [aria-unsupported-elements](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/aria-unsupported-elements.md) |[noAriaUnsupportedElements](/linter/rules/no-aria-unsupported-elements) | -| `eslint-plugin-jsx-a11y` | [click-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/click-events-have-key-events.md) |[useKeyWithClickEvents](/linter/rules/use-key-with-click-events) | -| `eslint-plugin-jsx-a11y` | [heading-has-content](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/heading-has-content.md) |[useHeadingContent](/linter/rules/use-heading-content) | -| `eslint-plugin-jsx-a11y` | [html-has-lang](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/html-has-lang.md) |[useHtmlLang](/linter/rules/use-html-lang) | -| `eslint-plugin-jsx-a11y` | [iframe-has-title](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/iframe-has-title.md) |[useIframeTitle](/linter/rules/use-iframe-title) | -| `eslint-plugin-jsx-a11y` | [lang](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/lang.md) |[useValidLang](/linter/rules/use-valid-lang) | -| `eslint-plugin-jsx-a11y` | [media-has-caption](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/media-has-caption.md) |[useMediaCaption](/linter/rules/use-media-caption) | -| `eslint-plugin-jsx-a11y` | [mouse-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/mouse-events-have-key-events.md) |[useKeyWithMouseEvents](/linter/rules/use-key-with-mouse-events) | -| `eslint-plugin-jsx-a11y` | [no-access-key](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-access-key.md) |[noAccessKey](/linter/rules/no-access-key) | -| `eslint-plugin-jsx-a11y` | [no-aria-hidden-on-focusable](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-aria-hidden-on-focusable.md) |[noAriaHiddenOnFocusable](/linter/rules/no-aria-hidden-on-focusable) | -| `eslint-plugin-jsx-a11y` | [no-autofocus](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-autofocus.md) |[noAutofocus](/linter/rules/no-autofocus) | -| `eslint-plugin-jsx-a11y` | [no-distracting-elements](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-distracting-elements.md) |[noDistractingElements](/linter/rules/no-distracting-elements) | -| `eslint-plugin-jsx-a11y` | [no-interactive-element-to-noninteractive-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-interactive-element-to-noninteractive-role.md) |[noInteractiveElementToNoninteractiveRole](/linter/rules/no-interactive-element-to-noninteractive-role) | -| `eslint-plugin-jsx-a11y` | [no-noninteractive-element-to-interactive-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-noninteractive-element-to-interactive-role.md) |[noNoninteractiveElementToInteractiveRole](/linter/rules/no-noninteractive-element-to-interactive-role) | -| `eslint-plugin-jsx-a11y` | [no-noninteractive-tabindex](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-noninteractive-tabindex.md) |[noNoninteractiveTabindex](/linter/rules/no-noninteractive-tabindex) | -| `eslint-plugin-jsx-a11y` | [no-redundant-roles](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-redundant-roles.md) |[noRedundantRoles](/linter/rules/no-redundant-roles) | -| `eslint-plugin-jsx-a11y` | [role-has-required-aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/role-has-required-aria-props.md) |[useAriaPropsForRole](/linter/rules/use-aria-props-for-role) | -| `eslint-plugin-jsx-a11y` | [scope](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/scope.md) |[noHeaderScope](/linter/rules/no-header-scope) | -| `eslint-plugin-jsx-a11y` | [tabindex-no-positive](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/tabindex-no-positive.md) |[noPositiveTabindex](/linter/rules/no-positive-tabindex) | -| `eslint-plugin-react` | [button-has-type](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/button-has-type.md) |[useButtonType](/linter/rules/use-button-type) | -| `eslint-plugin-react` | [jsx-boolean-value](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-boolean-value.md) |[noImplicitBoolean](/linter/rules/no-implicit-boolean) | -| `eslint-plugin-react` | [jsx-fragments](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-fragments.md) |[useFragmentSyntax](/linter/rules/use-fragment-syntax) | -| `eslint-plugin-react` | [jsx-no-comment-textnodes](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-comment-textnodes.md) |[noCommentText](/linter/rules/no-comment-text) | -| `eslint-plugin-react` | [jsx-no-duplicate-props](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-duplicate-props.md) |[noDuplicateJsxProps](/linter/rules/no-duplicate-jsx-props) | -| `eslint-plugin-react` | [jsx-no-target-blank](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-target-blank.md) |[noBlankTarget](/linter/rules/no-blank-target) | -| `eslint-plugin-react` | [jsx-no-useless-fragment](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-useless-fragment.md) |[noUselessFragments](/linter/rules/no-useless-fragments) | -| `eslint-plugin-react` | [no-array-index-key](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-array-index-key.md) |[noArrayIndexKey](/linter/rules/no-array-index-key) | -| `eslint-plugin-react` | [no-children-prop](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-children-prop.md) |[noChildrenProp](/linter/rules/no-children-prop) | -| `eslint-plugin-react` | [no-danger](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger.md) |[noDangerouslySetInnerHtmlWithChildren](/linter/rules/no-dangerously-set-inner-html-with-children) | -| `eslint-plugin-react` | [no-danger-with-children](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger-with-children.md) |[noDangerouslySetInnerHtml](/linter/rules/no-dangerously-set-inner-html) | -| `eslint-plugin-react` | [void-dom-elements-no-children](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/void-dom-elements-no-children.md) |[noVoidElementsWithChildren](/linter/rules/no-void-elements-with-children) | -| `eslint-plugin-react-hooks` | [exhaustive-deps](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md) |[useExhaustiveDependencies](/linter/rules/use-exhaustive-dependencies) | -| `eslint-plugin-react-hooks` | [rules-of-hooks](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md) |[useHookAtTopLevel](/linter/rules/use-hook-at-top-level) | -| `eslint-plugin-sonarjs` | [cognitive-complexity](https://github.com/SonarSource/eslint-plugin-sonarjs/blob/HEAD/docs/rules/cognitive-complexity.md) |[noExcessiveCognitiveComplexity](/linter/rules/no-excessive-cognitive-complexity) | -| `eslint-plugin-stylistic` | [jsx-self-closing-comp](https://eslint.style/rules/default/jsx-self-closing-comp) |[useSelfClosingElements](/linter/rules/use-self-closing-elements) | -| `eslint-plugin-unicorn` | [no-array-for-each](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-array-for-each.md) |[noForEach](/linter/rules/no-for-each) | -| `eslint-plugin-unicorn` | [no-instanceof-array](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-instanceof-array.md) |[useIsArray](/linter/rules/use-is-array) | -| `eslint-plugin-unicorn` | [no-useless-switch-case](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-useless-switch-case.md) |[noUselessSwitchCase](/linter/rules/no-useless-switch-case) | -| `eslint-plugin-unicorn` | [prefer-array-flat-map](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-array-flat-map.md) |[useFlatMap](/linter/rules/use-flat-map) | diff --git a/xtask/lintdoc/src/rules_sources.rs b/xtask/lintdoc/src/rules_sources.rs index a43cff44293a..5ec157ccc005 100644 --- a/xtask/lintdoc/src/rules_sources.rs +++ b/xtask/lintdoc/src/rules_sources.rs @@ -11,6 +11,7 @@ struct SourceSet { source_link: String, biome_rule_name: String, biome_link: String, + inspired: bool, } impl Ord for SourceSet { @@ -41,6 +42,13 @@ description: A page that maps lint rules from other sources to Biome "# )?; + writeln!( + buffer, + r#":::note +Some **Biome** rules might **not** have options, compared to the original rule. +:::"# + )?; + let rules = rules .into_iter() .flat_map(|(_, rule)| rule) @@ -57,6 +65,10 @@ description: A page that maps lint rules from other sources to Biome biome_link: format!("/lint/rules/{}", rule_name.to_case(Case::Kebab)), source_link: source.to_rule_url(), source_rule_name: source.as_rule_name().to_string(), + inspired: metadata + .source_kind + .map(|kind| kind.is_inspired()) + .unwrap_or(false), }); } else { let mut set = BTreeSet::new(); @@ -65,34 +77,58 @@ description: A page that maps lint rules from other sources to Biome biome_link: format!("/lint/rules/{}", rule_name.to_case(Case::Kebab)), source_link: source.to_rule_url(), source_rule_name: source.as_rule_name().to_string(), + inspired: metadata + .source_kind + .map(|kind| kind.is_inspired()) + .unwrap_or(true), }); rules_by_source.insert(format!("{source}"), set); } } } + let mut footnotes = 0; for (source, rules) in rules_by_source { writeln!(buffer, "## {source} rules to Biome")?; writeln!(buffer, r#"| {source} rule name | Biome rule name |"#)?; writeln!(buffer, r#"| ---- | ---- |"#)?; - push_to_table(rules, &mut buffer)?; + footnotes += push_to_table(rules, &mut buffer, footnotes)?; + } + + for index in 0..footnotes { + writeln!( + buffer, + "[^{}]: This rule is inspired from the source, so its logic might be different.", + index + 1 + )?; } Ok(buffer) } -fn push_to_table(source_set: BTreeSet, buffer: &mut Vec) -> Result<()> { +fn push_to_table( + source_set: BTreeSet, + buffer: &mut Vec, + start_from: u8, +) -> Result { + let mut footnotes = 0; for source_set in source_set { - writeln!( + write!( buffer, - "| [{}]({}) |[{}](/linter/rules/{}) |", + "| [{}]({}) |[{}](/linter/rules/{})", source_set.source_rule_name, source_set.source_link, source_set.biome_rule_name, source_set.biome_link )?; + + if source_set.inspired { + footnotes += 1; + write!(buffer, "[^{}]", start_from + footnotes)?; + } + writeln!(buffer, " |")?; } - Ok(()) + Ok(footnotes) } From 60c323c69d5b2c32e8a4e5b4472695098fab6940 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Thu, 18 Jan 2024 13:55:45 +0000 Subject: [PATCH 4/7] suggestions --- website/astro.config.ts | 10 +-- .../content/docs/linter/linter-sources.mdx | 85 +++++++------------ xtask/lintdoc/src/rules_sources.rs | 20 +---- 3 files changed, 41 insertions(+), 74 deletions(-) diff --git a/website/astro.config.ts b/website/astro.config.ts index 26007266dbdf..0f1995dc897a 100644 --- a/website/astro.config.ts +++ b/website/astro.config.ts @@ -210,16 +210,16 @@ export default defineConfig({ }, }, { - label: "Lint rules", + label: "Rules", link: "/linter/rules", translations: { - ja: "Lintルール", - "zh-CN": "Lint 规则", - "pt-BR": "Regras do Linter", + ja: "ルール", + "zh-CN": "规则", + "pt-BR": "Regras", }, }, { - label: "Linter sources", + label: "Rules sources", link: "/linter/linter-sources", }, ], diff --git a/website/src/content/docs/linter/linter-sources.mdx b/website/src/content/docs/linter/linter-sources.mdx index a56ec12f6995..1be78e53eaa2 100644 --- a/website/src/content/docs/linter/linter-sources.mdx +++ b/website/src/content/docs/linter/linter-sources.mdx @@ -6,13 +6,13 @@ description: A page that maps lint rules from other sources to Biome :::note Some **Biome** rules might **not** have options, compared to the original rule. ::: -## Clippy rules to Biome +## Clippy | Clippy rule name | Biome rule name | | ---- | ---- | -| [approx_constant](https://rust-lang.github.io/rust-clippy/master/#/approx_constant) |[noApproximativeNumericConstant](/linter/rules//lint/rules/no-approximative-numeric-constant)[^1] | +| [approx_constant](https://rust-lang.github.io/rust-clippy/master/#/approx_constant) |[noApproximativeNumericConstant](/linter/rules//lint/rules/no-approximative-numeric-constant) (inspired) | | [match_str_case_mismatch](https://rust-lang.github.io/rust-clippy/master/#/match_str_case_mismatch) |[noStringCaseMismatch](/linter/rules//lint/rules/no-string-case-mismatch) | | [misrefactored_assign_op](https://rust-lang.github.io/rust-clippy/master/#/misrefactored_assign_op) |[noMisrefactoredShorthandAssign](/linter/rules//lint/rules/no-misrefactored-shorthand-assign) | -## ESLint rules to Biome +## ESLint | ESLint rule name | Biome rule name | | ---- | ---- | | [constructor-super](https://eslint.org/docs/latest/rules/constructor-super) |[noInvalidConstructorSuper](/linter/rules//lint/rules/no-invalid-constructor-super) | @@ -27,8 +27,8 @@ Some **Biome** rules might **not** have options, compared to the original rule. | [no-case-declarations](https://eslint.org/docs/latest/rules/no-case-declarations) |[noSwitchDeclarations](/linter/rules//lint/rules/no-switch-declarations) | | [no-class-assign](https://eslint.org/docs/latest/rules/no-class-assign) |[noClassAssign](/linter/rules//lint/rules/no-class-assign) | | [no-compare-neg-zero](https://eslint.org/docs/latest/rules/no-compare-neg-zero) |[noCompareNegZero](/linter/rules//lint/rules/no-compare-neg-zero) | -| [no-cond-assign](https://eslint.org/docs/latest/rules/no-cond-assign) |[noAssignInExpressions](/linter/rules//lint/rules/no-assign-in-expressions)[^2] | -| [no-console](https://eslint.org/docs/latest/rules/no-console) |[noConsoleLog](/linter/rules//lint/rules/no-console-log)[^3] | +| [no-cond-assign](https://eslint.org/docs/latest/rules/no-cond-assign) |[noAssignInExpressions](/linter/rules//lint/rules/no-assign-in-expressions) (inspired) | +| [no-console](https://eslint.org/docs/latest/rules/no-console) |[noConsoleLog](/linter/rules//lint/rules/no-console-log) (inspired) | | [no-const-assign](https://eslint.org/docs/latest/rules/no-const-assign) |[noConstAssign](/linter/rules//lint/rules/no-const-assign) | | [no-constant-condition](https://eslint.org/docs/latest/rules/no-constant-condition) |[noConstantCondition](/linter/rules//lint/rules/no-constant-condition) | | [no-constructor-return](https://eslint.org/docs/latest/rules/no-constructor-return) |[noConstructorReturn](/linter/rules//lint/rules/no-constructor-return) | @@ -38,7 +38,7 @@ Some **Biome** rules might **not** have options, compared to the original rule. | [no-dupe-class-members](https://eslint.org/docs/latest/rules/no-dupe-class-members) |[noDuplicateClassMembers](/linter/rules//lint/rules/no-duplicate-class-members) | | [no-dupe-keys](https://eslint.org/docs/latest/rules/no-dupe-keys) |[noDuplicateObjectKeys](/linter/rules//lint/rules/no-duplicate-object-keys) | | [no-duplicate-case](https://eslint.org/docs/latest/rules/no-duplicate-case) |[noDuplicateCase](/linter/rules//lint/rules/no-duplicate-case) | -| [no-else-return](https://eslint.org/docs/latest/rules/no-else-return) |[noUselessElse](/linter/rules//lint/rules/no-useless-else)[^4] | +| [no-else-return](https://eslint.org/docs/latest/rules/no-else-return) |[noUselessElse](/linter/rules//lint/rules/no-useless-else) (inspired) | | [no-empty-character-class](https://eslint.org/docs/latest/rules/no-empty-character-class) |[noEmptyCharacterClassInRegex](/linter/rules//lint/rules/no-empty-character-class-in-regex) | | [no-empty-pattern](https://eslint.org/docs/latest/rules/no-empty-pattern) |[noEmptyPattern](/linter/rules//lint/rules/no-empty-pattern) | | [no-ex-assign](https://eslint.org/docs/latest/rules/no-ex-assign) |[noCatchAssign](/linter/rules//lint/rules/no-catch-assign) | @@ -49,7 +49,7 @@ Some **Biome** rules might **not** have options, compared to the original rule. | [no-import-assign](https://eslint.org/docs/latest/rules/no-import-assign) |[noImportAssign](/linter/rules//lint/rules/no-import-assign) | | [no-inner-declarations](https://eslint.org/docs/latest/rules/no-inner-declarations) |[noInnerDeclarations](/linter/rules//lint/rules/no-inner-declarations) | | [no-label-var](https://eslint.org/docs/latest/rules/no-label-var) |[noLabelVar](/linter/rules//lint/rules/no-label-var) | -| [no-labels](https://eslint.org/docs/latest/rules/no-labels) |[noConfusingLabels](/linter/rules//lint/rules/no-confusing-labels)[^5] | +| [no-labels](https://eslint.org/docs/latest/rules/no-labels) |[noConfusingLabels](/linter/rules//lint/rules/no-confusing-labels) (inspired) | | [no-lonely-if](https://eslint.org/docs/latest/rules/no-lonely-if) |[useCollapsedElseIf](/linter/rules//lint/rules/use-collapsed-else-if) | | [no-loss-of-precision](https://eslint.org/docs/latest/rules/no-loss-of-precision) |[noPrecisionLoss](/linter/rules//lint/rules/no-precision-loss) | | [no-negated-condition](https://eslint.org/docs/latest/rules/no-negated-condition) |[noNegationElse](/linter/rules//lint/rules/no-negation-else) | @@ -82,21 +82,21 @@ Some **Biome** rules might **not** have options, compared to the original rule. | [no-with](https://eslint.org/docs/latest/rules/no-with) |[noWith](/linter/rules//lint/rules/no-with) | | [one-var](https://eslint.org/docs/latest/rules/one-var) |[useSingleVarDeclarator](/linter/rules//lint/rules/use-single-var-declarator) | | [operator-assignment](https://eslint.org/docs/latest/rules/operator-assignment) |[useShorthandAssign](/linter/rules//lint/rules/use-shorthand-assign) | -| [prefer-arrow-callback](https://eslint.org/docs/latest/rules/prefer-arrow-callback) |[useArrowFunction](/linter/rules//lint/rules/use-arrow-function)[^6] | +| [prefer-arrow-callback](https://eslint.org/docs/latest/rules/prefer-arrow-callback) |[useArrowFunction](/linter/rules//lint/rules/use-arrow-function) (inspired) | | [prefer-const](https://eslint.org/docs/latest/rules/prefer-const) |[useConst](/linter/rules//lint/rules/use-const) | | [prefer-exponentiation-operator](https://eslint.org/docs/latest/rules/prefer-exponentiation-operator) |[useExponentiationOperator](/linter/rules//lint/rules/use-exponentiation-operator) | | [prefer-numeric-literals](https://eslint.org/docs/latest/rules/prefer-numeric-literals) |[useNumericLiterals](/linter/rules//lint/rules/use-numeric-literals) | | [prefer-regex-literals](https://eslint.org/docs/latest/rules/prefer-regex-literals) |[useRegexLiterals](/linter/rules//lint/rules/use-regex-literals) | -| [prefer-rest-params](https://eslint.org/docs/latest/rules/prefer-rest-params) |[noArguments](/linter/rules//lint/rules/no-arguments)[^7] | +| [prefer-rest-params](https://eslint.org/docs/latest/rules/prefer-rest-params) |[noArguments](/linter/rules//lint/rules/no-arguments) (inspired) | | [prefer-template](https://eslint.org/docs/latest/rules/prefer-template) |[useTemplate](/linter/rules//lint/rules/use-template) | | [require-yield](https://eslint.org/docs/latest/rules/require-yield) |[useYield](/linter/rules//lint/rules/use-yield) | | [use-isnan](https://eslint.org/docs/latest/rules/use-isnan) |[useIsNan](/linter/rules//lint/rules/use-is-nan) | | [valid-typeof](https://eslint.org/docs/latest/rules/valid-typeof) |[useValidTypeof](/linter/rules//lint/rules/use-valid-typeof) | -## eslint-plugin-import rules to Biome +## eslint-plugin-import | eslint-plugin-import rule name | Biome rule name | | ---- | ---- | -| [no-default-export](https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-default-export.md) |[noDefaultExport](/linter/rules//lint/rules/no-default-export)[^8] | -## eslint-plugin-jsx-a11y rules to Biome +| [no-default-export](https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-default-export.md) |[noDefaultExport](/linter/rules//lint/rules/no-default-export) (inspired) | +## eslint-plugin-jsx-a11y | eslint-plugin-jsx-a11y rule name | Biome rule name | | ---- | ---- | | [alt-text](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/alt-text.md) |[useAltText](/linter/rules//lint/rules/use-alt-text) | @@ -114,7 +114,7 @@ Some **Biome** rules might **not** have options, compared to the original rule. | [lang](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/lang.md) |[useValidLang](/linter/rules//lint/rules/use-valid-lang) | | [media-has-caption](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/media-has-caption.md) |[useMediaCaption](/linter/rules//lint/rules/use-media-caption) | | [mouse-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/mouse-events-have-key-events.md) |[useKeyWithMouseEvents](/linter/rules//lint/rules/use-key-with-mouse-events) | -| [no-access-key](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-access-key.md) |[noAccessKey](/linter/rules//lint/rules/no-access-key)[^9] | +| [no-access-key](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-access-key.md) |[noAccessKey](/linter/rules//lint/rules/no-access-key) (inspired) | | [no-aria-hidden-on-focusable](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-aria-hidden-on-focusable.md) |[noAriaHiddenOnFocusable](/linter/rules//lint/rules/no-aria-hidden-on-focusable) | | [no-autofocus](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-autofocus.md) |[noAutofocus](/linter/rules//lint/rules/no-autofocus) | | [no-distracting-elements](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-distracting-elements.md) |[noDistractingElements](/linter/rules//lint/rules/no-distracting-elements) | @@ -125,11 +125,11 @@ Some **Biome** rules might **not** have options, compared to the original rule. | [role-has-required-aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/role-has-required-aria-props.md) |[useAriaPropsForRole](/linter/rules//lint/rules/use-aria-props-for-role) | | [scope](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/scope.md) |[noHeaderScope](/linter/rules//lint/rules/no-header-scope) | | [tabindex-no-positive](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/tabindex-no-positive.md) |[noPositiveTabindex](/linter/rules//lint/rules/no-positive-tabindex) | -## eslint-plugin-mysticates rules to Biome +## eslint-plugin-mysticates | eslint-plugin-mysticates rule name | Biome rule name | | ---- | ---- | -| [no-this-in-static](https://github.com/mysticatea/eslint-plugin/blob/master/docs/rules/no-this-in-static.md) |[noThisInStatic](/linter/rules//lint/rules/no-this-in-static)[^10] | -## eslint-plugin-react rules to Biome +| [no-this-in-static](https://github.com/mysticatea/eslint-plugin/blob/master/docs/rules/no-this-in-static.md) |[noThisInStatic](/linter/rules//lint/rules/no-this-in-static) (inspired) | +## eslint-plugin-react | eslint-plugin-react rule name | Biome rule name | | ---- | ---- | | [button-has-type](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/button-has-type.md) |[useButtonType](/linter/rules//lint/rules/use-button-type) | @@ -139,31 +139,31 @@ Some **Biome** rules might **not** have options, compared to the original rule. | [jsx-no-duplicate-props](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-duplicate-props.md) |[noDuplicateJsxProps](/linter/rules//lint/rules/no-duplicate-jsx-props) | | [jsx-no-target-blank](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-target-blank.md) |[noBlankTarget](/linter/rules//lint/rules/no-blank-target) | | [jsx-no-useless-fragment](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-useless-fragment.md) |[noUselessFragments](/linter/rules//lint/rules/no-useless-fragments) | -| [no-array-index-key](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-array-index-key.md) |[noArrayIndexKey](/linter/rules//lint/rules/no-array-index-key)[^11] | +| [no-array-index-key](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-array-index-key.md) |[noArrayIndexKey](/linter/rules//lint/rules/no-array-index-key) (inspired) | | [no-children-prop](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-children-prop.md) |[noChildrenProp](/linter/rules//lint/rules/no-children-prop) | | [no-danger](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger.md) |[noDangerouslySetInnerHtmlWithChildren](/linter/rules//lint/rules/no-dangerously-set-inner-html-with-children) | | [no-danger-with-children](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger-with-children.md) |[noDangerouslySetInnerHtml](/linter/rules//lint/rules/no-dangerously-set-inner-html) | | [void-dom-elements-no-children](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/void-dom-elements-no-children.md) |[noVoidElementsWithChildren](/linter/rules//lint/rules/no-void-elements-with-children) | -## eslint-plugin-react-hooks rules to Biome +## eslint-plugin-react-hooks | eslint-plugin-react-hooks rule name | Biome rule name | | ---- | ---- | -| [exhaustive-deps](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md) |[useExhaustiveDependencies](/linter/rules//lint/rules/use-exhaustive-dependencies)[^12] | +| [exhaustive-deps](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md) |[useExhaustiveDependencies](/linter/rules//lint/rules/use-exhaustive-dependencies) (inspired) | | [rules-of-hooks](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md) |[useHookAtTopLevel](/linter/rules//lint/rules/use-hook-at-top-level) | -## eslint-plugin-sonarjs rules to Biome +## eslint-plugin-sonarjs | eslint-plugin-sonarjs rule name | Biome rule name | | ---- | ---- | -| [cognitive-complexity](https://github.com/SonarSource/eslint-plugin-sonarjs/blob/HEAD/docs/rules/cognitive-complexity.md) |[noExcessiveCognitiveComplexity](/linter/rules//lint/rules/no-excessive-cognitive-complexity)[^13] | -## eslint-plugin-stylistic rules to Biome +| [cognitive-complexity](https://github.com/SonarSource/eslint-plugin-sonarjs/blob/HEAD/docs/rules/cognitive-complexity.md) |[noExcessiveCognitiveComplexity](/linter/rules//lint/rules/no-excessive-cognitive-complexity) (inspired) | +## eslint-plugin-stylistic | eslint-plugin-stylistic rule name | Biome rule name | | ---- | ---- | -| [jsx-self-closing-comp](https://eslint.style/rules/default/jsx-self-closing-comp) |[useSelfClosingElements](/linter/rules//lint/rules/use-self-closing-elements)[^14] | -## eslint-plugin-typescript rules to Biome +| [jsx-self-closing-comp](https://eslint.style/rules/default/jsx-self-closing-comp) |[useSelfClosingElements](/linter/rules//lint/rules/use-self-closing-elements) (inspired) | +## eslint-plugin-typescript | eslint-plugin-typescript rule name | Biome rule name | | ---- | ---- | -| [array-type](https://typescript-eslint.io/rules/array-type) |[useShorthandArrayType](/linter/rules//lint/rules/use-shorthand-array-type)[^15] | -| [ban-types](https://typescript-eslint.io/rules/ban-types) |[noBannedTypes](/linter/rules//lint/rules/no-banned-types)[^16] | -| [naming-convention](https://typescript-eslint.io/rules/naming-convention) |[useNamingConvention](/linter/rules//lint/rules/use-naming-convention)[^17] | -| [no-empty-interface](https://typescript-eslint.io/rules/no-empty-interface) |[noEmptyInterface](/linter/rules//lint/rules/no-empty-interface)[^18] | +| [array-type](https://typescript-eslint.io/rules/array-type) |[useShorthandArrayType](/linter/rules//lint/rules/use-shorthand-array-type) (inspired) | +| [ban-types](https://typescript-eslint.io/rules/ban-types) |[noBannedTypes](/linter/rules//lint/rules/no-banned-types) (inspired) | +| [naming-convention](https://typescript-eslint.io/rules/naming-convention) |[useNamingConvention](/linter/rules//lint/rules/use-naming-convention) (inspired) | +| [no-empty-interface](https://typescript-eslint.io/rules/no-empty-interface) |[noEmptyInterface](/linter/rules//lint/rules/no-empty-interface) (inspired) | | [no-explicit-any](https://typescript-eslint.io/rules/no-explicit-any) |[noExplicitAny](/linter/rules//lint/rules/no-explicit-any) | | [no-extra-non-null-assertion](https://typescript-eslint.io/rules/no-extra-non-null-assertion) |[noExtraNonNullAssertion](/linter/rules//lint/rules/no-extra-non-null-assertion) | | [no-extraneous-class](https://typescript-eslint.io/rules/no-extraneous-class) |[noStaticOnlyClass](/linter/rules//lint/rules/no-static-only-class) | @@ -173,43 +173,22 @@ Some **Biome** rules might **not** have options, compared to the original rule. | [no-namespace](https://typescript-eslint.io/rules/no-namespace) |[noNamespace](/linter/rules//lint/rules/no-namespace) | | [no-non-null-assertion](https://typescript-eslint.io/rules/no-non-null-assertion) |[noNonNullAssertion](/linter/rules//lint/rules/no-non-null-assertion) | | [no-redeclare](https://typescript-eslint.io/rules/no-redeclare) |[noRedeclare](/linter/rules//lint/rules/no-redeclare) | -| [no-this-alias](https://typescript-eslint.io/rules/no-this-alias) |[noUselessThisAlias](/linter/rules//lint/rules/no-useless-this-alias)[^19] | +| [no-this-alias](https://typescript-eslint.io/rules/no-this-alias) |[noUselessThisAlias](/linter/rules//lint/rules/no-useless-this-alias) (inspired) | | [no-unnecessary-type-constraint](https://typescript-eslint.io/rules/no-unnecessary-type-constraint) |[noUselessTypeConstraint](/linter/rules//lint/rules/no-useless-type-constraint) | | [no-unsafe-declaration-merging](https://typescript-eslint.io/rules/no-unsafe-declaration-merging) |[noUnsafeDeclarationMerging](/linter/rules//lint/rules/no-unsafe-declaration-merging) | | [no-useless-constructor](https://typescript-eslint.io/rules/no-useless-constructor) |[noUselessConstructor](/linter/rules//lint/rules/no-useless-constructor) | | [no-useless-empty-export](https://typescript-eslint.io/rules/no-useless-empty-export) |[noUselessEmptyExport](/linter/rules//lint/rules/no-useless-empty-export) | | [no-useless-template-literals](https://typescript-eslint.io/rules/no-useless-template-literals) |[noUnusedTemplateLiteral](/linter/rules//lint/rules/no-unused-template-literal) | -| [parameter-properties](https://typescript-eslint.io/rules/parameter-properties) |[noParameterProperties](/linter/rules//lint/rules/no-parameter-properties)[^20] | +| [parameter-properties](https://typescript-eslint.io/rules/parameter-properties) |[noParameterProperties](/linter/rules//lint/rules/no-parameter-properties) (inspired) | | [prefer-as-const](https://typescript-eslint.io/rules/prefer-as-const) |[useAsConstAssertion](/linter/rules//lint/rules/use-as-const-assertion) | | [prefer-enum-initializers](https://typescript-eslint.io/rules/prefer-enum-initializers) |[useEnumInitializers](/linter/rules//lint/rules/use-enum-initializers) | | [prefer-literal-enum-member](https://typescript-eslint.io/rules/prefer-literal-enum-member) |[useLiteralEnumMembers](/linter/rules//lint/rules/use-literal-enum-members) | | [prefer-namespace-keyword](https://typescript-eslint.io/rules/prefer-namespace-keyword) |[useNamespaceKeyword](/linter/rules//lint/rules/use-namespace-keyword) | | [prefer-optional-chain](https://typescript-eslint.io/rules/prefer-optional-chain) |[useOptionalChain](/linter/rules//lint/rules/use-optional-chain) | -## eslint-plugin-unicorn rules to Biome +## eslint-plugin-unicorn | eslint-plugin-unicorn rule name | Biome rule name | | ---- | ---- | -| [no-array-for-each](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-array-for-each.md) |[noForEach](/linter/rules//lint/rules/no-for-each)[^21] | +| [no-array-for-each](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-array-for-each.md) |[noForEach](/linter/rules//lint/rules/no-for-each) (inspired) | | [no-instanceof-array](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-instanceof-array.md) |[useIsArray](/linter/rules//lint/rules/use-is-array) | | [no-useless-switch-case](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-useless-switch-case.md) |[noUselessSwitchCase](/linter/rules//lint/rules/no-useless-switch-case) | | [prefer-array-flat-map](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-array-flat-map.md) |[useFlatMap](/linter/rules//lint/rules/use-flat-map) | -[^1]: This rule is inspired from the source, so its logic might be different. -[^2]: This rule is inspired from the source, so its logic might be different. -[^3]: This rule is inspired from the source, so its logic might be different. -[^4]: This rule is inspired from the source, so its logic might be different. -[^5]: This rule is inspired from the source, so its logic might be different. -[^6]: This rule is inspired from the source, so its logic might be different. -[^7]: This rule is inspired from the source, so its logic might be different. -[^8]: This rule is inspired from the source, so its logic might be different. -[^9]: This rule is inspired from the source, so its logic might be different. -[^10]: This rule is inspired from the source, so its logic might be different. -[^11]: This rule is inspired from the source, so its logic might be different. -[^12]: This rule is inspired from the source, so its logic might be different. -[^13]: This rule is inspired from the source, so its logic might be different. -[^14]: This rule is inspired from the source, so its logic might be different. -[^15]: This rule is inspired from the source, so its logic might be different. -[^16]: This rule is inspired from the source, so its logic might be different. -[^17]: This rule is inspired from the source, so its logic might be different. -[^18]: This rule is inspired from the source, so its logic might be different. -[^19]: This rule is inspired from the source, so its logic might be different. -[^20]: This rule is inspired from the source, so its logic might be different. -[^21]: This rule is inspired from the source, so its logic might be different. diff --git a/xtask/lintdoc/src/rules_sources.rs b/xtask/lintdoc/src/rules_sources.rs index 5ec157ccc005..5fb4f3a0de68 100644 --- a/xtask/lintdoc/src/rules_sources.rs +++ b/xtask/lintdoc/src/rules_sources.rs @@ -89,29 +89,17 @@ Some **Biome** rules might **not** have options, compared to the original rule. let mut footnotes = 0; for (source, rules) in rules_by_source { - writeln!(buffer, "## {source} rules to Biome")?; + writeln!(buffer, "## {source}")?; writeln!(buffer, r#"| {source} rule name | Biome rule name |"#)?; writeln!(buffer, r#"| ---- | ---- |"#)?; - footnotes += push_to_table(rules, &mut buffer, footnotes)?; - } - - for index in 0..footnotes { - writeln!( - buffer, - "[^{}]: This rule is inspired from the source, so its logic might be different.", - index + 1 - )?; + footnotes += push_to_table(rules, &mut buffer)?; } Ok(buffer) } -fn push_to_table( - source_set: BTreeSet, - buffer: &mut Vec, - start_from: u8, -) -> Result { +fn push_to_table(source_set: BTreeSet, buffer: &mut Vec) -> Result { let mut footnotes = 0; for source_set in source_set { write!( @@ -125,7 +113,7 @@ fn push_to_table( if source_set.inspired { footnotes += 1; - write!(buffer, "[^{}]", start_from + footnotes)?; + write!(buffer, " (inspired)")?; } writeln!(buffer, " |")?; } From 0176247bf5334ef9aeaf1da37c585cc2534bf081 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Thu, 18 Jan 2024 15:46:21 +0000 Subject: [PATCH 5/7] clippy --- xtask/lintdoc/src/rules_sources.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/xtask/lintdoc/src/rules_sources.rs b/xtask/lintdoc/src/rules_sources.rs index 5fb4f3a0de68..7c7a90c37d71 100644 --- a/xtask/lintdoc/src/rules_sources.rs +++ b/xtask/lintdoc/src/rules_sources.rs @@ -87,13 +87,12 @@ Some **Biome** rules might **not** have options, compared to the original rule. } } - let mut footnotes = 0; for (source, rules) in rules_by_source { writeln!(buffer, "## {source}")?; writeln!(buffer, r#"| {source} rule name | Biome rule name |"#)?; writeln!(buffer, r#"| ---- | ---- |"#)?; - footnotes += push_to_table(rules, &mut buffer)?; + push_to_table(rules, &mut buffer)?; } Ok(buffer) From f81cc126475467dea2466f78471325f0a42f3401 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Thu, 18 Jan 2024 16:50:28 +0000 Subject: [PATCH 6/7] feedback --- website/astro.config.ts | 2 +- .../docs/linter/{linter-sources.mdx => rules-sources.mdx} | 2 +- xtask/lintdoc/src/rules_sources.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename website/src/content/docs/linter/{linter-sources.mdx => rules-sources.mdx} (99%) diff --git a/website/astro.config.ts b/website/astro.config.ts index 0f1995dc897a..760d12562211 100644 --- a/website/astro.config.ts +++ b/website/astro.config.ts @@ -220,7 +220,7 @@ export default defineConfig({ }, { label: "Rules sources", - link: "/linter/linter-sources", + link: "/linter/rules-sources", }, ], }, diff --git a/website/src/content/docs/linter/linter-sources.mdx b/website/src/content/docs/linter/rules-sources.mdx similarity index 99% rename from website/src/content/docs/linter/linter-sources.mdx rename to website/src/content/docs/linter/rules-sources.mdx index 1be78e53eaa2..adc48559bece 100644 --- a/website/src/content/docs/linter/linter-sources.mdx +++ b/website/src/content/docs/linter/rules-sources.mdx @@ -1,5 +1,5 @@ --- -title: Linter sources +title: Rules sources description: A page that maps lint rules from other sources to Biome --- diff --git a/xtask/lintdoc/src/rules_sources.rs b/xtask/lintdoc/src/rules_sources.rs index 7c7a90c37d71..f404080695e4 100644 --- a/xtask/lintdoc/src/rules_sources.rs +++ b/xtask/lintdoc/src/rules_sources.rs @@ -36,7 +36,7 @@ pub(crate) fn generate_rule_sources( writeln!( buffer, r#"--- -title: Linter sources +title: Rules sources description: A page that maps lint rules from other sources to Biome --- "# From a4652e34be792d6c64ef762884d4d73e859ad00d Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Thu, 18 Jan 2024 16:52:54 +0000 Subject: [PATCH 7/7] feedback --- website/src/content/docs/linter/rules/index.mdx | 2 +- xtask/lintdoc/src/main.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/website/src/content/docs/linter/rules/index.mdx b/website/src/content/docs/linter/rules/index.mdx index 0fe698d44802..4f95ec37e41a 100644 --- a/website/src/content/docs/linter/rules/index.mdx +++ b/website/src/content/docs/linter/rules/index.mdx @@ -1,5 +1,5 @@ --- -title: Lint Rules +title: Rules description: List of available lint rules. --- diff --git a/xtask/lintdoc/src/main.rs b/xtask/lintdoc/src/main.rs index 21916a29113c..2043256de0d2 100644 --- a/xtask/lintdoc/src/main.rs +++ b/xtask/lintdoc/src/main.rs @@ -33,7 +33,7 @@ use xtask::{glue::fs2, *}; fn main() -> Result<()> { let root = project_root().join("website/src/content/docs/linter/rules"); let reference_groups = project_root().join("website/src/components/generated/Groups.astro"); - let rules_sources = project_root().join("website/src/content/docs/linter/linter-sources.mdx"); + let rules_sources = project_root().join("website/src/content/docs/linter/rules-sources.mdx"); let reference_number_of_rules = project_root().join("website/src/components/generated/NumberOfRules.astro"); let reference_recommended_rules = @@ -56,7 +56,7 @@ fn main() -> Result<()> { let mut index = Vec::new(); let mut reference_buffer = Vec::new(); writeln!(index, "---")?; - writeln!(index, "title: Lint Rules")?; + writeln!(index, "title: Rules")?; writeln!(index, "description: List of available lint rules.")?; writeln!(index, "---")?; writeln!(index)?;