diff --git a/apps/oxlint/fixtures/tsgolint/.oxlintrc.json b/apps/oxlint/fixtures/tsgolint/.oxlintrc.json index 5d55dd1318722..5deeaf4964ef2 100644 --- a/apps/oxlint/fixtures/tsgolint/.oxlintrc.json +++ b/apps/oxlint/fixtures/tsgolint/.oxlintrc.json @@ -17,6 +17,7 @@ "typescript/no-mixed-enums": "error", "typescript/no-redundant-type-constituents": "error", "typescript/no-unnecessary-boolean-literal-compare": "error", + "typescript/no-unnecessary-condition": "error", "typescript/no-unnecessary-template-expression": "error", "typescript/no-unnecessary-type-arguments": "error", "typescript/no-unnecessary-type-assertion": "error", diff --git a/apps/oxlint/fixtures/tsgolint/no-unnecessary-condition.ts b/apps/oxlint/fixtures/tsgolint/no-unnecessary-condition.ts new file mode 100644 index 0000000000000..b8108409f87b3 --- /dev/null +++ b/apps/oxlint/fixtures/tsgolint/no-unnecessary-condition.ts @@ -0,0 +1,3 @@ +declare const b1: object; +declare const b2: boolean; +export const t1 = b1 && b2; diff --git a/apps/oxlint/fixtures/tsgolint_rule_options/.oxlintrc.json b/apps/oxlint/fixtures/tsgolint_rule_options/.oxlintrc.json index 1840e61c469cf..4e0d468b2d2d5 100644 --- a/apps/oxlint/fixtures/tsgolint_rule_options/.oxlintrc.json +++ b/apps/oxlint/fixtures/tsgolint_rule_options/.oxlintrc.json @@ -44,6 +44,14 @@ "allowOptionalChaining": true } ], + "typescript/no-unnecessary-condition": [ + "error", + { + "allowConstantLoopConditions": true, + "checkTypePredicates": false, + "allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing": false + } + ], "typescript/only-throw-error": [ "error", { diff --git a/apps/oxlint/fixtures/tsgolint_rule_options/test.ts b/apps/oxlint/fixtures/tsgolint_rule_options/test.ts index 5a0f994670270..0c5ad984174b9 100644 --- a/apps/oxlint/fixtures/tsgolint_rule_options/test.ts +++ b/apps/oxlint/fixtures/tsgolint_rule_options/test.ts @@ -62,6 +62,18 @@ declare const unknownValue: unknown; // This SHOULD error because checkUnknown is true const unknownStr = unknownValue.toString(); +// Test no-unnecessary-condition with allowConstantLoopConditions option +declare const alwaysTruthyObject: object; +// This SHOULD error because this object is always truthy +if (alwaysTruthyObject) { + result += 1; +} + +// This should NOT error because allowConstantLoopConditions is true +while (true) { + break; +} + // Test only-throw-error with allowRethrowing option // When allowRethrowing is false, rethrowing a caught error SHOULD error try { diff --git a/apps/oxlint/src/snapshots/fixtures__tsgolint_--type-aware --silent@oxlint.snap b/apps/oxlint/src/snapshots/fixtures__tsgolint_--type-aware --silent@oxlint.snap index 70fdc95152248..8382d15c16563 100644 --- a/apps/oxlint/src/snapshots/fixtures__tsgolint_--type-aware --silent@oxlint.snap +++ b/apps/oxlint/src/snapshots/fixtures__tsgolint_--type-aware --silent@oxlint.snap @@ -6,8 +6,8 @@ arguments: --type-aware --silent working directory: fixtures/tsgolint ---------- -Found 0 warnings and 52 errors. -Finished in ms on 46 files with 45 rules using 1 threads. +Found 0 warnings and 57 errors. +Finished in ms on 47 files with 46 rules using 1 threads. ---------- CLI result: LintFoundErrors ---------- diff --git a/apps/oxlint/src/snapshots/fixtures__tsgolint_--type-aware -c config-test.json@oxlint.snap b/apps/oxlint/src/snapshots/fixtures__tsgolint_--type-aware -c config-test.json@oxlint.snap index 26a401ceb686a..046f6457dc2c9 100644 --- a/apps/oxlint/src/snapshots/fixtures__tsgolint_--type-aware -c config-test.json@oxlint.snap +++ b/apps/oxlint/src/snapshots/fixtures__tsgolint_--type-aware -c config-test.json@oxlint.snap @@ -40,7 +40,7 @@ working directory: fixtures/tsgolint help: Remove the debugger statement Found 2 warnings and 2 errors. -Finished in ms on 46 files with 1 rules using 1 threads. +Finished in ms on 47 files with 1 rules using 1 threads. ---------- CLI result: LintFoundErrors ---------- diff --git a/apps/oxlint/src/snapshots/fixtures__tsgolint_--type-aware test.svelte@oxlint.snap b/apps/oxlint/src/snapshots/fixtures__tsgolint_--type-aware test.svelte@oxlint.snap index 1b78a016e6efa..083c9b71e8cee 100644 --- a/apps/oxlint/src/snapshots/fixtures__tsgolint_--type-aware test.svelte@oxlint.snap +++ b/apps/oxlint/src/snapshots/fixtures__tsgolint_--type-aware test.svelte@oxlint.snap @@ -16,7 +16,7 @@ working directory: fixtures/tsgolint help: Remove the debugger statement Found 0 warnings and 1 error. -Finished in ms on 1 file with 45 rules using 1 threads. +Finished in ms on 1 file with 46 rules using 1 threads. ---------- CLI result: LintFoundErrors ---------- diff --git a/apps/oxlint/src/snapshots/fixtures__tsgolint_--type-aware@oxlint.snap b/apps/oxlint/src/snapshots/fixtures__tsgolint_--type-aware@oxlint.snap index 96c52479a99d1..9059ad44ab22b 100644 --- a/apps/oxlint/src/snapshots/fixtures__tsgolint_--type-aware@oxlint.snap +++ b/apps/oxlint/src/snapshots/fixtures__tsgolint_--type-aware@oxlint.snap @@ -134,6 +134,20 @@ working directory: fixtures/tsgolint 3 | } `---- + x typescript-eslint(no-unnecessary-condition): Unnecessary conditional, value is always truthy. + ,-[no-unnecessary-condition.ts:3:19] + 2 | declare const b2: boolean; + 3 | export const t1 = b1 && b2; + : ^^ + `---- + + x typescript-eslint(strict-boolean-expressions): Unexpected object value in conditional. An object is always truthy. + ,-[no-unnecessary-condition.ts:3:19] + 2 | declare const b2: boolean; + 3 | export const t1 = b1 && b2; + : ^^ + `---- + x typescript-eslint(no-unnecessary-template-expression): Template literal expression is unnecessary and can be simplified. ,-[no-unnecessary-template-expression.ts:2:18] 1 | const text = 'hello'; @@ -181,6 +195,14 @@ working directory: fixtures/tsgolint 3 | `---- + x typescript-eslint(no-unnecessary-condition): Unnecessary comparison between literal values. + ,-[no-unsafe-enum-comparison.ts:9:20] + 8 | } + 9 | const comparison = Status.Open === Color.Red; + : ^^^^^^^^^^^^^^^^^^^^^^^^^ + 10 | + `---- + x typescript-eslint(no-unsafe-enum-comparison): The two values in this comparison do not have a shared enum type. ,-[no-unsafe-enum-comparison.ts:9:20] 8 | } @@ -283,6 +305,13 @@ working directory: fixtures/tsgolint : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `---- + x typescript-eslint(no-unnecessary-condition): This condition will always return the same value since the types have no overlap. + ,-[prefer-nullish-coalescing.ts:2:50] + 1 | declare const nullableString: string | null; + 2 | const nullishResult = nullableString !== null && nullableString !== undefined ? nullableString : 'default'; + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + x typescript-eslint(prefer-optional-chain): Prefer using an optional chain expression instead, as it's more concise and easier to read. ,-[prefer-optional-chain.ts:3:1] 2 | declare const fooOptC: { bar: number } | null | undefined; @@ -381,6 +410,14 @@ working directory: fixtures/tsgolint 3 | `---- + x typescript-eslint(no-unnecessary-condition): Unnecessary conditional, value is always truthy. + ,-[strict-boolean-expressions.ts:2:5] + 1 | const str = 'hello'; + 2 | if (str) { + : ^^^ + 3 | } + `---- + x typescript-eslint(switch-exhaustiveness-check): Switch is not exhaustive ,-[switch-exhaustiveness-check.ts:3:11] 2 | function handleStatus(status: Status) { @@ -406,8 +443,8 @@ working directory: fixtures/tsgolint : ^^^^^^^^ `---- -Found 0 warnings and 52 errors. -Finished in ms on 46 files with 45 rules using 1 threads. +Found 0 warnings and 57 errors. +Finished in ms on 47 files with 46 rules using 1 threads. ---------- CLI result: LintFoundErrors ---------- diff --git a/apps/oxlint/src/snapshots/fixtures__tsgolint_rule_options_--type-aware@oxlint.snap b/apps/oxlint/src/snapshots/fixtures__tsgolint_rule_options_--type-aware@oxlint.snap index 4f64429094a4c..5a0a3900ac59d 100644 --- a/apps/oxlint/src/snapshots/fixtures__tsgolint_rule_options_--type-aware@oxlint.snap +++ b/apps/oxlint/src/snapshots/fixtures__tsgolint_rule_options_--type-aware@oxlint.snap @@ -40,8 +40,16 @@ working directory: fixtures/tsgolint_rule_options `---- help: Consider picking a property (e.g. `user.name`), using a formatter (or `JSON.stringify`), or implementing a custom `toString()`/`toLocaleString()` on the type. -Found 0 warnings and 4 errors. -Finished in ms on 1 file with 7 rules using 1 threads. + x typescript-eslint(no-unnecessary-condition): Unnecessary conditional, value is always truthy. + ,-[test.ts:68:5] + 67 | // This SHOULD error because this object is always truthy + 68 | if (alwaysTruthyObject) { + : ^^^^^^^^^^^^^^^^^^ + 69 | result += 1; + `---- + +Found 0 warnings and 5 errors. +Finished in ms on 1 file with 8 rules using 1 threads. ---------- CLI result: LintFoundErrors ---------- diff --git a/crates/oxc_linter/src/generated/rule_runner_impls.rs b/crates/oxc_linter/src/generated/rule_runner_impls.rs index 95421eb20b08c..3d3da94c59a3a 100644 --- a/crates/oxc_linter/src/generated/rule_runner_impls.rs +++ b/crates/oxc_linter/src/generated/rule_runner_impls.rs @@ -1666,6 +1666,11 @@ impl RuleRunner for crate::rules::typescript::no_unnecessary_boolean_literal_com const RUN_FUNCTIONS: RuleRunFunctionsImplemented = RuleRunFunctionsImplemented::Unknown; } +impl RuleRunner for crate::rules::typescript::no_unnecessary_condition::NoUnnecessaryCondition { + const NODE_TYPES: Option<&AstTypesBitset> = None; + const RUN_FUNCTIONS: RuleRunFunctionsImplemented = RuleRunFunctionsImplemented::Unknown; +} + impl RuleRunner for crate::rules::typescript::no_unnecessary_parameter_property_assignment::NoUnnecessaryParameterPropertyAssignment { const NODE_TYPES: Option<&AstTypesBitset> = Some(&AstTypesBitset::from_types(&[AstType::MethodDefinition])); const RUN_FUNCTIONS: RuleRunFunctionsImplemented = RuleRunFunctionsImplemented::Run; diff --git a/crates/oxc_linter/src/generated/rules_enum.rs b/crates/oxc_linter/src/generated/rules_enum.rs index 35cbdd516678d..223724c818df6 100644 --- a/crates/oxc_linter/src/generated/rules_enum.rs +++ b/crates/oxc_linter/src/generated/rules_enum.rs @@ -479,6 +479,7 @@ pub use crate::rules::typescript::no_require_imports::NoRequireImports as Typesc pub use crate::rules::typescript::no_restricted_types::NoRestrictedTypes as TypescriptNoRestrictedTypes; pub use crate::rules::typescript::no_this_alias::NoThisAlias as TypescriptNoThisAlias; pub use crate::rules::typescript::no_unnecessary_boolean_literal_compare::NoUnnecessaryBooleanLiteralCompare as TypescriptNoUnnecessaryBooleanLiteralCompare; +pub use crate::rules::typescript::no_unnecessary_condition::NoUnnecessaryCondition as TypescriptNoUnnecessaryCondition; pub use crate::rules::typescript::no_unnecessary_parameter_property_assignment::NoUnnecessaryParameterPropertyAssignment as TypescriptNoUnnecessaryParameterPropertyAssignment; pub use crate::rules::typescript::no_unnecessary_template_expression::NoUnnecessaryTemplateExpression as TypescriptNoUnnecessaryTemplateExpression; pub use crate::rules::typescript::no_unnecessary_type_arguments::NoUnnecessaryTypeArguments as TypescriptNoUnnecessaryTypeArguments; @@ -933,6 +934,7 @@ pub enum RuleEnum { TypescriptNoRestrictedTypes(TypescriptNoRestrictedTypes), TypescriptNoThisAlias(TypescriptNoThisAlias), TypescriptNoUnnecessaryBooleanLiteralCompare(TypescriptNoUnnecessaryBooleanLiteralCompare), + TypescriptNoUnnecessaryCondition(TypescriptNoUnnecessaryCondition), TypescriptNoUnnecessaryParameterPropertyAssignment( TypescriptNoUnnecessaryParameterPropertyAssignment, ), @@ -1611,430 +1613,431 @@ impl RuleEnum { Self::TypescriptNoRestrictedTypes(_) => 243usize, Self::TypescriptNoThisAlias(_) => 244usize, Self::TypescriptNoUnnecessaryBooleanLiteralCompare(_) => 245usize, - Self::TypescriptNoUnnecessaryParameterPropertyAssignment(_) => 246usize, - Self::TypescriptNoUnnecessaryTemplateExpression(_) => 247usize, - Self::TypescriptNoUnnecessaryTypeArguments(_) => 248usize, - Self::TypescriptNoUnnecessaryTypeAssertion(_) => 249usize, - Self::TypescriptNoUnnecessaryTypeConstraint(_) => 250usize, - Self::TypescriptNoUnsafeArgument(_) => 251usize, - Self::TypescriptNoUnsafeAssignment(_) => 252usize, - Self::TypescriptNoUnsafeCall(_) => 253usize, - Self::TypescriptNoUnsafeDeclarationMerging(_) => 254usize, - Self::TypescriptNoUnsafeEnumComparison(_) => 255usize, - Self::TypescriptNoUnsafeFunctionType(_) => 256usize, - Self::TypescriptNoUnsafeMemberAccess(_) => 257usize, - Self::TypescriptNoUnsafeReturn(_) => 258usize, - Self::TypescriptNoUnsafeTypeAssertion(_) => 259usize, - Self::TypescriptNoUnsafeUnaryMinus(_) => 260usize, - Self::TypescriptNoUselessEmptyExport(_) => 261usize, - Self::TypescriptNoVarRequires(_) => 262usize, - Self::TypescriptNoWrapperObjectTypes(_) => 263usize, - Self::TypescriptNonNullableTypeAssertionStyle(_) => 264usize, - Self::TypescriptOnlyThrowError(_) => 265usize, - Self::TypescriptPreferAsConst(_) => 266usize, - Self::TypescriptPreferEnumInitializers(_) => 267usize, - Self::TypescriptPreferForOf(_) => 268usize, - Self::TypescriptPreferFunctionType(_) => 269usize, - Self::TypescriptPreferIncludes(_) => 270usize, - Self::TypescriptPreferLiteralEnumMember(_) => 271usize, - Self::TypescriptPreferNamespaceKeyword(_) => 272usize, - Self::TypescriptPreferNullishCoalescing(_) => 273usize, - Self::TypescriptPreferOptionalChain(_) => 274usize, - Self::TypescriptPreferPromiseRejectErrors(_) => 275usize, - Self::TypescriptPreferReduceTypeParameter(_) => 276usize, - Self::TypescriptPreferReturnThisType(_) => 277usize, - Self::TypescriptPreferTsExpectError(_) => 278usize, - Self::TypescriptPromiseFunctionAsync(_) => 279usize, - Self::TypescriptRelatedGetterSetterPairs(_) => 280usize, - Self::TypescriptRequireArraySortCompare(_) => 281usize, - Self::TypescriptRequireAwait(_) => 282usize, - Self::TypescriptRestrictPlusOperands(_) => 283usize, - Self::TypescriptRestrictTemplateExpressions(_) => 284usize, - Self::TypescriptReturnAwait(_) => 285usize, - Self::TypescriptStrictBooleanExpressions(_) => 286usize, - Self::TypescriptSwitchExhaustivenessCheck(_) => 287usize, - Self::TypescriptTripleSlashReference(_) => 288usize, - Self::TypescriptUnboundMethod(_) => 289usize, - Self::TypescriptUseUnknownInCatchCallbackVariable(_) => 290usize, - Self::JestConsistentTestIt(_) => 291usize, - Self::JestExpectExpect(_) => 292usize, - Self::JestMaxExpects(_) => 293usize, - Self::JestMaxNestedDescribe(_) => 294usize, - Self::JestNoAliasMethods(_) => 295usize, - Self::JestNoCommentedOutTests(_) => 296usize, - Self::JestNoConditionalExpect(_) => 297usize, - Self::JestNoConditionalInTest(_) => 298usize, - Self::JestNoConfusingSetTimeout(_) => 299usize, - Self::JestNoDeprecatedFunctions(_) => 300usize, - Self::JestNoDisabledTests(_) => 301usize, - Self::JestNoDoneCallback(_) => 302usize, - Self::JestNoDuplicateHooks(_) => 303usize, - Self::JestNoExport(_) => 304usize, - Self::JestNoFocusedTests(_) => 305usize, - Self::JestNoHooks(_) => 306usize, - Self::JestNoIdenticalTitle(_) => 307usize, - Self::JestNoInterpolationInSnapshots(_) => 308usize, - Self::JestNoJasmineGlobals(_) => 309usize, - Self::JestNoLargeSnapshots(_) => 310usize, - Self::JestNoMocksImport(_) => 311usize, - Self::JestNoRestrictedJestMethods(_) => 312usize, - Self::JestNoRestrictedMatchers(_) => 313usize, - Self::JestNoStandaloneExpect(_) => 314usize, - Self::JestNoTestPrefixes(_) => 315usize, - Self::JestNoTestReturnStatement(_) => 316usize, - Self::JestNoUnneededAsyncExpectFunction(_) => 317usize, - Self::JestNoUntypedMockFactory(_) => 318usize, - Self::JestPaddingAroundTestBlocks(_) => 319usize, - Self::JestPreferCalledWith(_) => 320usize, - Self::JestPreferComparisonMatcher(_) => 321usize, - Self::JestPreferEach(_) => 322usize, - Self::JestPreferEqualityMatcher(_) => 323usize, - Self::JestPreferExpectResolves(_) => 324usize, - Self::JestPreferHooksInOrder(_) => 325usize, - Self::JestPreferHooksOnTop(_) => 326usize, - Self::JestPreferJestMocked(_) => 327usize, - Self::JestPreferLowercaseTitle(_) => 328usize, - Self::JestPreferMockPromiseShorthand(_) => 329usize, - Self::JestPreferSpyOn(_) => 330usize, - Self::JestPreferStrictEqual(_) => 331usize, - Self::JestPreferToBe(_) => 332usize, - Self::JestPreferToContain(_) => 333usize, - Self::JestPreferToHaveBeenCalled(_) => 334usize, - Self::JestPreferToHaveBeenCalledTimes(_) => 335usize, - Self::JestPreferToHaveLength(_) => 336usize, - Self::JestPreferTodo(_) => 337usize, - Self::JestRequireHook(_) => 338usize, - Self::JestRequireToThrowMessage(_) => 339usize, - Self::JestRequireTopLevelDescribe(_) => 340usize, - Self::JestValidDescribeCallback(_) => 341usize, - Self::JestValidExpect(_) => 342usize, - Self::JestValidTitle(_) => 343usize, - Self::ReactButtonHasType(_) => 344usize, - Self::ReactCheckedRequiresOnchangeOrReadonly(_) => 345usize, - Self::ReactDisplayName(_) => 346usize, - Self::ReactExhaustiveDeps(_) => 347usize, - Self::ReactForbidDomProps(_) => 348usize, - Self::ReactForbidElements(_) => 349usize, - Self::ReactForwardRefUsesRef(_) => 350usize, - Self::ReactIframeMissingSandbox(_) => 351usize, - Self::ReactJsxBooleanValue(_) => 352usize, - Self::ReactJsxCurlyBracePresence(_) => 353usize, - Self::ReactJsxFilenameExtension(_) => 354usize, - Self::ReactJsxFragments(_) => 355usize, - Self::ReactJsxHandlerNames(_) => 356usize, - Self::ReactJsxKey(_) => 357usize, - Self::ReactJsxMaxDepth(_) => 358usize, - Self::ReactJsxNoCommentTextnodes(_) => 359usize, - Self::ReactJsxNoDuplicateProps(_) => 360usize, - Self::ReactJsxNoScriptUrl(_) => 361usize, - Self::ReactJsxNoTargetBlank(_) => 362usize, - Self::ReactJsxNoUndef(_) => 363usize, - Self::ReactJsxNoUselessFragment(_) => 364usize, - Self::ReactJsxPascalCase(_) => 365usize, - Self::ReactJsxPropsNoSpreadMulti(_) => 366usize, - Self::ReactJsxPropsNoSpreading(_) => 367usize, - Self::ReactNoArrayIndexKey(_) => 368usize, - Self::ReactNoChildrenProp(_) => 369usize, - Self::ReactNoDanger(_) => 370usize, - Self::ReactNoDangerWithChildren(_) => 371usize, - Self::ReactNoDidMountSetState(_) => 372usize, - Self::ReactNoDirectMutationState(_) => 373usize, - Self::ReactNoFindDomNode(_) => 374usize, - Self::ReactNoIsMounted(_) => 375usize, - Self::ReactNoMultiComp(_) => 376usize, - Self::ReactNoNamespace(_) => 377usize, - Self::ReactNoRedundantShouldComponentUpdate(_) => 378usize, - Self::ReactNoRenderReturnValue(_) => 379usize, - Self::ReactNoSetState(_) => 380usize, - Self::ReactNoStringRefs(_) => 381usize, - Self::ReactNoThisInSfc(_) => 382usize, - Self::ReactNoUnescapedEntities(_) => 383usize, - Self::ReactNoUnknownProperty(_) => 384usize, - Self::ReactNoUnsafe(_) => 385usize, - Self::ReactNoWillUpdateSetState(_) => 386usize, - Self::ReactOnlyExportComponents(_) => 387usize, - Self::ReactPreferEs6Class(_) => 388usize, - Self::ReactReactInJsxScope(_) => 389usize, - Self::ReactRequireRenderReturn(_) => 390usize, - Self::ReactRulesOfHooks(_) => 391usize, - Self::ReactSelfClosingComp(_) => 392usize, - Self::ReactStateInConstructor(_) => 393usize, - Self::ReactStylePropObject(_) => 394usize, - Self::ReactVoidDomElementsNoChildren(_) => 395usize, - Self::ReactPerfJsxNoJsxAsProp(_) => 396usize, - Self::ReactPerfJsxNoNewArrayAsProp(_) => 397usize, - Self::ReactPerfJsxNoNewFunctionAsProp(_) => 398usize, - Self::ReactPerfJsxNoNewObjectAsProp(_) => 399usize, - Self::UnicornCatchErrorName(_) => 400usize, - Self::UnicornConsistentAssert(_) => 401usize, - Self::UnicornConsistentDateClone(_) => 402usize, - Self::UnicornConsistentEmptyArraySpread(_) => 403usize, - Self::UnicornConsistentExistenceIndexCheck(_) => 404usize, - Self::UnicornConsistentFunctionScoping(_) => 405usize, - Self::UnicornEmptyBraceSpaces(_) => 406usize, - Self::UnicornErrorMessage(_) => 407usize, - Self::UnicornEscapeCase(_) => 408usize, - Self::UnicornExplicitLengthCheck(_) => 409usize, - Self::UnicornFilenameCase(_) => 410usize, - Self::UnicornNewForBuiltins(_) => 411usize, - Self::UnicornNoAbusiveEslintDisable(_) => 412usize, - Self::UnicornNoAccessorRecursion(_) => 413usize, - Self::UnicornNoAnonymousDefaultExport(_) => 414usize, - Self::UnicornNoArrayCallbackReference(_) => 415usize, - Self::UnicornNoArrayForEach(_) => 416usize, - Self::UnicornNoArrayMethodThisArgument(_) => 417usize, - Self::UnicornNoArrayReduce(_) => 418usize, - Self::UnicornNoArrayReverse(_) => 419usize, - Self::UnicornNoArraySort(_) => 420usize, - Self::UnicornNoAwaitExpressionMember(_) => 421usize, - Self::UnicornNoAwaitInPromiseMethods(_) => 422usize, - Self::UnicornNoConsoleSpaces(_) => 423usize, - Self::UnicornNoDocumentCookie(_) => 424usize, - Self::UnicornNoEmptyFile(_) => 425usize, - Self::UnicornNoHexEscape(_) => 426usize, - Self::UnicornNoImmediateMutation(_) => 427usize, - Self::UnicornNoInstanceofArray(_) => 428usize, - Self::UnicornNoInstanceofBuiltins(_) => 429usize, - Self::UnicornNoInvalidFetchOptions(_) => 430usize, - Self::UnicornNoInvalidRemoveEventListener(_) => 431usize, - Self::UnicornNoLengthAsSliceEnd(_) => 432usize, - Self::UnicornNoLonelyIf(_) => 433usize, - Self::UnicornNoMagicArrayFlatDepth(_) => 434usize, - Self::UnicornNoNegationInEqualityCheck(_) => 435usize, - Self::UnicornNoNestedTernary(_) => 436usize, - Self::UnicornNoNewArray(_) => 437usize, - Self::UnicornNoNewBuffer(_) => 438usize, - Self::UnicornNoNull(_) => 439usize, - Self::UnicornNoObjectAsDefaultParameter(_) => 440usize, - Self::UnicornNoProcessExit(_) => 441usize, - Self::UnicornNoSinglePromiseInPromiseMethods(_) => 442usize, - Self::UnicornNoStaticOnlyClass(_) => 443usize, - Self::UnicornNoThenable(_) => 444usize, - Self::UnicornNoThisAssignment(_) => 445usize, - Self::UnicornNoTypeofUndefined(_) => 446usize, - Self::UnicornNoUnnecessaryArrayFlatDepth(_) => 447usize, - Self::UnicornNoUnnecessaryArraySpliceCount(_) => 448usize, - Self::UnicornNoUnnecessaryAwait(_) => 449usize, - Self::UnicornNoUnnecessarySliceEnd(_) => 450usize, - Self::UnicornNoUnreadableArrayDestructuring(_) => 451usize, - Self::UnicornNoUnreadableIife(_) => 452usize, - Self::UnicornNoUselessCollectionArgument(_) => 453usize, - Self::UnicornNoUselessErrorCaptureStackTrace(_) => 454usize, - Self::UnicornNoUselessFallbackInSpread(_) => 455usize, - Self::UnicornNoUselessLengthCheck(_) => 456usize, - Self::UnicornNoUselessPromiseResolveReject(_) => 457usize, - Self::UnicornNoUselessSpread(_) => 458usize, - Self::UnicornNoUselessSwitchCase(_) => 459usize, - Self::UnicornNoUselessUndefined(_) => 460usize, - Self::UnicornNoZeroFractions(_) => 461usize, - Self::UnicornNumberLiteralCase(_) => 462usize, - Self::UnicornNumericSeparatorsStyle(_) => 463usize, - Self::UnicornPreferAddEventListener(_) => 464usize, - Self::UnicornPreferArrayFind(_) => 465usize, - Self::UnicornPreferArrayFlat(_) => 466usize, - Self::UnicornPreferArrayFlatMap(_) => 467usize, - Self::UnicornPreferArrayIndexOf(_) => 468usize, - Self::UnicornPreferArraySome(_) => 469usize, - Self::UnicornPreferAt(_) => 470usize, - Self::UnicornPreferBigintLiterals(_) => 471usize, - Self::UnicornPreferBlobReadingMethods(_) => 472usize, - Self::UnicornPreferClassFields(_) => 473usize, - Self::UnicornPreferClasslistToggle(_) => 474usize, - Self::UnicornPreferCodePoint(_) => 475usize, - Self::UnicornPreferDateNow(_) => 476usize, - Self::UnicornPreferDefaultParameters(_) => 477usize, - Self::UnicornPreferDomNodeAppend(_) => 478usize, - Self::UnicornPreferDomNodeDataset(_) => 479usize, - Self::UnicornPreferDomNodeRemove(_) => 480usize, - Self::UnicornPreferDomNodeTextContent(_) => 481usize, - Self::UnicornPreferEventTarget(_) => 482usize, - Self::UnicornPreferGlobalThis(_) => 483usize, - Self::UnicornPreferIncludes(_) => 484usize, - Self::UnicornPreferKeyboardEventKey(_) => 485usize, - Self::UnicornPreferLogicalOperatorOverTernary(_) => 486usize, - Self::UnicornPreferMathMinMax(_) => 487usize, - Self::UnicornPreferMathTrunc(_) => 488usize, - Self::UnicornPreferModernDomApis(_) => 489usize, - Self::UnicornPreferModernMathApis(_) => 490usize, - Self::UnicornPreferNativeCoercionFunctions(_) => 491usize, - Self::UnicornPreferNegativeIndex(_) => 492usize, - Self::UnicornPreferNodeProtocol(_) => 493usize, - Self::UnicornPreferNumberProperties(_) => 494usize, - Self::UnicornPreferObjectFromEntries(_) => 495usize, - Self::UnicornPreferOptionalCatchBinding(_) => 496usize, - Self::UnicornPreferPrototypeMethods(_) => 497usize, - Self::UnicornPreferQuerySelector(_) => 498usize, - Self::UnicornPreferReflectApply(_) => 499usize, - Self::UnicornPreferRegexpTest(_) => 500usize, - Self::UnicornPreferResponseStaticJson(_) => 501usize, - Self::UnicornPreferSetHas(_) => 502usize, - Self::UnicornPreferSetSize(_) => 503usize, - Self::UnicornPreferSpread(_) => 504usize, - Self::UnicornPreferStringRaw(_) => 505usize, - Self::UnicornPreferStringReplaceAll(_) => 506usize, - Self::UnicornPreferStringSlice(_) => 507usize, - Self::UnicornPreferStringStartsEndsWith(_) => 508usize, - Self::UnicornPreferStringTrimStartEnd(_) => 509usize, - Self::UnicornPreferStructuredClone(_) => 510usize, - Self::UnicornPreferTopLevelAwait(_) => 511usize, - Self::UnicornPreferTypeError(_) => 512usize, - Self::UnicornRelativeUrlStyle(_) => 513usize, - Self::UnicornRequireArrayJoinSeparator(_) => 514usize, - Self::UnicornRequireModuleAttributes(_) => 515usize, - Self::UnicornRequireModuleSpecifiers(_) => 516usize, - Self::UnicornRequireNumberToFixedDigitsArgument(_) => 517usize, - Self::UnicornRequirePostMessageTargetOrigin(_) => 518usize, - Self::UnicornSwitchCaseBraces(_) => 519usize, - Self::UnicornTextEncodingIdentifierCase(_) => 520usize, - Self::UnicornThrowNewError(_) => 521usize, - Self::JsxA11YAltText(_) => 522usize, - Self::JsxA11YAnchorAmbiguousText(_) => 523usize, - Self::JsxA11YAnchorHasContent(_) => 524usize, - Self::JsxA11YAnchorIsValid(_) => 525usize, - Self::JsxA11YAriaActivedescendantHasTabindex(_) => 526usize, - Self::JsxA11YAriaProps(_) => 527usize, - Self::JsxA11YAriaProptypes(_) => 528usize, - Self::JsxA11YAriaRole(_) => 529usize, - Self::JsxA11YAriaUnsupportedElements(_) => 530usize, - Self::JsxA11YAutocompleteValid(_) => 531usize, - Self::JsxA11YClickEventsHaveKeyEvents(_) => 532usize, - Self::JsxA11YHeadingHasContent(_) => 533usize, - Self::JsxA11YHtmlHasLang(_) => 534usize, - Self::JsxA11YIframeHasTitle(_) => 535usize, - Self::JsxA11YImgRedundantAlt(_) => 536usize, - Self::JsxA11YLabelHasAssociatedControl(_) => 537usize, - Self::JsxA11YLang(_) => 538usize, - Self::JsxA11YMediaHasCaption(_) => 539usize, - Self::JsxA11YMouseEventsHaveKeyEvents(_) => 540usize, - Self::JsxA11YNoAccessKey(_) => 541usize, - Self::JsxA11YNoAriaHiddenOnFocusable(_) => 542usize, - Self::JsxA11YNoAutofocus(_) => 543usize, - Self::JsxA11YNoDistractingElements(_) => 544usize, - Self::JsxA11YNoNoninteractiveTabindex(_) => 545usize, - Self::JsxA11YNoRedundantRoles(_) => 546usize, - Self::JsxA11YNoStaticElementInteractions(_) => 547usize, - Self::JsxA11YPreferTagOverRole(_) => 548usize, - Self::JsxA11YRoleHasRequiredAriaProps(_) => 549usize, - Self::JsxA11YRoleSupportsAriaProps(_) => 550usize, - Self::JsxA11YScope(_) => 551usize, - Self::JsxA11YTabindexNoPositive(_) => 552usize, - Self::OxcApproxConstant(_) => 553usize, - Self::OxcBadArrayMethodOnArguments(_) => 554usize, - Self::OxcBadBitwiseOperator(_) => 555usize, - Self::OxcBadCharAtComparison(_) => 556usize, - Self::OxcBadComparisonSequence(_) => 557usize, - Self::OxcBadMinMaxFunc(_) => 558usize, - Self::OxcBadObjectLiteralComparison(_) => 559usize, - Self::OxcBadReplaceAllArg(_) => 560usize, - Self::OxcBranchesSharingCode(_) => 561usize, - Self::OxcConstComparisons(_) => 562usize, - Self::OxcDoubleComparisons(_) => 563usize, - Self::OxcErasingOp(_) => 564usize, - Self::OxcMisrefactoredAssignOp(_) => 565usize, - Self::OxcMissingThrow(_) => 566usize, - Self::OxcNoAccumulatingSpread(_) => 567usize, - Self::OxcNoAsyncAwait(_) => 568usize, - Self::OxcNoAsyncEndpointHandlers(_) => 569usize, - Self::OxcNoBarrelFile(_) => 570usize, - Self::OxcNoConstEnum(_) => 571usize, - Self::OxcNoMapSpread(_) => 572usize, - Self::OxcNoOptionalChaining(_) => 573usize, - Self::OxcNoRestSpreadProperties(_) => 574usize, - Self::OxcNoThisInExportedFunction(_) => 575usize, - Self::OxcNumberArgOutOfRange(_) => 576usize, - Self::OxcOnlyUsedInRecursion(_) => 577usize, - Self::OxcUninvokedArrayCallback(_) => 578usize, - Self::NextjsGoogleFontDisplay(_) => 579usize, - Self::NextjsGoogleFontPreconnect(_) => 580usize, - Self::NextjsInlineScriptId(_) => 581usize, - Self::NextjsNextScriptForGa(_) => 582usize, - Self::NextjsNoAssignModuleVariable(_) => 583usize, - Self::NextjsNoAsyncClientComponent(_) => 584usize, - Self::NextjsNoBeforeInteractiveScriptOutsideDocument(_) => 585usize, - Self::NextjsNoCssTags(_) => 586usize, - Self::NextjsNoDocumentImportInPage(_) => 587usize, - Self::NextjsNoDuplicateHead(_) => 588usize, - Self::NextjsNoHeadElement(_) => 589usize, - Self::NextjsNoHeadImportInDocument(_) => 590usize, - Self::NextjsNoHtmlLinkForPages(_) => 591usize, - Self::NextjsNoImgElement(_) => 592usize, - Self::NextjsNoPageCustomFont(_) => 593usize, - Self::NextjsNoScriptComponentInHead(_) => 594usize, - Self::NextjsNoStyledJsxInDocument(_) => 595usize, - Self::NextjsNoSyncScripts(_) => 596usize, - Self::NextjsNoTitleInDocumentHead(_) => 597usize, - Self::NextjsNoTypos(_) => 598usize, - Self::NextjsNoUnwantedPolyfillio(_) => 599usize, - Self::JsdocCheckAccess(_) => 600usize, - Self::JsdocCheckPropertyNames(_) => 601usize, - Self::JsdocCheckTagNames(_) => 602usize, - Self::JsdocEmptyTags(_) => 603usize, - Self::JsdocImplementsOnClasses(_) => 604usize, - Self::JsdocNoDefaults(_) => 605usize, - Self::JsdocRequireParam(_) => 606usize, - Self::JsdocRequireParamDescription(_) => 607usize, - Self::JsdocRequireParamName(_) => 608usize, - Self::JsdocRequireParamType(_) => 609usize, - Self::JsdocRequireProperty(_) => 610usize, - Self::JsdocRequirePropertyDescription(_) => 611usize, - Self::JsdocRequirePropertyName(_) => 612usize, - Self::JsdocRequirePropertyType(_) => 613usize, - Self::JsdocRequireReturns(_) => 614usize, - Self::JsdocRequireReturnsDescription(_) => 615usize, - Self::JsdocRequireReturnsType(_) => 616usize, - Self::JsdocRequireYields(_) => 617usize, - Self::PromiseAlwaysReturn(_) => 618usize, - Self::PromiseAvoidNew(_) => 619usize, - Self::PromiseCatchOrReturn(_) => 620usize, - Self::PromiseNoCallbackInPromise(_) => 621usize, - Self::PromiseNoMultipleResolved(_) => 622usize, - Self::PromiseNoNesting(_) => 623usize, - Self::PromiseNoNewStatics(_) => 624usize, - Self::PromiseNoPromiseInCallback(_) => 625usize, - Self::PromiseNoReturnInFinally(_) => 626usize, - Self::PromiseNoReturnWrap(_) => 627usize, - Self::PromiseParamNames(_) => 628usize, - Self::PromisePreferAwaitToCallbacks(_) => 629usize, - Self::PromisePreferAwaitToThen(_) => 630usize, - Self::PromisePreferCatch(_) => 631usize, - Self::PromiseSpecOnly(_) => 632usize, - Self::PromiseValidParams(_) => 633usize, - Self::VitestConsistentEachFor(_) => 634usize, - Self::VitestConsistentTestFilename(_) => 635usize, - Self::VitestConsistentVitestVi(_) => 636usize, - Self::VitestHoistedApisOnTop(_) => 637usize, - Self::VitestNoConditionalTests(_) => 638usize, - Self::VitestNoImportNodeTest(_) => 639usize, - Self::VitestPreferCalledOnce(_) => 640usize, - Self::VitestPreferCalledTimes(_) => 641usize, - Self::VitestPreferDescribeFunctionTitle(_) => 642usize, - Self::VitestPreferExpectTypeOf(_) => 643usize, - Self::VitestPreferToBeFalsy(_) => 644usize, - Self::VitestPreferToBeObject(_) => 645usize, - Self::VitestPreferToBeTruthy(_) => 646usize, - Self::VitestRequireLocalTestContextForConcurrentSnapshots(_) => 647usize, - Self::VitestWarnTodo(_) => 648usize, - Self::NodeGlobalRequire(_) => 649usize, - Self::NodeNoExportsAssign(_) => 650usize, - Self::NodeNoNewRequire(_) => 651usize, - Self::NodeNoProcessEnv(_) => 652usize, - Self::VueDefineEmitsDeclaration(_) => 653usize, - Self::VueDefinePropsDeclaration(_) => 654usize, - Self::VueDefinePropsDestructuring(_) => 655usize, - Self::VueMaxProps(_) => 656usize, - Self::VueNoArrowFunctionsInWatch(_) => 657usize, - Self::VueNoDeprecatedDestroyedLifecycle(_) => 658usize, - Self::VueNoExportInScriptSetup(_) => 659usize, - Self::VueNoImportCompilerMacros(_) => 660usize, - Self::VueNoLifecycleAfterAwait(_) => 661usize, - Self::VueNoMultipleSlotArgs(_) => 662usize, - Self::VueNoRequiredPropWithDefault(_) => 663usize, - Self::VueNoThisInBeforeRouteEnter(_) => 664usize, - Self::VuePreferImportFromVue(_) => 665usize, - Self::VueRequireDefaultExport(_) => 666usize, - Self::VueRequireTypedRef(_) => 667usize, - Self::VueValidDefineEmits(_) => 668usize, - Self::VueValidDefineProps(_) => 669usize, + Self::TypescriptNoUnnecessaryCondition(_) => 246usize, + Self::TypescriptNoUnnecessaryParameterPropertyAssignment(_) => 247usize, + Self::TypescriptNoUnnecessaryTemplateExpression(_) => 248usize, + Self::TypescriptNoUnnecessaryTypeArguments(_) => 249usize, + Self::TypescriptNoUnnecessaryTypeAssertion(_) => 250usize, + Self::TypescriptNoUnnecessaryTypeConstraint(_) => 251usize, + Self::TypescriptNoUnsafeArgument(_) => 252usize, + Self::TypescriptNoUnsafeAssignment(_) => 253usize, + Self::TypescriptNoUnsafeCall(_) => 254usize, + Self::TypescriptNoUnsafeDeclarationMerging(_) => 255usize, + Self::TypescriptNoUnsafeEnumComparison(_) => 256usize, + Self::TypescriptNoUnsafeFunctionType(_) => 257usize, + Self::TypescriptNoUnsafeMemberAccess(_) => 258usize, + Self::TypescriptNoUnsafeReturn(_) => 259usize, + Self::TypescriptNoUnsafeTypeAssertion(_) => 260usize, + Self::TypescriptNoUnsafeUnaryMinus(_) => 261usize, + Self::TypescriptNoUselessEmptyExport(_) => 262usize, + Self::TypescriptNoVarRequires(_) => 263usize, + Self::TypescriptNoWrapperObjectTypes(_) => 264usize, + Self::TypescriptNonNullableTypeAssertionStyle(_) => 265usize, + Self::TypescriptOnlyThrowError(_) => 266usize, + Self::TypescriptPreferAsConst(_) => 267usize, + Self::TypescriptPreferEnumInitializers(_) => 268usize, + Self::TypescriptPreferForOf(_) => 269usize, + Self::TypescriptPreferFunctionType(_) => 270usize, + Self::TypescriptPreferIncludes(_) => 271usize, + Self::TypescriptPreferLiteralEnumMember(_) => 272usize, + Self::TypescriptPreferNamespaceKeyword(_) => 273usize, + Self::TypescriptPreferNullishCoalescing(_) => 274usize, + Self::TypescriptPreferOptionalChain(_) => 275usize, + Self::TypescriptPreferPromiseRejectErrors(_) => 276usize, + Self::TypescriptPreferReduceTypeParameter(_) => 277usize, + Self::TypescriptPreferReturnThisType(_) => 278usize, + Self::TypescriptPreferTsExpectError(_) => 279usize, + Self::TypescriptPromiseFunctionAsync(_) => 280usize, + Self::TypescriptRelatedGetterSetterPairs(_) => 281usize, + Self::TypescriptRequireArraySortCompare(_) => 282usize, + Self::TypescriptRequireAwait(_) => 283usize, + Self::TypescriptRestrictPlusOperands(_) => 284usize, + Self::TypescriptRestrictTemplateExpressions(_) => 285usize, + Self::TypescriptReturnAwait(_) => 286usize, + Self::TypescriptStrictBooleanExpressions(_) => 287usize, + Self::TypescriptSwitchExhaustivenessCheck(_) => 288usize, + Self::TypescriptTripleSlashReference(_) => 289usize, + Self::TypescriptUnboundMethod(_) => 290usize, + Self::TypescriptUseUnknownInCatchCallbackVariable(_) => 291usize, + Self::JestConsistentTestIt(_) => 292usize, + Self::JestExpectExpect(_) => 293usize, + Self::JestMaxExpects(_) => 294usize, + Self::JestMaxNestedDescribe(_) => 295usize, + Self::JestNoAliasMethods(_) => 296usize, + Self::JestNoCommentedOutTests(_) => 297usize, + Self::JestNoConditionalExpect(_) => 298usize, + Self::JestNoConditionalInTest(_) => 299usize, + Self::JestNoConfusingSetTimeout(_) => 300usize, + Self::JestNoDeprecatedFunctions(_) => 301usize, + Self::JestNoDisabledTests(_) => 302usize, + Self::JestNoDoneCallback(_) => 303usize, + Self::JestNoDuplicateHooks(_) => 304usize, + Self::JestNoExport(_) => 305usize, + Self::JestNoFocusedTests(_) => 306usize, + Self::JestNoHooks(_) => 307usize, + Self::JestNoIdenticalTitle(_) => 308usize, + Self::JestNoInterpolationInSnapshots(_) => 309usize, + Self::JestNoJasmineGlobals(_) => 310usize, + Self::JestNoLargeSnapshots(_) => 311usize, + Self::JestNoMocksImport(_) => 312usize, + Self::JestNoRestrictedJestMethods(_) => 313usize, + Self::JestNoRestrictedMatchers(_) => 314usize, + Self::JestNoStandaloneExpect(_) => 315usize, + Self::JestNoTestPrefixes(_) => 316usize, + Self::JestNoTestReturnStatement(_) => 317usize, + Self::JestNoUnneededAsyncExpectFunction(_) => 318usize, + Self::JestNoUntypedMockFactory(_) => 319usize, + Self::JestPaddingAroundTestBlocks(_) => 320usize, + Self::JestPreferCalledWith(_) => 321usize, + Self::JestPreferComparisonMatcher(_) => 322usize, + Self::JestPreferEach(_) => 323usize, + Self::JestPreferEqualityMatcher(_) => 324usize, + Self::JestPreferExpectResolves(_) => 325usize, + Self::JestPreferHooksInOrder(_) => 326usize, + Self::JestPreferHooksOnTop(_) => 327usize, + Self::JestPreferJestMocked(_) => 328usize, + Self::JestPreferLowercaseTitle(_) => 329usize, + Self::JestPreferMockPromiseShorthand(_) => 330usize, + Self::JestPreferSpyOn(_) => 331usize, + Self::JestPreferStrictEqual(_) => 332usize, + Self::JestPreferToBe(_) => 333usize, + Self::JestPreferToContain(_) => 334usize, + Self::JestPreferToHaveBeenCalled(_) => 335usize, + Self::JestPreferToHaveBeenCalledTimes(_) => 336usize, + Self::JestPreferToHaveLength(_) => 337usize, + Self::JestPreferTodo(_) => 338usize, + Self::JestRequireHook(_) => 339usize, + Self::JestRequireToThrowMessage(_) => 340usize, + Self::JestRequireTopLevelDescribe(_) => 341usize, + Self::JestValidDescribeCallback(_) => 342usize, + Self::JestValidExpect(_) => 343usize, + Self::JestValidTitle(_) => 344usize, + Self::ReactButtonHasType(_) => 345usize, + Self::ReactCheckedRequiresOnchangeOrReadonly(_) => 346usize, + Self::ReactDisplayName(_) => 347usize, + Self::ReactExhaustiveDeps(_) => 348usize, + Self::ReactForbidDomProps(_) => 349usize, + Self::ReactForbidElements(_) => 350usize, + Self::ReactForwardRefUsesRef(_) => 351usize, + Self::ReactIframeMissingSandbox(_) => 352usize, + Self::ReactJsxBooleanValue(_) => 353usize, + Self::ReactJsxCurlyBracePresence(_) => 354usize, + Self::ReactJsxFilenameExtension(_) => 355usize, + Self::ReactJsxFragments(_) => 356usize, + Self::ReactJsxHandlerNames(_) => 357usize, + Self::ReactJsxKey(_) => 358usize, + Self::ReactJsxMaxDepth(_) => 359usize, + Self::ReactJsxNoCommentTextnodes(_) => 360usize, + Self::ReactJsxNoDuplicateProps(_) => 361usize, + Self::ReactJsxNoScriptUrl(_) => 362usize, + Self::ReactJsxNoTargetBlank(_) => 363usize, + Self::ReactJsxNoUndef(_) => 364usize, + Self::ReactJsxNoUselessFragment(_) => 365usize, + Self::ReactJsxPascalCase(_) => 366usize, + Self::ReactJsxPropsNoSpreadMulti(_) => 367usize, + Self::ReactJsxPropsNoSpreading(_) => 368usize, + Self::ReactNoArrayIndexKey(_) => 369usize, + Self::ReactNoChildrenProp(_) => 370usize, + Self::ReactNoDanger(_) => 371usize, + Self::ReactNoDangerWithChildren(_) => 372usize, + Self::ReactNoDidMountSetState(_) => 373usize, + Self::ReactNoDirectMutationState(_) => 374usize, + Self::ReactNoFindDomNode(_) => 375usize, + Self::ReactNoIsMounted(_) => 376usize, + Self::ReactNoMultiComp(_) => 377usize, + Self::ReactNoNamespace(_) => 378usize, + Self::ReactNoRedundantShouldComponentUpdate(_) => 379usize, + Self::ReactNoRenderReturnValue(_) => 380usize, + Self::ReactNoSetState(_) => 381usize, + Self::ReactNoStringRefs(_) => 382usize, + Self::ReactNoThisInSfc(_) => 383usize, + Self::ReactNoUnescapedEntities(_) => 384usize, + Self::ReactNoUnknownProperty(_) => 385usize, + Self::ReactNoUnsafe(_) => 386usize, + Self::ReactNoWillUpdateSetState(_) => 387usize, + Self::ReactOnlyExportComponents(_) => 388usize, + Self::ReactPreferEs6Class(_) => 389usize, + Self::ReactReactInJsxScope(_) => 390usize, + Self::ReactRequireRenderReturn(_) => 391usize, + Self::ReactRulesOfHooks(_) => 392usize, + Self::ReactSelfClosingComp(_) => 393usize, + Self::ReactStateInConstructor(_) => 394usize, + Self::ReactStylePropObject(_) => 395usize, + Self::ReactVoidDomElementsNoChildren(_) => 396usize, + Self::ReactPerfJsxNoJsxAsProp(_) => 397usize, + Self::ReactPerfJsxNoNewArrayAsProp(_) => 398usize, + Self::ReactPerfJsxNoNewFunctionAsProp(_) => 399usize, + Self::ReactPerfJsxNoNewObjectAsProp(_) => 400usize, + Self::UnicornCatchErrorName(_) => 401usize, + Self::UnicornConsistentAssert(_) => 402usize, + Self::UnicornConsistentDateClone(_) => 403usize, + Self::UnicornConsistentEmptyArraySpread(_) => 404usize, + Self::UnicornConsistentExistenceIndexCheck(_) => 405usize, + Self::UnicornConsistentFunctionScoping(_) => 406usize, + Self::UnicornEmptyBraceSpaces(_) => 407usize, + Self::UnicornErrorMessage(_) => 408usize, + Self::UnicornEscapeCase(_) => 409usize, + Self::UnicornExplicitLengthCheck(_) => 410usize, + Self::UnicornFilenameCase(_) => 411usize, + Self::UnicornNewForBuiltins(_) => 412usize, + Self::UnicornNoAbusiveEslintDisable(_) => 413usize, + Self::UnicornNoAccessorRecursion(_) => 414usize, + Self::UnicornNoAnonymousDefaultExport(_) => 415usize, + Self::UnicornNoArrayCallbackReference(_) => 416usize, + Self::UnicornNoArrayForEach(_) => 417usize, + Self::UnicornNoArrayMethodThisArgument(_) => 418usize, + Self::UnicornNoArrayReduce(_) => 419usize, + Self::UnicornNoArrayReverse(_) => 420usize, + Self::UnicornNoArraySort(_) => 421usize, + Self::UnicornNoAwaitExpressionMember(_) => 422usize, + Self::UnicornNoAwaitInPromiseMethods(_) => 423usize, + Self::UnicornNoConsoleSpaces(_) => 424usize, + Self::UnicornNoDocumentCookie(_) => 425usize, + Self::UnicornNoEmptyFile(_) => 426usize, + Self::UnicornNoHexEscape(_) => 427usize, + Self::UnicornNoImmediateMutation(_) => 428usize, + Self::UnicornNoInstanceofArray(_) => 429usize, + Self::UnicornNoInstanceofBuiltins(_) => 430usize, + Self::UnicornNoInvalidFetchOptions(_) => 431usize, + Self::UnicornNoInvalidRemoveEventListener(_) => 432usize, + Self::UnicornNoLengthAsSliceEnd(_) => 433usize, + Self::UnicornNoLonelyIf(_) => 434usize, + Self::UnicornNoMagicArrayFlatDepth(_) => 435usize, + Self::UnicornNoNegationInEqualityCheck(_) => 436usize, + Self::UnicornNoNestedTernary(_) => 437usize, + Self::UnicornNoNewArray(_) => 438usize, + Self::UnicornNoNewBuffer(_) => 439usize, + Self::UnicornNoNull(_) => 440usize, + Self::UnicornNoObjectAsDefaultParameter(_) => 441usize, + Self::UnicornNoProcessExit(_) => 442usize, + Self::UnicornNoSinglePromiseInPromiseMethods(_) => 443usize, + Self::UnicornNoStaticOnlyClass(_) => 444usize, + Self::UnicornNoThenable(_) => 445usize, + Self::UnicornNoThisAssignment(_) => 446usize, + Self::UnicornNoTypeofUndefined(_) => 447usize, + Self::UnicornNoUnnecessaryArrayFlatDepth(_) => 448usize, + Self::UnicornNoUnnecessaryArraySpliceCount(_) => 449usize, + Self::UnicornNoUnnecessaryAwait(_) => 450usize, + Self::UnicornNoUnnecessarySliceEnd(_) => 451usize, + Self::UnicornNoUnreadableArrayDestructuring(_) => 452usize, + Self::UnicornNoUnreadableIife(_) => 453usize, + Self::UnicornNoUselessCollectionArgument(_) => 454usize, + Self::UnicornNoUselessErrorCaptureStackTrace(_) => 455usize, + Self::UnicornNoUselessFallbackInSpread(_) => 456usize, + Self::UnicornNoUselessLengthCheck(_) => 457usize, + Self::UnicornNoUselessPromiseResolveReject(_) => 458usize, + Self::UnicornNoUselessSpread(_) => 459usize, + Self::UnicornNoUselessSwitchCase(_) => 460usize, + Self::UnicornNoUselessUndefined(_) => 461usize, + Self::UnicornNoZeroFractions(_) => 462usize, + Self::UnicornNumberLiteralCase(_) => 463usize, + Self::UnicornNumericSeparatorsStyle(_) => 464usize, + Self::UnicornPreferAddEventListener(_) => 465usize, + Self::UnicornPreferArrayFind(_) => 466usize, + Self::UnicornPreferArrayFlat(_) => 467usize, + Self::UnicornPreferArrayFlatMap(_) => 468usize, + Self::UnicornPreferArrayIndexOf(_) => 469usize, + Self::UnicornPreferArraySome(_) => 470usize, + Self::UnicornPreferAt(_) => 471usize, + Self::UnicornPreferBigintLiterals(_) => 472usize, + Self::UnicornPreferBlobReadingMethods(_) => 473usize, + Self::UnicornPreferClassFields(_) => 474usize, + Self::UnicornPreferClasslistToggle(_) => 475usize, + Self::UnicornPreferCodePoint(_) => 476usize, + Self::UnicornPreferDateNow(_) => 477usize, + Self::UnicornPreferDefaultParameters(_) => 478usize, + Self::UnicornPreferDomNodeAppend(_) => 479usize, + Self::UnicornPreferDomNodeDataset(_) => 480usize, + Self::UnicornPreferDomNodeRemove(_) => 481usize, + Self::UnicornPreferDomNodeTextContent(_) => 482usize, + Self::UnicornPreferEventTarget(_) => 483usize, + Self::UnicornPreferGlobalThis(_) => 484usize, + Self::UnicornPreferIncludes(_) => 485usize, + Self::UnicornPreferKeyboardEventKey(_) => 486usize, + Self::UnicornPreferLogicalOperatorOverTernary(_) => 487usize, + Self::UnicornPreferMathMinMax(_) => 488usize, + Self::UnicornPreferMathTrunc(_) => 489usize, + Self::UnicornPreferModernDomApis(_) => 490usize, + Self::UnicornPreferModernMathApis(_) => 491usize, + Self::UnicornPreferNativeCoercionFunctions(_) => 492usize, + Self::UnicornPreferNegativeIndex(_) => 493usize, + Self::UnicornPreferNodeProtocol(_) => 494usize, + Self::UnicornPreferNumberProperties(_) => 495usize, + Self::UnicornPreferObjectFromEntries(_) => 496usize, + Self::UnicornPreferOptionalCatchBinding(_) => 497usize, + Self::UnicornPreferPrototypeMethods(_) => 498usize, + Self::UnicornPreferQuerySelector(_) => 499usize, + Self::UnicornPreferReflectApply(_) => 500usize, + Self::UnicornPreferRegexpTest(_) => 501usize, + Self::UnicornPreferResponseStaticJson(_) => 502usize, + Self::UnicornPreferSetHas(_) => 503usize, + Self::UnicornPreferSetSize(_) => 504usize, + Self::UnicornPreferSpread(_) => 505usize, + Self::UnicornPreferStringRaw(_) => 506usize, + Self::UnicornPreferStringReplaceAll(_) => 507usize, + Self::UnicornPreferStringSlice(_) => 508usize, + Self::UnicornPreferStringStartsEndsWith(_) => 509usize, + Self::UnicornPreferStringTrimStartEnd(_) => 510usize, + Self::UnicornPreferStructuredClone(_) => 511usize, + Self::UnicornPreferTopLevelAwait(_) => 512usize, + Self::UnicornPreferTypeError(_) => 513usize, + Self::UnicornRelativeUrlStyle(_) => 514usize, + Self::UnicornRequireArrayJoinSeparator(_) => 515usize, + Self::UnicornRequireModuleAttributes(_) => 516usize, + Self::UnicornRequireModuleSpecifiers(_) => 517usize, + Self::UnicornRequireNumberToFixedDigitsArgument(_) => 518usize, + Self::UnicornRequirePostMessageTargetOrigin(_) => 519usize, + Self::UnicornSwitchCaseBraces(_) => 520usize, + Self::UnicornTextEncodingIdentifierCase(_) => 521usize, + Self::UnicornThrowNewError(_) => 522usize, + Self::JsxA11YAltText(_) => 523usize, + Self::JsxA11YAnchorAmbiguousText(_) => 524usize, + Self::JsxA11YAnchorHasContent(_) => 525usize, + Self::JsxA11YAnchorIsValid(_) => 526usize, + Self::JsxA11YAriaActivedescendantHasTabindex(_) => 527usize, + Self::JsxA11YAriaProps(_) => 528usize, + Self::JsxA11YAriaProptypes(_) => 529usize, + Self::JsxA11YAriaRole(_) => 530usize, + Self::JsxA11YAriaUnsupportedElements(_) => 531usize, + Self::JsxA11YAutocompleteValid(_) => 532usize, + Self::JsxA11YClickEventsHaveKeyEvents(_) => 533usize, + Self::JsxA11YHeadingHasContent(_) => 534usize, + Self::JsxA11YHtmlHasLang(_) => 535usize, + Self::JsxA11YIframeHasTitle(_) => 536usize, + Self::JsxA11YImgRedundantAlt(_) => 537usize, + Self::JsxA11YLabelHasAssociatedControl(_) => 538usize, + Self::JsxA11YLang(_) => 539usize, + Self::JsxA11YMediaHasCaption(_) => 540usize, + Self::JsxA11YMouseEventsHaveKeyEvents(_) => 541usize, + Self::JsxA11YNoAccessKey(_) => 542usize, + Self::JsxA11YNoAriaHiddenOnFocusable(_) => 543usize, + Self::JsxA11YNoAutofocus(_) => 544usize, + Self::JsxA11YNoDistractingElements(_) => 545usize, + Self::JsxA11YNoNoninteractiveTabindex(_) => 546usize, + Self::JsxA11YNoRedundantRoles(_) => 547usize, + Self::JsxA11YNoStaticElementInteractions(_) => 548usize, + Self::JsxA11YPreferTagOverRole(_) => 549usize, + Self::JsxA11YRoleHasRequiredAriaProps(_) => 550usize, + Self::JsxA11YRoleSupportsAriaProps(_) => 551usize, + Self::JsxA11YScope(_) => 552usize, + Self::JsxA11YTabindexNoPositive(_) => 553usize, + Self::OxcApproxConstant(_) => 554usize, + Self::OxcBadArrayMethodOnArguments(_) => 555usize, + Self::OxcBadBitwiseOperator(_) => 556usize, + Self::OxcBadCharAtComparison(_) => 557usize, + Self::OxcBadComparisonSequence(_) => 558usize, + Self::OxcBadMinMaxFunc(_) => 559usize, + Self::OxcBadObjectLiteralComparison(_) => 560usize, + Self::OxcBadReplaceAllArg(_) => 561usize, + Self::OxcBranchesSharingCode(_) => 562usize, + Self::OxcConstComparisons(_) => 563usize, + Self::OxcDoubleComparisons(_) => 564usize, + Self::OxcErasingOp(_) => 565usize, + Self::OxcMisrefactoredAssignOp(_) => 566usize, + Self::OxcMissingThrow(_) => 567usize, + Self::OxcNoAccumulatingSpread(_) => 568usize, + Self::OxcNoAsyncAwait(_) => 569usize, + Self::OxcNoAsyncEndpointHandlers(_) => 570usize, + Self::OxcNoBarrelFile(_) => 571usize, + Self::OxcNoConstEnum(_) => 572usize, + Self::OxcNoMapSpread(_) => 573usize, + Self::OxcNoOptionalChaining(_) => 574usize, + Self::OxcNoRestSpreadProperties(_) => 575usize, + Self::OxcNoThisInExportedFunction(_) => 576usize, + Self::OxcNumberArgOutOfRange(_) => 577usize, + Self::OxcOnlyUsedInRecursion(_) => 578usize, + Self::OxcUninvokedArrayCallback(_) => 579usize, + Self::NextjsGoogleFontDisplay(_) => 580usize, + Self::NextjsGoogleFontPreconnect(_) => 581usize, + Self::NextjsInlineScriptId(_) => 582usize, + Self::NextjsNextScriptForGa(_) => 583usize, + Self::NextjsNoAssignModuleVariable(_) => 584usize, + Self::NextjsNoAsyncClientComponent(_) => 585usize, + Self::NextjsNoBeforeInteractiveScriptOutsideDocument(_) => 586usize, + Self::NextjsNoCssTags(_) => 587usize, + Self::NextjsNoDocumentImportInPage(_) => 588usize, + Self::NextjsNoDuplicateHead(_) => 589usize, + Self::NextjsNoHeadElement(_) => 590usize, + Self::NextjsNoHeadImportInDocument(_) => 591usize, + Self::NextjsNoHtmlLinkForPages(_) => 592usize, + Self::NextjsNoImgElement(_) => 593usize, + Self::NextjsNoPageCustomFont(_) => 594usize, + Self::NextjsNoScriptComponentInHead(_) => 595usize, + Self::NextjsNoStyledJsxInDocument(_) => 596usize, + Self::NextjsNoSyncScripts(_) => 597usize, + Self::NextjsNoTitleInDocumentHead(_) => 598usize, + Self::NextjsNoTypos(_) => 599usize, + Self::NextjsNoUnwantedPolyfillio(_) => 600usize, + Self::JsdocCheckAccess(_) => 601usize, + Self::JsdocCheckPropertyNames(_) => 602usize, + Self::JsdocCheckTagNames(_) => 603usize, + Self::JsdocEmptyTags(_) => 604usize, + Self::JsdocImplementsOnClasses(_) => 605usize, + Self::JsdocNoDefaults(_) => 606usize, + Self::JsdocRequireParam(_) => 607usize, + Self::JsdocRequireParamDescription(_) => 608usize, + Self::JsdocRequireParamName(_) => 609usize, + Self::JsdocRequireParamType(_) => 610usize, + Self::JsdocRequireProperty(_) => 611usize, + Self::JsdocRequirePropertyDescription(_) => 612usize, + Self::JsdocRequirePropertyName(_) => 613usize, + Self::JsdocRequirePropertyType(_) => 614usize, + Self::JsdocRequireReturns(_) => 615usize, + Self::JsdocRequireReturnsDescription(_) => 616usize, + Self::JsdocRequireReturnsType(_) => 617usize, + Self::JsdocRequireYields(_) => 618usize, + Self::PromiseAlwaysReturn(_) => 619usize, + Self::PromiseAvoidNew(_) => 620usize, + Self::PromiseCatchOrReturn(_) => 621usize, + Self::PromiseNoCallbackInPromise(_) => 622usize, + Self::PromiseNoMultipleResolved(_) => 623usize, + Self::PromiseNoNesting(_) => 624usize, + Self::PromiseNoNewStatics(_) => 625usize, + Self::PromiseNoPromiseInCallback(_) => 626usize, + Self::PromiseNoReturnInFinally(_) => 627usize, + Self::PromiseNoReturnWrap(_) => 628usize, + Self::PromiseParamNames(_) => 629usize, + Self::PromisePreferAwaitToCallbacks(_) => 630usize, + Self::PromisePreferAwaitToThen(_) => 631usize, + Self::PromisePreferCatch(_) => 632usize, + Self::PromiseSpecOnly(_) => 633usize, + Self::PromiseValidParams(_) => 634usize, + Self::VitestConsistentEachFor(_) => 635usize, + Self::VitestConsistentTestFilename(_) => 636usize, + Self::VitestConsistentVitestVi(_) => 637usize, + Self::VitestHoistedApisOnTop(_) => 638usize, + Self::VitestNoConditionalTests(_) => 639usize, + Self::VitestNoImportNodeTest(_) => 640usize, + Self::VitestPreferCalledOnce(_) => 641usize, + Self::VitestPreferCalledTimes(_) => 642usize, + Self::VitestPreferDescribeFunctionTitle(_) => 643usize, + Self::VitestPreferExpectTypeOf(_) => 644usize, + Self::VitestPreferToBeFalsy(_) => 645usize, + Self::VitestPreferToBeObject(_) => 646usize, + Self::VitestPreferToBeTruthy(_) => 647usize, + Self::VitestRequireLocalTestContextForConcurrentSnapshots(_) => 648usize, + Self::VitestWarnTodo(_) => 649usize, + Self::NodeGlobalRequire(_) => 650usize, + Self::NodeNoExportsAssign(_) => 651usize, + Self::NodeNoNewRequire(_) => 652usize, + Self::NodeNoProcessEnv(_) => 653usize, + Self::VueDefineEmitsDeclaration(_) => 654usize, + Self::VueDefinePropsDeclaration(_) => 655usize, + Self::VueDefinePropsDestructuring(_) => 656usize, + Self::VueMaxProps(_) => 657usize, + Self::VueNoArrowFunctionsInWatch(_) => 658usize, + Self::VueNoDeprecatedDestroyedLifecycle(_) => 659usize, + Self::VueNoExportInScriptSetup(_) => 660usize, + Self::VueNoImportCompilerMacros(_) => 661usize, + Self::VueNoLifecycleAfterAwait(_) => 662usize, + Self::VueNoMultipleSlotArgs(_) => 663usize, + Self::VueNoRequiredPropWithDefault(_) => 664usize, + Self::VueNoThisInBeforeRouteEnter(_) => 665usize, + Self::VuePreferImportFromVue(_) => 666usize, + Self::VueRequireDefaultExport(_) => 667usize, + Self::VueRequireTypedRef(_) => 668usize, + Self::VueValidDefineEmits(_) => 669usize, + Self::VueValidDefineProps(_) => 670usize, } } pub fn name(&self) -> &'static str { @@ -2315,6 +2318,7 @@ impl RuleEnum { Self::TypescriptNoUnnecessaryBooleanLiteralCompare(_) => { TypescriptNoUnnecessaryBooleanLiteralCompare::NAME } + Self::TypescriptNoUnnecessaryCondition(_) => TypescriptNoUnnecessaryCondition::NAME, Self::TypescriptNoUnnecessaryParameterPropertyAssignment(_) => { TypescriptNoUnnecessaryParameterPropertyAssignment::NAME } @@ -3087,6 +3091,7 @@ impl RuleEnum { Self::TypescriptNoUnnecessaryBooleanLiteralCompare(_) => { TypescriptNoUnnecessaryBooleanLiteralCompare::CATEGORY } + Self::TypescriptNoUnnecessaryCondition(_) => TypescriptNoUnnecessaryCondition::CATEGORY, Self::TypescriptNoUnnecessaryParameterPropertyAssignment(_) => { TypescriptNoUnnecessaryParameterPropertyAssignment::CATEGORY } @@ -3880,6 +3885,7 @@ impl RuleEnum { Self::TypescriptNoUnnecessaryBooleanLiteralCompare(_) => { TypescriptNoUnnecessaryBooleanLiteralCompare::FIX } + Self::TypescriptNoUnnecessaryCondition(_) => TypescriptNoUnnecessaryCondition::FIX, Self::TypescriptNoUnnecessaryParameterPropertyAssignment(_) => { TypescriptNoUnnecessaryParameterPropertyAssignment::FIX } @@ -4679,6 +4685,9 @@ impl RuleEnum { Self::TypescriptNoUnnecessaryBooleanLiteralCompare(_) => { TypescriptNoUnnecessaryBooleanLiteralCompare::documentation() } + Self::TypescriptNoUnnecessaryCondition(_) => { + TypescriptNoUnnecessaryCondition::documentation() + } Self::TypescriptNoUnnecessaryParameterPropertyAssignment(_) => { TypescriptNoUnnecessaryParameterPropertyAssignment::documentation() } @@ -5969,6 +5978,10 @@ impl RuleEnum { TypescriptNoUnnecessaryBooleanLiteralCompare::config_schema(generator) .or_else(|| TypescriptNoUnnecessaryBooleanLiteralCompare::schema(generator)) } + Self::TypescriptNoUnnecessaryCondition(_) => { + TypescriptNoUnnecessaryCondition::config_schema(generator) + .or_else(|| TypescriptNoUnnecessaryCondition::schema(generator)) + } Self::TypescriptNoUnnecessaryParameterPropertyAssignment(_) => { TypescriptNoUnnecessaryParameterPropertyAssignment::config_schema(generator) .or_else(|| { @@ -7448,6 +7461,7 @@ impl RuleEnum { Self::TypescriptNoRestrictedTypes(_) => "typescript", Self::TypescriptNoThisAlias(_) => "typescript", Self::TypescriptNoUnnecessaryBooleanLiteralCompare(_) => "typescript", + Self::TypescriptNoUnnecessaryCondition(_) => "typescript", Self::TypescriptNoUnnecessaryParameterPropertyAssignment(_) => "typescript", Self::TypescriptNoUnnecessaryTemplateExpression(_) => "typescript", Self::TypescriptNoUnnecessaryTypeArguments(_) => "typescript", @@ -8647,6 +8661,11 @@ impl RuleEnum { TypescriptNoUnnecessaryBooleanLiteralCompare::from_configuration(value)?, )) } + Self::TypescriptNoUnnecessaryCondition(_) => { + Ok(Self::TypescriptNoUnnecessaryCondition( + TypescriptNoUnnecessaryCondition::from_configuration(value)?, + )) + } Self::TypescriptNoUnnecessaryParameterPropertyAssignment(_) => { Ok(Self::TypescriptNoUnnecessaryParameterPropertyAssignment( TypescriptNoUnnecessaryParameterPropertyAssignment::from_configuration(value)?, @@ -10267,6 +10286,7 @@ impl RuleEnum { Self::TypescriptNoRestrictedTypes(rule) => rule.to_configuration(), Self::TypescriptNoThisAlias(rule) => rule.to_configuration(), Self::TypescriptNoUnnecessaryBooleanLiteralCompare(rule) => rule.to_configuration(), + Self::TypescriptNoUnnecessaryCondition(rule) => rule.to_configuration(), Self::TypescriptNoUnnecessaryParameterPropertyAssignment(rule) => { rule.to_configuration() } @@ -10945,6 +10965,7 @@ impl RuleEnum { Self::TypescriptNoRestrictedTypes(rule) => rule.run(node, ctx), Self::TypescriptNoThisAlias(rule) => rule.run(node, ctx), Self::TypescriptNoUnnecessaryBooleanLiteralCompare(rule) => rule.run(node, ctx), + Self::TypescriptNoUnnecessaryCondition(rule) => rule.run(node, ctx), Self::TypescriptNoUnnecessaryParameterPropertyAssignment(rule) => rule.run(node, ctx), Self::TypescriptNoUnnecessaryTemplateExpression(rule) => rule.run(node, ctx), Self::TypescriptNoUnnecessaryTypeArguments(rule) => rule.run(node, ctx), @@ -11619,6 +11640,7 @@ impl RuleEnum { Self::TypescriptNoRestrictedTypes(rule) => rule.run_once(ctx), Self::TypescriptNoThisAlias(rule) => rule.run_once(ctx), Self::TypescriptNoUnnecessaryBooleanLiteralCompare(rule) => rule.run_once(ctx), + Self::TypescriptNoUnnecessaryCondition(rule) => rule.run_once(ctx), Self::TypescriptNoUnnecessaryParameterPropertyAssignment(rule) => rule.run_once(ctx), Self::TypescriptNoUnnecessaryTemplateExpression(rule) => rule.run_once(ctx), Self::TypescriptNoUnnecessaryTypeArguments(rule) => rule.run_once(ctx), @@ -12327,6 +12349,7 @@ impl RuleEnum { Self::TypescriptNoUnnecessaryBooleanLiteralCompare(rule) => { rule.run_on_jest_node(jest_node, ctx) } + Self::TypescriptNoUnnecessaryCondition(rule) => rule.run_on_jest_node(jest_node, ctx), Self::TypescriptNoUnnecessaryParameterPropertyAssignment(rule) => { rule.run_on_jest_node(jest_node, ctx) } @@ -13057,6 +13080,7 @@ impl RuleEnum { Self::TypescriptNoRestrictedTypes(rule) => rule.should_run(ctx), Self::TypescriptNoThisAlias(rule) => rule.should_run(ctx), Self::TypescriptNoUnnecessaryBooleanLiteralCompare(rule) => rule.should_run(ctx), + Self::TypescriptNoUnnecessaryCondition(rule) => rule.should_run(ctx), Self::TypescriptNoUnnecessaryParameterPropertyAssignment(rule) => rule.should_run(ctx), Self::TypescriptNoUnnecessaryTemplateExpression(rule) => rule.should_run(ctx), Self::TypescriptNoUnnecessaryTypeArguments(rule) => rule.should_run(ctx), @@ -13799,6 +13823,9 @@ impl RuleEnum { Self::TypescriptNoUnnecessaryBooleanLiteralCompare(_) => { TypescriptNoUnnecessaryBooleanLiteralCompare::IS_TSGOLINT_RULE } + Self::TypescriptNoUnnecessaryCondition(_) => { + TypescriptNoUnnecessaryCondition::IS_TSGOLINT_RULE + } Self::TypescriptNoUnnecessaryParameterPropertyAssignment(_) => { TypescriptNoUnnecessaryParameterPropertyAssignment::IS_TSGOLINT_RULE } @@ -14720,6 +14747,9 @@ impl RuleEnum { Self::TypescriptNoUnnecessaryBooleanLiteralCompare(_) => { TypescriptNoUnnecessaryBooleanLiteralCompare::HAS_CONFIG } + Self::TypescriptNoUnnecessaryCondition(_) => { + TypescriptNoUnnecessaryCondition::HAS_CONFIG + } Self::TypescriptNoUnnecessaryParameterPropertyAssignment(_) => { TypescriptNoUnnecessaryParameterPropertyAssignment::HAS_CONFIG } @@ -15500,6 +15530,7 @@ impl RuleEnum { Self::TypescriptNoRestrictedTypes(rule) => rule.types_info(), Self::TypescriptNoThisAlias(rule) => rule.types_info(), Self::TypescriptNoUnnecessaryBooleanLiteralCompare(rule) => rule.types_info(), + Self::TypescriptNoUnnecessaryCondition(rule) => rule.types_info(), Self::TypescriptNoUnnecessaryParameterPropertyAssignment(rule) => rule.types_info(), Self::TypescriptNoUnnecessaryTemplateExpression(rule) => rule.types_info(), Self::TypescriptNoUnnecessaryTypeArguments(rule) => rule.types_info(), @@ -16174,6 +16205,7 @@ impl RuleEnum { Self::TypescriptNoRestrictedTypes(rule) => rule.run_info(), Self::TypescriptNoThisAlias(rule) => rule.run_info(), Self::TypescriptNoUnnecessaryBooleanLiteralCompare(rule) => rule.run_info(), + Self::TypescriptNoUnnecessaryCondition(rule) => rule.run_info(), Self::TypescriptNoUnnecessaryParameterPropertyAssignment(rule) => rule.run_info(), Self::TypescriptNoUnnecessaryTemplateExpression(rule) => rule.run_info(), Self::TypescriptNoUnnecessaryTypeArguments(rule) => rule.run_info(), @@ -16900,6 +16932,7 @@ pub static RULES: std::sync::LazyLock> = std::sync::LazyLock::new( RuleEnum::TypescriptNoUnnecessaryBooleanLiteralCompare( TypescriptNoUnnecessaryBooleanLiteralCompare::default(), ), + RuleEnum::TypescriptNoUnnecessaryCondition(TypescriptNoUnnecessaryCondition::default()), RuleEnum::TypescriptNoUnnecessaryParameterPropertyAssignment( TypescriptNoUnnecessaryParameterPropertyAssignment::default(), ), diff --git a/crates/oxc_linter/src/rules.rs b/crates/oxc_linter/src/rules.rs index f9446e4768d61..eee10646b96db 100644 --- a/crates/oxc_linter/src/rules.rs +++ b/crates/oxc_linter/src/rules.rs @@ -257,6 +257,7 @@ pub(crate) mod typescript { pub mod no_restricted_types; pub mod no_this_alias; pub mod no_unnecessary_boolean_literal_compare; + pub mod no_unnecessary_condition; pub mod no_unnecessary_parameter_property_assignment; pub mod no_unnecessary_template_expression; pub mod no_unnecessary_type_arguments; diff --git a/crates/oxc_linter/src/rules/typescript/no_unnecessary_condition.rs b/crates/oxc_linter/src/rules/typescript/no_unnecessary_condition.rs new file mode 100644 index 0000000000000..afb5c8cd27af7 --- /dev/null +++ b/crates/oxc_linter/src/rules/typescript/no_unnecessary_condition.rs @@ -0,0 +1,110 @@ +use oxc_macros::declare_oxc_lint; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +use crate::rule::{DefaultRuleConfig, Rule}; + +#[derive(Debug, Default, Clone, Deserialize)] +pub struct NoUnnecessaryCondition(Box); + +/// Represents the different ways `allowConstantLoopConditions` can be specified in JSON. +/// Can be: +/// - `true` or `false` +/// - A string enum (`"never"`, `"always"`, `"only-allowed-literals"`) +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[serde(untagged)] +pub enum AllowConstantLoopConditions { + Boolean(bool), + Mode(AllowConstantLoopConditionsMode), +} + +impl Default for AllowConstantLoopConditions { + fn default() -> Self { + Self::Mode(AllowConstantLoopConditionsMode::Never) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[serde(rename_all = "kebab-case")] +pub enum AllowConstantLoopConditionsMode { + Never, + Always, + OnlyAllowedLiterals, +} + +#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[serde(rename_all = "camelCase", default, deny_unknown_fields)] +pub struct NoUnnecessaryConditionConfig { + /// Whether to allow constant loop conditions. + /// `true` is treated as `"always"`, `false` as `"never"`. + pub allow_constant_loop_conditions: AllowConstantLoopConditions, + /// Whether to check type predicate functions. + pub check_type_predicates: bool, + /// DEPRECATED: Allow this rule to run without `strictNullChecks` enabled. + pub allow_rule_to_run_without_strict_null_checks_i_know_what_i_am_doing: bool, +} + +declare_oxc_lint!( + /// ### What it does + /// + /// Disallow conditions that are always truthy, always falsy, or always nullish + /// based on TypeScript's type information. + /// + /// ### Why is this bad? + /// + /// Conditions with no possible runtime variation make code harder to read and can + /// hide logic errors. They often leave dead branches and suggest that the declared + /// types do not match the intended behavior. + /// + /// ### Examples + /// + /// Examples of **incorrect** code for this rule: + /// ```ts + /// declare const value: null; + /// if (value) { + /// doWork(); + /// } + /// + /// const items: string[] = []; + /// if (items) { + /// doWork(); + /// } + /// + /// declare const status: "ready"; + /// if (!status) { + /// reportError(); + /// } + /// ``` + /// + /// Examples of **correct** code for this rule: + /// ```ts + /// declare const maybeUser: User | undefined; + /// if (maybeUser) { + /// doWork(maybeUser); + /// } + /// + /// const items: string[] = []; + /// if (items.length > 0) { + /// doWork(); + /// } + /// + /// declare const status: "ready" | ""; + /// if (!status) { + /// reportError(); + /// } + /// ``` + NoUnnecessaryCondition(tsgolint), + typescript, + nursery, // TODO(camc314): move to correctness + config = NoUnnecessaryConditionConfig, +); + +impl Rule for NoUnnecessaryCondition { + fn from_configuration(value: serde_json::Value) -> Result { + serde_json::from_value::>(value).map(DefaultRuleConfig::into_inner) + } + + fn to_configuration(&self) -> Option> { + Some(serde_json::to_value(&*self.0)) + } +}