@flint.fyi/ts 0.21.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{lib/plugin.d.ts → dist/index.d.mts} +1 -1
- package/dist/index.mjs +22468 -0
- package/package.json +9 -8
- package/lib/index.d.ts +0 -2
- package/lib/index.js +0 -2
- package/lib/plugin.js +0 -619
- package/lib/rules/accessorPairGroups.d.ts +0 -9
- package/lib/rules/accessorPairGroups.js +0 -46
- package/lib/rules/accessorPairTypes.d.ts +0 -9
- package/lib/rules/accessorPairTypes.js +0 -70
- package/lib/rules/accessorThisRecursion.d.ts +0 -9
- package/lib/rules/accessorThisRecursion.js +0 -63
- package/lib/rules/anyArguments.d.ts +0 -9
- package/lib/rules/anyArguments.js +0 -232
- package/lib/rules/anyAssignments.d.ts +0 -9
- package/lib/rules/anyAssignments.js +0 -263
- package/lib/rules/anyCalls.d.ts +0 -9
- package/lib/rules/anyCalls.js +0 -66
- package/lib/rules/anyMemberAccess.d.ts +0 -9
- package/lib/rules/anyMemberAccess.js +0 -83
- package/lib/rules/anyReturns.d.ts +0 -9
- package/lib/rules/anyReturns.js +0 -100
- package/lib/rules/arguments.d.ts +0 -9
- package/lib/rules/arguments.js +0 -36
- package/lib/rules/arrayCallbackReturns.d.ts +0 -9
- package/lib/rules/arrayCallbackReturns.js +0 -71
- package/lib/rules/arrayConstructors.d.ts +0 -9
- package/lib/rules/arrayConstructors.js +0 -45
- package/lib/rules/arrayDeleteUnnecessaryCounts.d.ts +0 -9
- package/lib/rules/arrayDeleteUnnecessaryCounts.js +0 -52
- package/lib/rules/arrayElementDeletions.d.ts +0 -9
- package/lib/rules/arrayElementDeletions.js +0 -41
- package/lib/rules/arrayEmptyCallbackSlots.d.ts +0 -9
- package/lib/rules/arrayEmptyCallbackSlots.js +0 -38
- package/lib/rules/arrayExistenceChecksConsistency.d.ts +0 -9
- package/lib/rules/arrayExistenceChecksConsistency.js +0 -84
- package/lib/rules/arrayFilteredFinds.d.ts +0 -9
- package/lib/rules/arrayFilteredFinds.js +0 -72
- package/lib/rules/arrayFinds.d.ts +0 -9
- package/lib/rules/arrayFinds.js +0 -39
- package/lib/rules/arrayFlatMapMethods.d.ts +0 -9
- package/lib/rules/arrayFlatMapMethods.js +0 -45
- package/lib/rules/arrayFlatMethods.d.ts +0 -9
- package/lib/rules/arrayFlatMethods.js +0 -81
- package/lib/rules/arrayFlatUnnecessaryDepths.d.ts +0 -9
- package/lib/rules/arrayFlatUnnecessaryDepths.js +0 -31
- package/lib/rules/arrayIncludes.d.ts +0 -9
- package/lib/rules/arrayIncludes.js +0 -51
- package/lib/rules/arrayIncludesMethods.d.ts +0 -9
- package/lib/rules/arrayIncludesMethods.js +0 -35
- package/lib/rules/arrayIndexOfMethods.d.ts +0 -9
- package/lib/rules/arrayIndexOfMethods.js +0 -49
- package/lib/rules/arrayLoops.d.ts +0 -9
- package/lib/rules/arrayLoops.js +0 -34
- package/lib/rules/arrayMapIdentities.d.ts +0 -9
- package/lib/rules/arrayMapIdentities.js +0 -72
- package/lib/rules/arrayMutableReverses.d.ts +0 -9
- package/lib/rules/arrayMutableReverses.js +0 -37
- package/lib/rules/arrayMutableSorts.d.ts +0 -9
- package/lib/rules/arrayMutableSorts.js +0 -70
- package/lib/rules/arrayReduceTypeArguments.d.ts +0 -9
- package/lib/rules/arrayReduceTypeArguments.js +0 -62
- package/lib/rules/arraySliceUnnecessaryEnd.d.ts +0 -9
- package/lib/rules/arraySliceUnnecessaryEnd.js +0 -49
- package/lib/rules/arraySomeMethods.d.ts +0 -9
- package/lib/rules/arraySomeMethods.js +0 -75
- package/lib/rules/arrayTernarySpreadingConsistency.d.ts +0 -9
- package/lib/rules/arrayTernarySpreadingConsistency.js +0 -72
- package/lib/rules/arrayTypes.d.ts +0 -16
- package/lib/rules/arrayTypes.js +0 -109
- package/lib/rules/arrayUnnecessaryLengthChecks.d.ts +0 -9
- package/lib/rules/arrayUnnecessaryLengthChecks.js +0 -95
- package/lib/rules/asConstAssertions.d.ts +0 -9
- package/lib/rules/asConstAssertions.js +0 -55
- package/lib/rules/assignmentOperatorShorthands.d.ts +0 -9
- package/lib/rules/assignmentOperatorShorthands.js +0 -45
- package/lib/rules/asyncFunctionAwaits.d.ts +0 -9
- package/lib/rules/asyncFunctionAwaits.js +0 -53
- package/lib/rules/asyncPromiseExecutors.d.ts +0 -9
- package/lib/rules/asyncPromiseExecutors.js +0 -39
- package/lib/rules/asyncUnnecessaryPromiseWrappers.d.ts +0 -9
- package/lib/rules/asyncUnnecessaryPromiseWrappers.js +0 -50
- package/lib/rules/atAccesses.d.ts +0 -9
- package/lib/rules/atAccesses.js +0 -50
- package/lib/rules/builtinCoercions.d.ts +0 -9
- package/lib/rules/builtinCoercions.js +0 -115
- package/lib/rules/builtinConstructorNews.d.ts +0 -9
- package/lib/rules/builtinConstructorNews.js +0 -87
- package/lib/rules/caseDeclarations.d.ts +0 -9
- package/lib/rules/caseDeclarations.js +0 -38
- package/lib/rules/caseDuplicates.d.ts +0 -9
- package/lib/rules/caseDuplicates.js +0 -34
- package/lib/rules/caseFallthroughs.d.ts +0 -9
- package/lib/rules/caseFallthroughs.js +0 -74
- package/lib/rules/catchCallbackTypes.d.ts +0 -9
- package/lib/rules/catchCallbackTypes.js +0 -65
- package/lib/rules/caughtVariableNames.d.ts +0 -9
- package/lib/rules/caughtVariableNames.js +0 -38
- package/lib/rules/chainedAssignments.d.ts +0 -9
- package/lib/rules/chainedAssignments.js +0 -31
- package/lib/rules/charAtComparisons.d.ts +0 -9
- package/lib/rules/charAtComparisons.js +0 -53
- package/lib/rules/classAssignments.d.ts +0 -9
- package/lib/rules/classAssignments.js +0 -27
- package/lib/rules/classFieldDeclarations.d.ts +0 -9
- package/lib/rules/classFieldDeclarations.js +0 -38
- package/lib/rules/classLiteralProperties.d.ts +0 -9
- package/lib/rules/classLiteralProperties.js +0 -43
- package/lib/rules/classMemberDuplicates.d.ts +0 -9
- package/lib/rules/classMemberDuplicates.js +0 -69
- package/lib/rules/classMethodsThis.d.ts +0 -13
- package/lib/rules/classMethodsThis.js +0 -122
- package/lib/rules/combinedPushes.d.ts +0 -9
- package/lib/rules/combinedPushes.js +0 -54
- package/lib/rules/consecutiveNonNullAssertions.d.ts +0 -9
- package/lib/rules/consecutiveNonNullAssertions.js +0 -37
- package/lib/rules/consoleCalls.d.ts +0 -8
- package/lib/rules/consoleCalls.js +0 -26
- package/lib/rules/constantAssignments.d.ts +0 -9
- package/lib/rules/constantAssignments.js +0 -39
- package/lib/rules/constructorGenericCalls.d.ts +0 -15
- package/lib/rules/constructorGenericCalls.js +0 -136
- package/lib/rules/constructorReturns.d.ts +0 -9
- package/lib/rules/constructorReturns.js +0 -39
- package/lib/rules/constructorSupers.d.ts +0 -9
- package/lib/rules/constructorSupers.js +0 -75
- package/lib/rules/dateConstructorClones.d.ts +0 -9
- package/lib/rules/dateConstructorClones.js +0 -35
- package/lib/rules/dateNowTimestamps.d.ts +0 -9
- package/lib/rules/dateNowTimestamps.js +0 -55
- package/lib/rules/debuggerStatements.d.ts +0 -9
- package/lib/rules/debuggerStatements.js +0 -31
- package/lib/rules/defaultCaseLast.d.ts +0 -9
- package/lib/rules/defaultCaseLast.js +0 -34
- package/lib/rules/defaultParameterLast.d.ts +0 -9
- package/lib/rules/defaultParameterLast.js +0 -40
- package/lib/rules/deprecated.d.ts +0 -9
- package/lib/rules/deprecated.js +0 -241
- package/lib/rules/destructuringConsistency.d.ts +0 -9
- package/lib/rules/destructuringConsistency.js +0 -104
- package/lib/rules/duplicateArguments.d.ts +0 -9
- package/lib/rules/duplicateArguments.js +0 -43
- package/lib/rules/dynamicDeletes.d.ts +0 -9
- package/lib/rules/dynamicDeletes.js +0 -35
- package/lib/rules/elseIfDuplicates.d.ts +0 -9
- package/lib/rules/elseIfDuplicates.js +0 -36
- package/lib/rules/elseReturns.d.ts +0 -9
- package/lib/rules/elseReturns.js +0 -65
- package/lib/rules/emptyBlocks.d.ts +0 -9
- package/lib/rules/emptyBlocks.js +0 -54
- package/lib/rules/emptyDestructures.d.ts +0 -9
- package/lib/rules/emptyDestructures.js +0 -32
- package/lib/rules/emptyEnums.d.ts +0 -9
- package/lib/rules/emptyEnums.js +0 -28
- package/lib/rules/emptyExports.d.ts +0 -9
- package/lib/rules/emptyExports.js +0 -58
- package/lib/rules/emptyFiles.d.ts +0 -9
- package/lib/rules/emptyFiles.js +0 -42
- package/lib/rules/emptyFunctions.d.ts +0 -9
- package/lib/rules/emptyFunctions.js +0 -59
- package/lib/rules/emptyModuleAttributes.d.ts +0 -9
- package/lib/rules/emptyModuleAttributes.js +0 -33
- package/lib/rules/emptyObjectTypes.d.ts +0 -9
- package/lib/rules/emptyObjectTypes.js +0 -45
- package/lib/rules/emptyStaticBlocks.d.ts +0 -9
- package/lib/rules/emptyStaticBlocks.js +0 -40
- package/lib/rules/emptyTypeParameterLists.d.ts +0 -9
- package/lib/rules/emptyTypeParameterLists.js +0 -29
- package/lib/rules/enumInitializers.d.ts +0 -9
- package/lib/rules/enumInitializers.js +0 -52
- package/lib/rules/enumMemberLiterals.d.ts +0 -9
- package/lib/rules/enumMemberLiterals.js +0 -37
- package/lib/rules/enumValueConsistency.d.ts +0 -9
- package/lib/rules/enumValueConsistency.js +0 -54
- package/lib/rules/enumValueDuplicates.d.ts +0 -9
- package/lib/rules/enumValueDuplicates.js +0 -43
- package/lib/rules/equalityOperatorNegations.d.ts +0 -8
- package/lib/rules/equalityOperatorNegations.js +0 -58
- package/lib/rules/equalityOperators.d.ts +0 -9
- package/lib/rules/equalityOperators.js +0 -42
- package/lib/rules/errorMessages.d.ts +0 -9
- package/lib/rules/errorMessages.js +0 -54
- package/lib/rules/errorSubclassProperties.d.ts +0 -9
- package/lib/rules/errorSubclassProperties.js +0 -142
- package/lib/rules/errorUnnecessaryCaptureStackTraces.d.ts +0 -9
- package/lib/rules/errorUnnecessaryCaptureStackTraces.js +0 -53
- package/lib/rules/escapeSequenceCasing.d.ts +0 -9
- package/lib/rules/escapeSequenceCasing.js +0 -73
- package/lib/rules/evals.d.ts +0 -9
- package/lib/rules/evals.js +0 -29
- package/lib/rules/evolvingVariableTypes.d.ts +0 -9
- package/lib/rules/evolvingVariableTypes.js +0 -31
- package/lib/rules/exceptionAssignments.d.ts +0 -9
- package/lib/rules/exceptionAssignments.js +0 -37
- package/lib/rules/explicitAnys.d.ts +0 -9
- package/lib/rules/explicitAnys.js +0 -53
- package/lib/rules/exponentiationOperators.d.ts +0 -9
- package/lib/rules/exponentiationOperators.js +0 -32
- package/lib/rules/exportFromImports.d.ts +0 -9
- package/lib/rules/exportFromImports.js +0 -117
- package/lib/rules/exportMutables.d.ts +0 -9
- package/lib/rules/exportMutables.js +0 -31
- package/lib/rules/exportUniqueNames.d.ts +0 -9
- package/lib/rules/exportUniqueNames.js +0 -63
- package/lib/rules/extraneousClasses.d.ts +0 -15
- package/lib/rules/extraneousClasses.js +0 -109
- package/lib/rules/fetchMethodBodies.d.ts +0 -9
- package/lib/rules/fetchMethodBodies.js +0 -70
- package/lib/rules/finallyStatementSafety.d.ts +0 -9
- package/lib/rules/finallyStatementSafety.js +0 -45
- package/lib/rules/forDirections.d.ts +0 -9
- package/lib/rules/forDirections.js +0 -73
- package/lib/rules/forInArrays.d.ts +0 -9
- package/lib/rules/forInArrays.js +0 -44
- package/lib/rules/forInGuards.d.ts +0 -8
- package/lib/rules/forInGuards.js +0 -42
- package/lib/rules/functionApplySpreads.d.ts +0 -9
- package/lib/rules/functionApplySpreads.js +0 -61
- package/lib/rules/functionAssignments.d.ts +0 -9
- package/lib/rules/functionAssignments.js +0 -27
- package/lib/rules/functionCurryingRedundancy.d.ts +0 -9
- package/lib/rules/functionCurryingRedundancy.js +0 -51
- package/lib/rules/functionDeclarationStyles.d.ts +0 -15
- package/lib/rules/functionDeclarationStyles.js +0 -65
- package/lib/rules/functionNameMatches.d.ts +0 -9
- package/lib/rules/functionNameMatches.js +0 -72
- package/lib/rules/functionNewCalls.d.ts +0 -9
- package/lib/rules/functionNewCalls.js +0 -40
- package/lib/rules/generatorFunctionYields.d.ts +0 -9
- package/lib/rules/generatorFunctionYields.js +0 -48
- package/lib/rules/getterReturns.d.ts +0 -9
- package/lib/rules/getterReturns.js +0 -63
- package/lib/rules/globalAssignments.d.ts +0 -9
- package/lib/rules/globalAssignments.js +0 -45
- package/lib/rules/globalObjectCalls.d.ts +0 -9
- package/lib/rules/globalObjectCalls.js +0 -40
- package/lib/rules/globalThisAliases.d.ts +0 -9
- package/lib/rules/globalThisAliases.js +0 -45
- package/lib/rules/impliedEvals.d.ts +0 -9
- package/lib/rules/impliedEvals.js +0 -128
- package/lib/rules/importEmptyBlocks.d.ts +0 -9
- package/lib/rules/importEmptyBlocks.js +0 -51
- package/lib/rules/importTypeSideEffects.d.ts +0 -9
- package/lib/rules/importTypeSideEffects.js +0 -29
- package/lib/rules/indexedObjectTypes.d.ts +0 -15
- package/lib/rules/indexedObjectTypes.js +0 -81
- package/lib/rules/instanceOfArrays.d.ts +0 -9
- package/lib/rules/instanceOfArrays.js +0 -29
- package/lib/rules/irregularWhitespaces.d.ts +0 -15
- package/lib/rules/irregularWhitespaces.js +0 -95
- package/lib/rules/isNaNComparisons.d.ts +0 -9
- package/lib/rules/isNaNComparisons.js +0 -41
- package/lib/rules/literalConstructorWrappers.d.ts +0 -9
- package/lib/rules/literalConstructorWrappers.js +0 -62
- package/lib/rules/mathMethods.d.ts +0 -9
- package/lib/rules/mathMethods.js +0 -126
- package/lib/rules/meaninglessVoidOperators.d.ts +0 -9
- package/lib/rules/meaninglessVoidOperators.js +0 -37
- package/lib/rules/misleadingVoidExpressions.d.ts +0 -9
- package/lib/rules/misleadingVoidExpressions.js +0 -126
- package/lib/rules/moduleSpecifierLists.d.ts +0 -9
- package/lib/rules/moduleSpecifierLists.js +0 -90
- package/lib/rules/multilineAmbiguities.d.ts +0 -9
- package/lib/rules/multilineAmbiguities.js +0 -62
- package/lib/rules/namedDefaultExports.d.ts +0 -9
- package/lib/rules/namedDefaultExports.js +0 -58
- package/lib/rules/namespaceDeclarations.d.ts +0 -13
- package/lib/rules/namespaceDeclarations.js +0 -35
- package/lib/rules/namespaceImplicitAmbientImports.d.ts +0 -9
- package/lib/rules/namespaceImplicitAmbientImports.js +0 -38
- package/lib/rules/namespaceKeywords.d.ts +0 -9
- package/lib/rules/namespaceKeywords.js +0 -38
- package/lib/rules/nativeObjectExtensions.d.ts +0 -9
- package/lib/rules/nativeObjectExtensions.js +0 -112
- package/lib/rules/negativeIndexLengthMethods.d.ts +0 -9
- package/lib/rules/negativeIndexLengthMethods.js +0 -178
- package/lib/rules/negativeZeroComparisons.d.ts +0 -9
- package/lib/rules/negativeZeroComparisons.js +0 -46
- package/lib/rules/nestedStandaloneIfs.d.ts +0 -9
- package/lib/rules/nestedStandaloneIfs.js +0 -103
- package/lib/rules/newDefinitions.d.ts +0 -9
- package/lib/rules/newDefinitions.js +0 -82
- package/lib/rules/newExpressions.d.ts +0 -9
- package/lib/rules/newExpressions.js +0 -36
- package/lib/rules/newNativeNonConstructors.d.ts +0 -9
- package/lib/rules/newNativeNonConstructors.js +0 -37
- package/lib/rules/nonNullAssertedNullishCoalesces.d.ts +0 -9
- package/lib/rules/nonNullAssertedNullishCoalesces.js +0 -61
- package/lib/rules/nonNullAssertedOptionalChains.d.ts +0 -9
- package/lib/rules/nonNullAssertedOptionalChains.js +0 -67
- package/lib/rules/nonNullAssertionPlacement.d.ts +0 -9
- package/lib/rules/nonNullAssertionPlacement.js +0 -92
- package/lib/rules/nonNullableTypeAssertions.d.ts +0 -9
- package/lib/rules/nonNullableTypeAssertions.js +0 -76
- package/lib/rules/nonOctalDecimalEscapes.d.ts +0 -9
- package/lib/rules/nonOctalDecimalEscapes.js +0 -46
- package/lib/rules/nullishCheckStyle.d.ts +0 -20
- package/lib/rules/nullishCheckStyle.js +0 -142
- package/lib/rules/nullishCoalescingOperators.d.ts +0 -21
- package/lib/rules/nullishCoalescingOperators.js +0 -321
- package/lib/rules/numberMethodRanges.d.ts +0 -9
- package/lib/rules/numberMethodRanges.js +0 -72
- package/lib/rules/numberStaticMethods.d.ts +0 -9
- package/lib/rules/numberStaticMethods.js +0 -51
- package/lib/rules/numericErasingOperations.d.ts +0 -9
- package/lib/rules/numericErasingOperations.js +0 -44
- package/lib/rules/numericLiteralParsing.d.ts +0 -9
- package/lib/rules/numericLiteralParsing.js +0 -55
- package/lib/rules/numericPrecision.d.ts +0 -9
- package/lib/rules/numericPrecision.js +0 -100
- package/lib/rules/numericSeparatorGroups.d.ts +0 -9
- package/lib/rules/numericSeparatorGroups.js +0 -99
- package/lib/rules/objectAssignSpreads.d.ts +0 -9
- package/lib/rules/objectAssignSpreads.js +0 -51
- package/lib/rules/objectCalls.d.ts +0 -9
- package/lib/rules/objectCalls.js +0 -36
- package/lib/rules/objectEntriesMethods.d.ts +0 -9
- package/lib/rules/objectEntriesMethods.js +0 -80
- package/lib/rules/objectHasOwns.d.ts +0 -9
- package/lib/rules/objectHasOwns.js +0 -48
- package/lib/rules/objectKeyDuplicates.d.ts +0 -9
- package/lib/rules/objectKeyDuplicates.js +0 -61
- package/lib/rules/objectProto.d.ts +0 -9
- package/lib/rules/objectProto.js +0 -48
- package/lib/rules/objectPrototypeBuiltIns.d.ts +0 -9
- package/lib/rules/objectPrototypeBuiltIns.js +0 -52
- package/lib/rules/objectShorthand.d.ts +0 -9
- package/lib/rules/objectShorthand.js +0 -82
- package/lib/rules/objectSpreadUnnecessaryFallbacks.d.ts +0 -9
- package/lib/rules/objectSpreadUnnecessaryFallbacks.js +0 -41
- package/lib/rules/objectTypeDefinitions.d.ts +0 -9
- package/lib/rules/objectTypeDefinitions.js +0 -32
- package/lib/rules/octalEscapes.d.ts +0 -9
- package/lib/rules/octalEscapes.js +0 -56
- package/lib/rules/octalNumbers.d.ts +0 -9
- package/lib/rules/octalNumbers.js +0 -53
- package/lib/rules/operatorAssignmentShorthand.d.ts +0 -9
- package/lib/rules/operatorAssignmentShorthand.js +0 -75
- package/lib/rules/overloadSignaturesAdjacent.d.ts +0 -9
- package/lib/rules/overloadSignaturesAdjacent.js +0 -138
- package/lib/rules/parameterReassignments.d.ts +0 -9
- package/lib/rules/parameterReassignments.js +0 -43
- package/lib/rules/parseIntRadixes.d.ts +0 -9
- package/lib/rules/parseIntRadixes.js +0 -57
- package/lib/rules/propertyAccessNotation.d.ts +0 -12
- package/lib/rules/propertyAccessNotation.js +0 -117
- package/lib/rules/recursionOnlyArguments.d.ts +0 -9
- package/lib/rules/recursionOnlyArguments.js +0 -62
- package/lib/rules/redundantTypeConstituents.d.ts +0 -9
- package/lib/rules/redundantTypeConstituents.js +0 -275
- package/lib/rules/regexAllGlobalFlags.d.ts +0 -9
- package/lib/rules/regexAllGlobalFlags.js +0 -54
- package/lib/rules/regexAmbiguousInvalidity.d.ts +0 -9
- package/lib/rules/regexAmbiguousInvalidity.js +0 -295
- package/lib/rules/regexCharacterClassRanges.d.ts +0 -9
- package/lib/rules/regexCharacterClassRanges.js +0 -135
- package/lib/rules/regexCharacterClassSetOperations.d.ts +0 -9
- package/lib/rules/regexCharacterClassSetOperations.js +0 -79
- package/lib/rules/regexCharacterClasses.d.ts +0 -9
- package/lib/rules/regexCharacterClasses.js +0 -232
- package/lib/rules/regexConciseCharacterClassNegations.d.ts +0 -9
- package/lib/rules/regexConciseCharacterClassNegations.js +0 -50
- package/lib/rules/regexContradictoryAssertions.d.ts +0 -9
- package/lib/rules/regexContradictoryAssertions.js +0 -208
- package/lib/rules/regexControlCharacterEscapes.d.ts +0 -9
- package/lib/rules/regexControlCharacterEscapes.js +0 -128
- package/lib/rules/regexControlCharacters.d.ts +0 -9
- package/lib/rules/regexControlCharacters.js +0 -93
- package/lib/rules/regexDigitMatchers.d.ts +0 -9
- package/lib/rules/regexDigitMatchers.js +0 -178
- package/lib/rules/regexDollarEscapes.d.ts +0 -9
- package/lib/rules/regexDollarEscapes.js +0 -89
- package/lib/rules/regexDuplicateCharacterClassCharacters.d.ts +0 -9
- package/lib/rules/regexDuplicateCharacterClassCharacters.js +0 -126
- package/lib/rules/regexEmptyAlternatives.d.ts +0 -9
- package/lib/rules/regexEmptyAlternatives.js +0 -138
- package/lib/rules/regexEmptyCapturingGroups.d.ts +0 -9
- package/lib/rules/regexEmptyCapturingGroups.js +0 -65
- package/lib/rules/regexEmptyCharacterClasses.d.ts +0 -9
- package/lib/rules/regexEmptyCharacterClasses.js +0 -66
- package/lib/rules/regexEmptyGroups.d.ts +0 -9
- package/lib/rules/regexEmptyGroups.js +0 -64
- package/lib/rules/regexEmptyLazyQuantifiers.d.ts +0 -9
- package/lib/rules/regexEmptyLazyQuantifiers.js +0 -90
- package/lib/rules/regexEmptyLookaroundsAssertions.d.ts +0 -9
- package/lib/rules/regexEmptyLookaroundsAssertions.js +0 -66
- package/lib/rules/regexEmptyStringLiterals.d.ts +0 -9
- package/lib/rules/regexEmptyStringLiterals.js +0 -64
- package/lib/rules/regexEscapeBackspaces.d.ts +0 -9
- package/lib/rules/regexEscapeBackspaces.js +0 -67
- package/lib/rules/regexExecutors.d.ts +0 -9
- package/lib/rules/regexExecutors.js +0 -56
- package/lib/rules/regexGraphemeStringLiterals.d.ts +0 -9
- package/lib/rules/regexGraphemeStringLiterals.js +0 -49
- package/lib/rules/regexHexadecimalEscapes.d.ts +0 -9
- package/lib/rules/regexHexadecimalEscapes.js +0 -69
- package/lib/rules/regexIgnoreCaseFlags.d.ts +0 -9
- package/lib/rules/regexIgnoreCaseFlags.js +0 -143
- package/lib/rules/regexInvisibleCharacters.d.ts +0 -9
- package/lib/rules/regexInvisibleCharacters.js +0 -88
- package/lib/rules/regexLetterCasing.d.ts +0 -9
- package/lib/rules/regexLetterCasing.js +0 -184
- package/lib/rules/regexLiterals.d.ts +0 -9
- package/lib/rules/regexLiterals.js +0 -87
- package/lib/rules/regexLookaroundAssertions.d.ts +0 -9
- package/lib/rules/regexLookaroundAssertions.js +0 -161
- package/lib/rules/regexLookaroundQuantifierOptimizations.d.ts +0 -9
- package/lib/rules/regexLookaroundQuantifierOptimizations.js +0 -92
- package/lib/rules/regexMatchNotation.d.ts +0 -9
- package/lib/rules/regexMatchNotation.js +0 -137
- package/lib/rules/regexMisleadingCapturingGroups.d.ts +0 -9
- package/lib/rules/regexMisleadingCapturingGroups.js +0 -227
- package/lib/rules/regexMisleadingQuantifiers.d.ts +0 -9
- package/lib/rules/regexMisleadingQuantifiers.js +0 -76
- package/lib/rules/regexMisleadingUnicodeCharacters.d.ts +0 -9
- package/lib/rules/regexMisleadingUnicodeCharacters.js +0 -201
- package/lib/rules/regexNamedBackreferences.d.ts +0 -9
- package/lib/rules/regexNamedBackreferences.js +0 -46
- package/lib/rules/regexNamedCaptureGroups.d.ts +0 -8
- package/lib/rules/regexNamedCaptureGroups.js +0 -65
- package/lib/rules/regexNamedReplacements.d.ts +0 -9
- package/lib/rules/regexNamedReplacements.js +0 -91
- package/lib/rules/regexNonStandardFlags.d.ts +0 -9
- package/lib/rules/regexNonStandardFlags.js +0 -64
- package/lib/rules/regexObscureRanges.d.ts +0 -9
- package/lib/rules/regexObscureRanges.js +0 -91
- package/lib/rules/regexOctalEscapes.d.ts +0 -9
- package/lib/rules/regexOctalEscapes.js +0 -68
- package/lib/rules/regexPlusQuantifiers.d.ts +0 -9
- package/lib/rules/regexPlusQuantifiers.js +0 -66
- package/lib/rules/regexPredefinedAssertions.d.ts +0 -9
- package/lib/rules/regexPredefinedAssertions.js +0 -125
- package/lib/rules/regexQuestionQuantifiers.d.ts +0 -9
- package/lib/rules/regexQuestionQuantifiers.js +0 -102
- package/lib/rules/regexRepeatQuantifiers.d.ts +0 -9
- package/lib/rules/regexRepeatQuantifiers.js +0 -94
- package/lib/rules/regexResultArrayGroups.d.ts +0 -9
- package/lib/rules/regexResultArrayGroups.js +0 -185
- package/lib/rules/regexSetOperationOptimizations.d.ts +0 -9
- package/lib/rules/regexSetOperationOptimizations.js +0 -175
- package/lib/rules/regexStandaloneBackslashes.d.ts +0 -9
- package/lib/rules/regexStandaloneBackslashes.js +0 -57
- package/lib/rules/regexStarQuantifiers.d.ts +0 -9
- package/lib/rules/regexStarQuantifiers.js +0 -66
- package/lib/rules/regexSuperLinearBacktracking.d.ts +0 -9
- package/lib/rules/regexSuperLinearBacktracking.js +0 -96
- package/lib/rules/regexSuperLinearMoves.d.ts +0 -9
- package/lib/rules/regexSuperLinearMoves.js +0 -140
- package/lib/rules/regexTestMethods.d.ts +0 -9
- package/lib/rules/regexTestMethods.js +0 -81
- package/lib/rules/regexUnicodeCodepointEscapes.d.ts +0 -9
- package/lib/rules/regexUnicodeCodepointEscapes.js +0 -105
- package/lib/rules/regexUnicodeEscapes.d.ts +0 -8
- package/lib/rules/regexUnicodeEscapes.js +0 -95
- package/lib/rules/regexUnicodeFlag.d.ts +0 -8
- package/lib/rules/regexUnicodeFlag.js +0 -95
- package/lib/rules/regexUnicodeProperties.d.ts +0 -9
- package/lib/rules/regexUnicodeProperties.js +0 -131
- package/lib/rules/regexUnnecessaryAssertions.d.ts +0 -9
- package/lib/rules/regexUnnecessaryAssertions.js +0 -221
- package/lib/rules/regexUnnecessaryBackreferences.d.ts +0 -9
- package/lib/rules/regexUnnecessaryBackreferences.js +0 -123
- package/lib/rules/regexUnnecessaryCharacterClasses.d.ts +0 -9
- package/lib/rules/regexUnnecessaryCharacterClasses.js +0 -72
- package/lib/rules/regexUnnecessaryCharacterRanges.d.ts +0 -9
- package/lib/rules/regexUnnecessaryCharacterRanges.js +0 -106
- package/lib/rules/regexUnnecessaryDisjunctions.d.ts +0 -9
- package/lib/rules/regexUnnecessaryDisjunctions.js +0 -116
- package/lib/rules/regexUnnecessaryDollarReplacements.d.ts +0 -9
- package/lib/rules/regexUnnecessaryDollarReplacements.js +0 -142
- package/lib/rules/regexUnnecessaryEscapes.d.ts +0 -9
- package/lib/rules/regexUnnecessaryEscapes.js +0 -134
- package/lib/rules/regexUnnecessaryLookaroundAssertions.d.ts +0 -9
- package/lib/rules/regexUnnecessaryLookaroundAssertions.js +0 -78
- package/lib/rules/regexUnnecessaryNestedAssertions.d.ts +0 -9
- package/lib/rules/regexUnnecessaryNestedAssertions.js +0 -196
- package/lib/rules/regexUnnecessaryNestedQuantifiers.d.ts +0 -9
- package/lib/rules/regexUnnecessaryNestedQuantifiers.js +0 -91
- package/lib/rules/regexUnnecessaryNonCapturingGroups.d.ts +0 -9
- package/lib/rules/regexUnnecessaryNonCapturingGroups.js +0 -102
- package/lib/rules/regexUnnecessaryNumericQuantifiers.d.ts +0 -9
- package/lib/rules/regexUnnecessaryNumericQuantifiers.js +0 -67
- package/lib/rules/regexUnnecessaryOptionalAssertions.d.ts +0 -9
- package/lib/rules/regexUnnecessaryOptionalAssertions.js +0 -135
- package/lib/rules/regexUnnecessaryReferentialBackreferences.d.ts +0 -9
- package/lib/rules/regexUnnecessaryReferentialBackreferences.js +0 -121
- package/lib/rules/regexUnnecessarySetOperands.d.ts +0 -9
- package/lib/rules/regexUnnecessarySetOperands.js +0 -134
- package/lib/rules/regexUnusedCapturingGroups.d.ts +0 -9
- package/lib/rules/regexUnusedCapturingGroups.js +0 -67
- package/lib/rules/regexUnusedFlags.d.ts +0 -9
- package/lib/rules/regexUnusedFlags.js +0 -114
- package/lib/rules/regexUnusedLazyQuantifiers.d.ts +0 -9
- package/lib/rules/regexUnusedLazyQuantifiers.js +0 -61
- package/lib/rules/regexUnusedQuantifiers.d.ts +0 -9
- package/lib/rules/regexUnusedQuantifiers.js +0 -61
- package/lib/rules/regexValidity.d.ts +0 -9
- package/lib/rules/regexValidity.js +0 -144
- package/lib/rules/regexWordMatchers.d.ts +0 -9
- package/lib/rules/regexWordMatchers.js +0 -144
- package/lib/rules/regexZeroQuantifiers.d.ts +0 -9
- package/lib/rules/regexZeroQuantifiers.js +0 -58
- package/lib/rules/requireImports.d.ts +0 -9
- package/lib/rules/requireImports.js +0 -46
- package/lib/rules/responseJsonMethods.d.ts +0 -9
- package/lib/rules/responseJsonMethods.js +0 -49
- package/lib/rules/restrictedIdentifiers.d.ts +0 -12
- package/lib/rules/restrictedIdentifiers.js +0 -39
- package/lib/rules/restrictedImports.d.ts +0 -26
- package/lib/rules/restrictedImports.js +0 -164
- package/lib/rules/returnAssignments.d.ts +0 -9
- package/lib/rules/returnAssignments.js +0 -36
- package/lib/rules/returnThisTypes.d.ts +0 -9
- package/lib/rules/returnThisTypes.js +0 -92
- package/lib/rules/ruleCreator.d.ts +0 -2
- package/lib/rules/ruleCreator.js +0 -15
- package/lib/rules/selfAssignments.d.ts +0 -9
- package/lib/rules/selfAssignments.js +0 -27
- package/lib/rules/sequences.d.ts +0 -9
- package/lib/rules/sequences.js +0 -26
- package/lib/rules/setSizeLengthChecks.d.ts +0 -9
- package/lib/rules/setSizeLengthChecks.js +0 -46
- package/lib/rules/setterReturns.d.ts +0 -9
- package/lib/rules/setterReturns.js +0 -39
- package/lib/rules/shadowedRestrictedNames.d.ts +0 -9
- package/lib/rules/shadowedRestrictedNames.js +0 -66
- package/lib/rules/singleVariableDeclarations.d.ts +0 -9
- package/lib/rules/singleVariableDeclarations.js +0 -34
- package/lib/rules/sizeComparisonOperators.d.ts +0 -15
- package/lib/rules/sizeComparisonOperators.js +0 -146
- package/lib/rules/sparseArrays.d.ts +0 -9
- package/lib/rules/sparseArrays.js +0 -41
- package/lib/rules/staticMemberOnlyClasses.d.ts +0 -9
- package/lib/rules/staticMemberOnlyClasses.js +0 -75
- package/lib/rules/stringCaseMismatches.d.ts +0 -9
- package/lib/rules/stringCaseMismatches.js +0 -53
- package/lib/rules/stringCodePoints.d.ts +0 -9
- package/lib/rules/stringCodePoints.js +0 -48
- package/lib/rules/stringSliceMethods.d.ts +0 -9
- package/lib/rules/stringSliceMethods.js +0 -45
- package/lib/rules/stringStartsEndsWith.d.ts +0 -9
- package/lib/rules/stringStartsEndsWith.js +0 -77
- package/lib/rules/structuredCloneMethods.d.ts +0 -9
- package/lib/rules/structuredCloneMethods.js +0 -37
- package/lib/rules/symbolDescriptions.d.ts +0 -9
- package/lib/rules/symbolDescriptions.js +0 -30
- package/lib/rules/thisAliases.d.ts +0 -9
- package/lib/rules/thisAliases.js +0 -42
- package/lib/rules/thisBeforeSuper.d.ts +0 -9
- package/lib/rules/thisBeforeSuper.js +0 -84
- package/lib/rules/throwErrors.d.ts +0 -9
- package/lib/rules/throwErrors.js +0 -59
- package/lib/rules/topLevelAwaits.d.ts +0 -9
- package/lib/rules/topLevelAwaits.js +0 -47
- package/lib/rules/tripleSlashReferenceValidity.d.ts +0 -9
- package/lib/rules/tripleSlashReferenceValidity.js +0 -52
- package/lib/rules/tripleSlashReferences.d.ts +0 -9
- package/lib/rules/tripleSlashReferences.js +0 -32
- package/lib/rules/tsComments.d.ts +0 -21
- package/lib/rules/tsComments.js +0 -128
- package/lib/rules/tslintComments.d.ts +0 -9
- package/lib/rules/tslintComments.js +0 -34
- package/lib/rules/typeAssertionStyles.d.ts +0 -9
- package/lib/rules/typeAssertionStyles.js +0 -30
- package/lib/rules/typeImports.d.ts +0 -19
- package/lib/rules/typeImports.js +0 -281
- package/lib/rules/typeofComparisons.d.ts +0 -9
- package/lib/rules/typeofComparisons.js +0 -53
- package/lib/rules/unassignedVariables.d.ts +0 -9
- package/lib/rules/unassignedVariables.js +0 -32
- package/lib/rules/undefinedTypeofChecks.d.ts +0 -9
- package/lib/rules/undefinedTypeofChecks.js +0 -39
- package/lib/rules/undefinedVariables.d.ts +0 -9
- package/lib/rules/undefinedVariables.js +0 -37
- package/lib/rules/unicodeBOMs.d.ts +0 -9
- package/lib/rules/unicodeBOMs.js +0 -37
- package/lib/rules/unnecessaryBinds.d.ts +0 -9
- package/lib/rules/unnecessaryBinds.js +0 -76
- package/lib/rules/unnecessaryBlocks.d.ts +0 -9
- package/lib/rules/unnecessaryBlocks.js +0 -58
- package/lib/rules/unnecessaryBooleanCasts.d.ts +0 -9
- package/lib/rules/unnecessaryBooleanCasts.js +0 -56
- package/lib/rules/unnecessaryCatches.d.ts +0 -9
- package/lib/rules/unnecessaryCatches.js +0 -46
- package/lib/rules/unnecessaryComparisons.d.ts +0 -9
- package/lib/rules/unnecessaryComparisons.js +0 -291
- package/lib/rules/unnecessaryConcatenation.d.ts +0 -9
- package/lib/rules/unnecessaryConcatenation.js +0 -26
- package/lib/rules/unnecessaryEscapes.d.ts +0 -9
- package/lib/rules/unnecessaryEscapes.js +0 -132
- package/lib/rules/unnecessaryMathClamps.d.ts +0 -9
- package/lib/rules/unnecessaryMathClamps.js +0 -106
- package/lib/rules/unnecessaryNumericFractions.d.ts +0 -9
- package/lib/rules/unnecessaryNumericFractions.js +0 -48
- package/lib/rules/unnecessaryRenames.d.ts +0 -9
- package/lib/rules/unnecessaryRenames.js +0 -90
- package/lib/rules/unnecessaryTernaries.d.ts +0 -9
- package/lib/rules/unnecessaryTernaries.js +0 -86
- package/lib/rules/unnecessaryUseStricts.d.ts +0 -9
- package/lib/rules/unnecessaryUseStricts.js +0 -38
- package/lib/rules/unsafeNegations.d.ts +0 -9
- package/lib/rules/unsafeNegations.js +0 -36
- package/lib/rules/utils/collectAccessorPairs.d.ts +0 -11
- package/lib/rules/utils/collectAccessorPairs.js +0 -27
- package/lib/rules/utils/countCommentsInRange.d.ts +0 -2
- package/lib/rules/utils/countCommentsInRange.js +0 -10
- package/lib/rules/utils/discriminateAnyType.d.ts +0 -15
- package/lib/rules/utils/discriminateAnyType.js +0 -36
- package/lib/rules/utils/equalityOperators.d.ts +0 -8
- package/lib/rules/utils/equalityOperators.js +0 -34
- package/lib/rules/utils/forEachReturnStatement.d.ts +0 -2
- package/lib/rules/utils/forEachReturnStatement.js +0 -27
- package/lib/rules/utils/formatReportedType.d.ts +0 -3
- package/lib/rules/utils/formatReportedType.js +0 -7
- package/lib/rules/utils/getConstrainedType.d.ts +0 -2
- package/lib/rules/utils/getConstrainedType.js +0 -7
- package/lib/rules/utils/getFunctionName.d.ts +0 -2
- package/lib/rules/utils/getFunctionName.js +0 -14
- package/lib/rules/utils/getRegExpConstruction.d.ts +0 -8
- package/lib/rules/utils/getRegExpConstruction.js +0 -25
- package/lib/rules/utils/getRegExpLiteralDetails.d.ts +0 -6
- package/lib/rules/utils/getRegExpLiteralDetails.js +0 -11
- package/lib/rules/utils/getThisExpression.d.ts +0 -2
- package/lib/rules/utils/getThisExpression.js +0 -14
- package/lib/rules/utils/isArrayOrTupleTypeAtLocation.d.ts +0 -2
- package/lib/rules/utils/isArrayOrTupleTypeAtLocation.js +0 -11
- package/lib/rules/utils/isBuiltinSymbolLike.d.ts +0 -2
- package/lib/rules/utils/isBuiltinSymbolLike.js +0 -31
- package/lib/rules/utils/isDirectEqualityCheck.d.ts +0 -3
- package/lib/rules/utils/isDirectEqualityCheck.js +0 -27
- package/lib/rules/utils/isErrorSubclass.d.ts +0 -3
- package/lib/rules/utils/isErrorSubclass.js +0 -25
- package/lib/rules/utils/isInBooleanContext.d.ts +0 -2
- package/lib/rules/utils/isInBooleanContext.js +0 -20
- package/lib/rules/utils/isTypeRecursive.d.ts +0 -2
- package/lib/rules/utils/isTypeRecursive.js +0 -6
- package/lib/rules/utils/isUnsafeAssignment.d.ts +0 -14
- package/lib/rules/utils/isUnsafeAssignment.js +0 -43
- package/lib/rules/utils/operators.d.ts +0 -4
- package/lib/rules/utils/operators.js +0 -33
- package/lib/rules/utils/parseRegexpAst.d.ts +0 -1
- package/lib/rules/utils/parseRegexpAst.js +0 -15
- package/lib/rules/utils/parseRegexpAstFull.d.ts +0 -2
- package/lib/rules/utils/parseRegexpAstFull.js +0 -16
- package/lib/rules/utils/skipParentheses.d.ts +0 -2
- package/lib/rules/utils/skipParentheses.js +0 -8
- package/lib/rules/variableDeletions.d.ts +0 -9
- package/lib/rules/variableDeletions.js +0 -33
- package/lib/rules/voidOperator.d.ts +0 -9
- package/lib/rules/voidOperator.js +0 -32
- package/lib/rules/withStatements.d.ts +0 -9
- package/lib/rules/withStatements.js +0 -28
- package/lib/rules/wrapperObjects.d.ts +0 -9
- package/lib/rules/wrapperObjects.js +0 -34
- package/lib/type-utils/getSpecifierNames.d.ts +0 -2
- package/lib/type-utils/getSpecifierNames.js +0 -7
- package/lib/type-utils/isDeclaredInModuleBlock.d.ts +0 -2
- package/lib/type-utils/isDeclaredInModuleBlock.js +0 -12
- package/lib/type-utils/isFromFile.d.ts +0 -2
- package/lib/type-utils/isFromFile.js +0 -11
- package/lib/type-utils/isFromPackage.d.ts +0 -2
- package/lib/type-utils/isFromPackage.js +0 -13
- package/lib/type-utils/matchesSpecifier.d.ts +0 -3
- package/lib/type-utils/matchesSpecifier.js +0 -18
- package/lib/type-utils/schemas.d.ts +0 -14
- package/lib/type-utils/schemas.js +0 -23
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { getTSNodeRange, typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
3
|
-
import ts, { SyntaxKind } from "typescript";
|
|
4
|
-
//#region src/rules/nestedStandaloneIfs.ts
|
|
5
|
-
function hasCommentsInRange(sourceFile, start, end) {
|
|
6
|
-
const text = sourceFile.text.slice(start, end);
|
|
7
|
-
return text.includes("//") || text.includes("/*");
|
|
8
|
-
}
|
|
9
|
-
function isIfWithoutElse(node) {
|
|
10
|
-
return ts.isIfStatement(node) && node.elseStatement === void 0;
|
|
11
|
-
}
|
|
12
|
-
const lowerPrecedenceThanLogicalAnd = /* @__PURE__ */ new Set([
|
|
13
|
-
SyntaxKind.BinaryExpression,
|
|
14
|
-
SyntaxKind.ConditionalExpression,
|
|
15
|
-
SyntaxKind.YieldExpression
|
|
16
|
-
]);
|
|
17
|
-
function needsParentheses(node) {
|
|
18
|
-
if (node.kind !== SyntaxKind.BinaryExpression) return lowerPrecedenceThanLogicalAnd.has(node.kind);
|
|
19
|
-
const operator = node.operatorToken.kind;
|
|
20
|
-
return operator === SyntaxKind.BarBarToken || operator === SyntaxKind.QuestionQuestionToken || operator === SyntaxKind.CommaToken || operator === SyntaxKind.EqualsToken || operator === SyntaxKind.PlusEqualsToken || operator === SyntaxKind.MinusEqualsToken || operator === SyntaxKind.AsteriskEqualsToken || operator === SyntaxKind.SlashEqualsToken || operator === SyntaxKind.PercentEqualsToken || operator === SyntaxKind.AsteriskAsteriskEqualsToken || operator === SyntaxKind.LessThanLessThanEqualsToken || operator === SyntaxKind.GreaterThanGreaterThanEqualsToken || operator === SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken || operator === SyntaxKind.AmpersandEqualsToken || operator === SyntaxKind.BarEqualsToken || operator === SyntaxKind.CaretEqualsToken || operator === SyntaxKind.BarBarEqualsToken || operator === SyntaxKind.AmpersandAmpersandEqualsToken || operator === SyntaxKind.QuestionQuestionEqualsToken;
|
|
21
|
-
}
|
|
22
|
-
function wrapWithParenthesesIfNeeded(expression, sourceFile) {
|
|
23
|
-
const text = expression.getText(sourceFile);
|
|
24
|
-
return needsParentheses(expression) ? `(${text})` : text;
|
|
25
|
-
}
|
|
26
|
-
var nestedStandaloneIfs_default = ruleCreator.createRule(typescriptLanguage, {
|
|
27
|
-
about: {
|
|
28
|
-
description: "Reports `if` statements that are the only statement inside an `else` block or inside another `if` without an `else`.",
|
|
29
|
-
id: "nestedStandaloneIfs",
|
|
30
|
-
presets: ["stylistic", "stylisticStrict"]
|
|
31
|
-
},
|
|
32
|
-
messages: {
|
|
33
|
-
lonelyIfInElse: {
|
|
34
|
-
primary: "This `if` is the only statement in an `else` block and can be written as `else if`.",
|
|
35
|
-
secondary: ["An `if` statement that is the only statement inside an `else` block can be collapsed into `else if`, which reduces nesting and improves readability."],
|
|
36
|
-
suggestions: ["Convert to `else if` to flatten the structure."]
|
|
37
|
-
},
|
|
38
|
-
lonelyIfInIf: {
|
|
39
|
-
primary: "This `if` is the only statement inside another `if` without an `else` and can be combined using `&&`.",
|
|
40
|
-
secondary: ["When an `if` statement is the only statement inside another `if` that has no `else`, the conditions can be combined with `&&` for simpler code."],
|
|
41
|
-
suggestions: ["Combine the conditions with `&&`."]
|
|
42
|
-
}
|
|
43
|
-
},
|
|
44
|
-
setup(context) {
|
|
45
|
-
function checkSoleBlockChild(node, sourceFile) {
|
|
46
|
-
if (node.parent.parent.kind === SyntaxKind.IfStatement && node.parent.parent.elseStatement === node.parent) {
|
|
47
|
-
const grandparent = node.parent.parent;
|
|
48
|
-
const openBrace = node.parent.getStart(sourceFile);
|
|
49
|
-
const closeBrace = node.parent.getEnd();
|
|
50
|
-
if (hasCommentsInRange(sourceFile, openBrace + 1, node.getStart(sourceFile))) return;
|
|
51
|
-
if (hasCommentsInRange(sourceFile, node.getEnd(), closeBrace - 1)) return;
|
|
52
|
-
if (!grandparent.getChildren(sourceFile).find((child) => child.kind === SyntaxKind.ElseKeyword)) return;
|
|
53
|
-
const nodeText = node.getText(sourceFile);
|
|
54
|
-
context.report({
|
|
55
|
-
fix: {
|
|
56
|
-
range: {
|
|
57
|
-
begin: node.parent.getStart(sourceFile),
|
|
58
|
-
end: node.parent.getEnd()
|
|
59
|
-
},
|
|
60
|
-
text: nodeText
|
|
61
|
-
},
|
|
62
|
-
message: "lonelyIfInElse",
|
|
63
|
-
range: getTSNodeRange(node, sourceFile)
|
|
64
|
-
});
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
if (!isIfWithoutElse(node)) return;
|
|
68
|
-
if (isIfWithoutElse(node.parent.parent) && node.parent.parent.thenStatement === node.parent) {
|
|
69
|
-
const outerIf = node.parent.parent;
|
|
70
|
-
const openBrace = node.parent.getStart(sourceFile);
|
|
71
|
-
const closeBrace = node.parent.getEnd();
|
|
72
|
-
if (hasCommentsInRange(sourceFile, openBrace + 1, node.getStart(sourceFile)) || hasCommentsInRange(sourceFile, node.getEnd(), closeBrace - 1)) return;
|
|
73
|
-
const fixedText = `if (${wrapWithParenthesesIfNeeded(outerIf.expression, sourceFile)} && ${wrapWithParenthesesIfNeeded(node.expression, sourceFile)}) ${node.thenStatement.getText(sourceFile)}`;
|
|
74
|
-
context.report({
|
|
75
|
-
fix: {
|
|
76
|
-
range: getTSNodeRange(outerIf, sourceFile),
|
|
77
|
-
text: fixedText
|
|
78
|
-
},
|
|
79
|
-
message: "lonelyIfInIf",
|
|
80
|
-
range: getTSNodeRange(node, sourceFile)
|
|
81
|
-
});
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
function checkChildOfIfWithoutElse(node, parent, sourceFile) {
|
|
86
|
-
const fixedText = `if (${wrapWithParenthesesIfNeeded(parent.expression, sourceFile)} && ${wrapWithParenthesesIfNeeded(node.expression, sourceFile)}) ${node.thenStatement.getText(sourceFile)}`;
|
|
87
|
-
context.report({
|
|
88
|
-
fix: {
|
|
89
|
-
range: getTSNodeRange(parent, sourceFile),
|
|
90
|
-
text: fixedText
|
|
91
|
-
},
|
|
92
|
-
message: "lonelyIfInIf",
|
|
93
|
-
range: getTSNodeRange(node, sourceFile)
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
return { visitors: { IfStatement: (node, { sourceFile }) => {
|
|
97
|
-
if (node.parent.kind === SyntaxKind.Block && node.parent.statements.length === 1) checkSoleBlockChild(node, sourceFile);
|
|
98
|
-
else if (isIfWithoutElse(node.parent) && node.parent.thenStatement === node) checkChildOfIfWithoutElse(node, node.parent, sourceFile);
|
|
99
|
-
} } };
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
//#endregion
|
|
103
|
-
export { nestedStandaloneIfs_default as default };
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Reports misleading constructor and `new` definitions in interfaces and classes.";
|
|
3
|
-
readonly id: "newDefinitions";
|
|
4
|
-
readonly presets: readonly ["logical", "logicalStrict"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "classMethodNamedNew" | "interfaceConstructSignature" | "interfaceMethodNamedConstructor", undefined>;
|
|
9
|
-
export default _default;
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { getTSNodeRange, typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
3
|
-
import ts from "typescript";
|
|
4
|
-
//#region src/rules/newDefinitions.ts
|
|
5
|
-
function getParentClassName(node) {
|
|
6
|
-
switch (node.parent.kind) {
|
|
7
|
-
case ts.SyntaxKind.ClassDeclaration:
|
|
8
|
-
case ts.SyntaxKind.ClassExpression: return node.parent.name?.text;
|
|
9
|
-
case ts.SyntaxKind.SourceFile: return;
|
|
10
|
-
default: return getParentClassName(node.parent);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
function getParentInterface(node) {
|
|
14
|
-
switch (node.parent.kind) {
|
|
15
|
-
case ts.SyntaxKind.InterfaceDeclaration: return node.parent;
|
|
16
|
-
case ts.SyntaxKind.SourceFile: return;
|
|
17
|
-
default: return getParentInterface(node.parent);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
function getTypeReferenceName(node) {
|
|
21
|
-
return node?.kind === ts.SyntaxKind.TypeReference && node.typeName.kind === ts.SyntaxKind.Identifier ? node.typeName.text : void 0;
|
|
22
|
-
}
|
|
23
|
-
var newDefinitions_default = ruleCreator.createRule(typescriptLanguage, {
|
|
24
|
-
about: {
|
|
25
|
-
description: "Reports misleading constructor and `new` definitions in interfaces and classes.",
|
|
26
|
-
id: "newDefinitions",
|
|
27
|
-
presets: ["logical", "logicalStrict"]
|
|
28
|
-
},
|
|
29
|
-
messages: {
|
|
30
|
-
classMethodNamedNew: {
|
|
31
|
-
primary: "A class method named `new` that returns the class type is misleading.",
|
|
32
|
-
secondary: ["This looks like a constructor definition, but classes use `constructor` instead of `new`.", "A method named `new` suggests instantiation, which is confusing in a class context."],
|
|
33
|
-
suggestions: ["Rename the method if it's not meant to be a constructor.", "Use `constructor` to define the class constructor."]
|
|
34
|
-
},
|
|
35
|
-
interfaceConstructSignature: {
|
|
36
|
-
primary: "An interface cannot be constructed directly; only classes can be instantiated.",
|
|
37
|
-
secondary: [
|
|
38
|
-
"A `new()` signature in an interface that returns the interface type is misleading.",
|
|
39
|
-
"If you want to define a class, use `class` instead of `interface`.",
|
|
40
|
-
"If you want to define a constructor function type, the return type should differ from the interface name."
|
|
41
|
-
],
|
|
42
|
-
suggestions: ["Use a class declaration instead of an interface.", "Change the return type if this describes a constructor function."]
|
|
43
|
-
},
|
|
44
|
-
interfaceMethodNamedConstructor: {
|
|
45
|
-
primary: "Interfaces define `new()` signatures, not `constructor` methods.",
|
|
46
|
-
secondary: ["A method named `constructor` in an interface is misleading because interfaces cannot be instantiated.", "The `constructor` keyword is used in classes, not interfaces."],
|
|
47
|
-
suggestions: ["Use `new()` to define a construct signature in the interface.", "Convert this to a class if you need a constructor."]
|
|
48
|
-
}
|
|
49
|
-
},
|
|
50
|
-
setup(context) {
|
|
51
|
-
return { visitors: {
|
|
52
|
-
ConstructSignature: (node, { sourceFile }) => {
|
|
53
|
-
const parentInterface = getParentInterface(node);
|
|
54
|
-
if (!parentInterface?.name) return;
|
|
55
|
-
if (getTypeReferenceName(node.type) !== parentInterface.name.text) return;
|
|
56
|
-
context.report({
|
|
57
|
-
message: "interfaceConstructSignature",
|
|
58
|
-
range: getTSNodeRange(node, sourceFile)
|
|
59
|
-
});
|
|
60
|
-
},
|
|
61
|
-
MethodDeclaration: (node, { sourceFile }) => {
|
|
62
|
-
if (node.body || node.parent.kind !== ts.SyntaxKind.ClassDeclaration && node.parent.kind !== ts.SyntaxKind.ClassExpression || node.name.kind !== ts.SyntaxKind.Identifier || node.name.text !== "new") return;
|
|
63
|
-
const parentName = getParentClassName(node);
|
|
64
|
-
if (!parentName) return;
|
|
65
|
-
if (getTypeReferenceName(node.type) !== parentName) return;
|
|
66
|
-
context.report({
|
|
67
|
-
message: "classMethodNamedNew",
|
|
68
|
-
range: getTSNodeRange(node, sourceFile)
|
|
69
|
-
});
|
|
70
|
-
},
|
|
71
|
-
MethodSignature: (node, { sourceFile }) => {
|
|
72
|
-
if (node.name.kind !== ts.SyntaxKind.Identifier || node.name.text !== "constructor") return;
|
|
73
|
-
context.report({
|
|
74
|
-
message: "interfaceMethodNamedConstructor",
|
|
75
|
-
range: getTSNodeRange(node, sourceFile)
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
} };
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
//#endregion
|
|
82
|
-
export { newDefinitions_default as default };
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Reports standalone new expressions that don't use the constructed object.";
|
|
3
|
-
readonly id: "newExpressions";
|
|
4
|
-
readonly presets: readonly ["logical", "logicalStrict"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "noStandaloneNew", undefined>;
|
|
9
|
-
export default _default;
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { getTSNodeRange, typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
3
|
-
import { SyntaxKind } from "typescript";
|
|
4
|
-
//#region src/rules/newExpressions.ts
|
|
5
|
-
var newExpressions_default = ruleCreator.createRule(typescriptLanguage, {
|
|
6
|
-
about: {
|
|
7
|
-
description: "Reports standalone new expressions that don't use the constructed object.",
|
|
8
|
-
id: "newExpressions",
|
|
9
|
-
presets: ["logical", "logicalStrict"]
|
|
10
|
-
},
|
|
11
|
-
messages: { noStandaloneNew: {
|
|
12
|
-
primary: "Constructors should only be called when their return value is used.",
|
|
13
|
-
secondary: ["Using `new` to construct an object but not storing or using the result is often a mistake or indicates unclear code intent.", "If the constructor has side effects you want to trigger, it's better to make that explicit by calling a separate method rather than relying on constructor side effects."],
|
|
14
|
-
suggestions: ["If you need to use the constructed object, assign it to a variable or return it.", "If you only need the constructor's side effects, consider refactoring to a function that makes the side effects explicit."]
|
|
15
|
-
} },
|
|
16
|
-
setup(context) {
|
|
17
|
-
function isStandaloneExpression(node) {
|
|
18
|
-
switch (node.parent.kind) {
|
|
19
|
-
case SyntaxKind.BinaryExpression:
|
|
20
|
-
if (node.parent.operatorToken.kind !== SyntaxKind.CommaToken) return false;
|
|
21
|
-
if (node.parent.right === node) return isStandaloneExpression(node.parent);
|
|
22
|
-
return true;
|
|
23
|
-
case SyntaxKind.ExpressionStatement: return true;
|
|
24
|
-
default: return false;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return { visitors: { NewExpression: (node, { sourceFile }) => {
|
|
28
|
-
if (isStandaloneExpression(node)) context.report({
|
|
29
|
-
message: "noStandaloneNew",
|
|
30
|
-
range: getTSNodeRange(node.getChildAt(0, sourceFile), sourceFile)
|
|
31
|
-
});
|
|
32
|
-
} } };
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
//#endregion
|
|
36
|
-
export { newExpressions_default as default };
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Disallows using `new` with global non-constructor functions like Symbol and BigInt.";
|
|
3
|
-
readonly id: "newNativeNonConstructors";
|
|
4
|
-
readonly presets: readonly ["javascript"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "noNewNonConstructor", undefined>;
|
|
9
|
-
export default _default;
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { getTSNodeRange, isGlobalDeclaration, typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
3
|
-
import { SyntaxKind } from "typescript";
|
|
4
|
-
//#region src/rules/newNativeNonConstructors.ts
|
|
5
|
-
var newNativeNonConstructors_default = ruleCreator.createRule(typescriptLanguage, {
|
|
6
|
-
about: {
|
|
7
|
-
description: "Disallows using `new` with global non-constructor functions like Symbol and BigInt.",
|
|
8
|
-
id: "newNativeNonConstructors",
|
|
9
|
-
presets: ["javascript"]
|
|
10
|
-
},
|
|
11
|
-
messages: { noNewNonConstructor: {
|
|
12
|
-
primary: "{{ name }} cannot be called with `new`.",
|
|
13
|
-
secondary: ["`Symbol` and `BigInt` are not constructors and will throw a `TypeError` when called with `new`.", "These functions should be called directly without the `new` keyword to create their respective values."],
|
|
14
|
-
suggestions: ["Remove the `new` keyword and call the function directly."]
|
|
15
|
-
} },
|
|
16
|
-
setup(context) {
|
|
17
|
-
return { visitors: { NewExpression: (node, { program, sourceFile, typeChecker }) => {
|
|
18
|
-
if (node.expression.kind !== SyntaxKind.Identifier) return;
|
|
19
|
-
const name = node.expression.text;
|
|
20
|
-
if (!["BigInt", "Symbol"].includes(name) || !isGlobalDeclaration(node.expression, typeChecker, program)) return;
|
|
21
|
-
context.report({
|
|
22
|
-
data: { name },
|
|
23
|
-
fix: {
|
|
24
|
-
range: {
|
|
25
|
-
begin: node.getStart(sourceFile),
|
|
26
|
-
end: node.expression.getStart(sourceFile)
|
|
27
|
-
},
|
|
28
|
-
text: ""
|
|
29
|
-
},
|
|
30
|
-
message: "noNewNonConstructor",
|
|
31
|
-
range: getTSNodeRange(node.getChildAt(0, sourceFile), sourceFile)
|
|
32
|
-
});
|
|
33
|
-
} } };
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
//#endregion
|
|
37
|
-
export { newNativeNonConstructors_default as default };
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Reports non-null assertions on the left side of nullish coalescing operators.";
|
|
3
|
-
readonly id: "nonNullAssertedNullishCoalesces";
|
|
4
|
-
readonly presets: readonly ["logicalStrict"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "unnecessaryNonNullAssertion", undefined>;
|
|
9
|
-
export default _default;
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { getTSNodeRange, typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
3
|
-
import * as ts$1 from "typescript";
|
|
4
|
-
import * as tsutils from "ts-api-utils";
|
|
5
|
-
//#region src/rules/nonNullAssertedNullishCoalesces.ts
|
|
6
|
-
function hasNoAssignmentBeforeNode(identifier, node, sourceFile, typeChecker) {
|
|
7
|
-
const symbol = typeChecker.getSymbolAtLocation(identifier);
|
|
8
|
-
if (!symbol) return false;
|
|
9
|
-
const declarations = symbol.getDeclarations();
|
|
10
|
-
if (!declarations?.length) return false;
|
|
11
|
-
const nodeEnd = node.getEnd();
|
|
12
|
-
for (const declaration of declarations) {
|
|
13
|
-
if (declaration.getEnd() >= nodeEnd) continue;
|
|
14
|
-
if (ts$1.isVariableDeclaration(declaration)) {
|
|
15
|
-
if (declaration.exclamationToken || declaration.initializer) return false;
|
|
16
|
-
} else if (ts$1.isParameter(declaration) && declaration.initializer) return false;
|
|
17
|
-
}
|
|
18
|
-
const valueDeclaration = symbol.valueDeclaration;
|
|
19
|
-
if (!valueDeclaration) return true;
|
|
20
|
-
function findModifyingReference(current) {
|
|
21
|
-
if (ts$1.isIdentifier(current)) {
|
|
22
|
-
if (typeChecker.getSymbolAtLocation(current)?.valueDeclaration === valueDeclaration) {
|
|
23
|
-
const parent = current.parent;
|
|
24
|
-
if (ts$1.isBinaryExpression(parent) && tsutils.isAssignmentKind(parent.operatorToken.kind) && parent.left === current && parent.getEnd() < nodeEnd) return true;
|
|
25
|
-
if ((ts$1.isPostfixUnaryExpression(parent) || ts$1.isPrefixUnaryExpression(parent)) && parent.operand === current && parent.getEnd() < nodeEnd) return true;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
return ts$1.forEachChild(current, findModifyingReference) ?? false;
|
|
29
|
-
}
|
|
30
|
-
return !findModifyingReference(sourceFile);
|
|
31
|
-
}
|
|
32
|
-
var nonNullAssertedNullishCoalesces_default = ruleCreator.createRule(typescriptLanguage, {
|
|
33
|
-
about: {
|
|
34
|
-
description: "Reports non-null assertions on the left side of nullish coalescing operators.",
|
|
35
|
-
id: "nonNullAssertedNullishCoalesces",
|
|
36
|
-
presets: ["logicalStrict"]
|
|
37
|
-
},
|
|
38
|
-
messages: { unnecessaryNonNullAssertion: {
|
|
39
|
-
primary: "The nullish coalescing operator handles null and undefined, making this non-null assertion redundant.",
|
|
40
|
-
secondary: ["The `??` operator returns its right operand when the left operand is null or undefined.", "Applying `!` to assert the value is non-null defeats the purpose of using `??`."],
|
|
41
|
-
suggestions: ["Remove the non-null assertion."]
|
|
42
|
-
} },
|
|
43
|
-
setup(context) {
|
|
44
|
-
return { visitors: { NonNullExpression: (node, { sourceFile, typeChecker }) => {
|
|
45
|
-
if (node.parent.kind !== ts$1.SyntaxKind.BinaryExpression || node.parent.operatorToken.kind !== ts$1.SyntaxKind.QuestionQuestionToken || node.parent.left !== node) return;
|
|
46
|
-
if (node.expression.kind === ts$1.SyntaxKind.Identifier && hasNoAssignmentBeforeNode(node.expression, node, sourceFile, typeChecker)) return;
|
|
47
|
-
const range = getTSNodeRange(node, sourceFile);
|
|
48
|
-
context.report({
|
|
49
|
-
message: "unnecessaryNonNullAssertion",
|
|
50
|
-
range,
|
|
51
|
-
suggestions: [{
|
|
52
|
-
id: "removeNonNullAssertion",
|
|
53
|
-
range,
|
|
54
|
-
text: node.expression.getText(sourceFile)
|
|
55
|
-
}]
|
|
56
|
-
});
|
|
57
|
-
} } };
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
//#endregion
|
|
61
|
-
export { nonNullAssertedNullishCoalesces_default as default };
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Reports non-null assertions on optional chain expressions.";
|
|
3
|
-
readonly id: "nonNullAssertedOptionalChains";
|
|
4
|
-
readonly presets: readonly ["logical", "logicalStrict"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "nonNullOptionalChain", undefined>;
|
|
9
|
-
export default _default;
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { getTSNodeRange, typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
3
|
-
import * as ts$1 from "typescript";
|
|
4
|
-
//#region src/rules/nonNullAssertedOptionalChains.ts
|
|
5
|
-
function containsOptionalChain(node) {
|
|
6
|
-
let current = node;
|
|
7
|
-
let foundNonOptionalAccess = false;
|
|
8
|
-
while (true) {
|
|
9
|
-
if (ts$1.isParenthesizedExpression(current)) return !foundNonOptionalAccess && isOptionalChainRoot(current.expression);
|
|
10
|
-
if (ts$1.isNonNullExpression(current)) {
|
|
11
|
-
current = current.expression;
|
|
12
|
-
continue;
|
|
13
|
-
}
|
|
14
|
-
if (ts$1.isPropertyAccessExpression(current) || ts$1.isElementAccessExpression(current) || ts$1.isCallExpression(current)) {
|
|
15
|
-
if (current.questionDotToken) return true;
|
|
16
|
-
foundNonOptionalAccess = true;
|
|
17
|
-
current = current.expression;
|
|
18
|
-
continue;
|
|
19
|
-
}
|
|
20
|
-
return false;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
function isNonNullExpressionContinued(node) {
|
|
24
|
-
if (ts$1.isParenthesizedExpression(node.expression)) return false;
|
|
25
|
-
if (ts$1.isPropertyAccessExpression(node.parent) || ts$1.isElementAccessExpression(node.parent) || ts$1.isCallExpression(node.parent)) return node.parent.expression === node;
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
function isOptionalChainRoot(node) {
|
|
29
|
-
let current = node;
|
|
30
|
-
while (true) {
|
|
31
|
-
if (ts$1.isNonNullExpression(current) || ts$1.isParenthesizedExpression(current)) {
|
|
32
|
-
current = current.expression;
|
|
33
|
-
continue;
|
|
34
|
-
}
|
|
35
|
-
if (ts$1.isPropertyAccessExpression(current) || ts$1.isElementAccessExpression(current) || ts$1.isCallExpression(current)) return Boolean(current.questionDotToken);
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
var nonNullAssertedOptionalChains_default = ruleCreator.createRule(typescriptLanguage, {
|
|
40
|
-
about: {
|
|
41
|
-
description: "Reports non-null assertions on optional chain expressions.",
|
|
42
|
-
id: "nonNullAssertedOptionalChains",
|
|
43
|
-
presets: ["logical", "logicalStrict"]
|
|
44
|
-
},
|
|
45
|
-
messages: { nonNullOptionalChain: {
|
|
46
|
-
primary: "Non-null assertions are unsafe on optional chain expressions because they can still return undefined.",
|
|
47
|
-
secondary: ["Optional chain expressions (`?.`) return `undefined` when the left side is `null` or `undefined`.", "Applying a non-null assertion (`!`) doesn't change the runtime behavior and can mask potential bugs."],
|
|
48
|
-
suggestions: ["Remove the non-null assertion."]
|
|
49
|
-
} },
|
|
50
|
-
setup(context) {
|
|
51
|
-
return { visitors: { NonNullExpression: (node, { sourceFile }) => {
|
|
52
|
-
if (!containsOptionalChain(node.expression) || isNonNullExpressionContinued(node)) return;
|
|
53
|
-
const range = getTSNodeRange(node, sourceFile);
|
|
54
|
-
context.report({
|
|
55
|
-
message: "nonNullOptionalChain",
|
|
56
|
-
range,
|
|
57
|
-
suggestions: [{
|
|
58
|
-
id: "removeNonNullAssertion",
|
|
59
|
-
range,
|
|
60
|
-
text: node.expression.getText(sourceFile)
|
|
61
|
-
}]
|
|
62
|
-
});
|
|
63
|
-
} } };
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
//#endregion
|
|
67
|
-
export { nonNullAssertedOptionalChains_default as default };
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Reports confusing placement of non-null assertions next to comparison or assignment operators.";
|
|
3
|
-
readonly id: "nonNullAssertionPlacement";
|
|
4
|
-
readonly presets: readonly ["stylisticStrict"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "confusingAssign" | "confusingEqual" | "confusingOperator", undefined>;
|
|
9
|
-
export default _default;
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
3
|
-
import { SyntaxKind } from "typescript";
|
|
4
|
-
//#region src/rules/nonNullAssertionPlacement.ts
|
|
5
|
-
function endsWithNonNullAssertion(node, sourceFile) {
|
|
6
|
-
return node.getLastToken(sourceFile)?.kind === SyntaxKind.ExclamationToken;
|
|
7
|
-
}
|
|
8
|
-
const confusingOperatorTexts = /* @__PURE__ */ new Map([
|
|
9
|
-
[SyntaxKind.EqualsEqualsEqualsToken, "==="],
|
|
10
|
-
[SyntaxKind.EqualsEqualsToken, "=="],
|
|
11
|
-
[SyntaxKind.EqualsToken, "="],
|
|
12
|
-
[SyntaxKind.InKeyword, "in"],
|
|
13
|
-
[SyntaxKind.InstanceOfKeyword, "instanceof"]
|
|
14
|
-
]);
|
|
15
|
-
var nonNullAssertionPlacement_default = ruleCreator.createRule(typescriptLanguage, {
|
|
16
|
-
about: {
|
|
17
|
-
description: "Reports confusing placement of non-null assertions next to comparison or assignment operators.",
|
|
18
|
-
id: "nonNullAssertionPlacement",
|
|
19
|
-
presets: ["stylisticStrict"]
|
|
20
|
-
},
|
|
21
|
-
messages: {
|
|
22
|
-
confusingAssign: {
|
|
23
|
-
primary: "Non-null assertion before assignment (`a! = b`) looks similar to not-equals (`a != b`).",
|
|
24
|
-
secondary: ["This placement creates visual confusion between the assignment `=` and the not-equals operator `!=`.", "Moving the non-null assertion or wrapping the left side in parentheses makes the intent clearer."],
|
|
25
|
-
suggestions: ["Remove the non-null assertion if it's unnecessary.", "Wrap the left-hand side in parentheses to clarify intent."]
|
|
26
|
-
},
|
|
27
|
-
confusingEqual: {
|
|
28
|
-
primary: "Non-null assertion before equality test (`a! == b`) looks similar to strict not-equals (`a !== b`).",
|
|
29
|
-
secondary: ["This placement creates visual confusion between the equality operators and the not-equals operators.", "Moving the non-null assertion or wrapping the left side in parentheses makes the intent clearer."],
|
|
30
|
-
suggestions: ["Remove the non-null assertion if it's unnecessary.", "Wrap the left-hand side in parentheses to clarify intent."]
|
|
31
|
-
},
|
|
32
|
-
confusingOperator: {
|
|
33
|
-
primary: "Non-null assertion before `{{ operator }}` operator (`a! {{ operator }} b`) might be misread as `!(a {{ operator }} b)`.",
|
|
34
|
-
secondary: ["This placement creates visual confusion that could suggest the entire expression is being negated.", "Moving the non-null assertion or wrapping the left side in parentheses makes the intent clearer."],
|
|
35
|
-
suggestions: ["Remove the non-null assertion if it's unnecessary.", "Wrap the left-hand side in parentheses to clarify intent."]
|
|
36
|
-
}
|
|
37
|
-
},
|
|
38
|
-
setup(context) {
|
|
39
|
-
return { visitors: { BinaryExpression: (node, { sourceFile }) => {
|
|
40
|
-
const operatorText = confusingOperatorTexts.get(node.operatorToken.kind);
|
|
41
|
-
if (!operatorText || !endsWithNonNullAssertion(node.left, sourceFile)) return;
|
|
42
|
-
const range = {
|
|
43
|
-
begin: node.left.end - 1,
|
|
44
|
-
end: node.left.end
|
|
45
|
-
};
|
|
46
|
-
const leftText = node.left.getText(sourceFile);
|
|
47
|
-
const innerExpression = node.left.kind === SyntaxKind.NonNullExpression && node.left.expression;
|
|
48
|
-
const suggestions = [...innerExpression ? [{
|
|
49
|
-
id: "removeAssertion",
|
|
50
|
-
range: {
|
|
51
|
-
begin: node.left.getStart(sourceFile),
|
|
52
|
-
end: node.left.end
|
|
53
|
-
},
|
|
54
|
-
text: innerExpression.getText(sourceFile)
|
|
55
|
-
}] : [], {
|
|
56
|
-
id: "wrapInParentheses",
|
|
57
|
-
range: {
|
|
58
|
-
begin: node.left.getStart(sourceFile),
|
|
59
|
-
end: node.left.end
|
|
60
|
-
},
|
|
61
|
-
text: `(${leftText})`
|
|
62
|
-
}];
|
|
63
|
-
switch (node.operatorToken.kind) {
|
|
64
|
-
case SyntaxKind.EqualsToken:
|
|
65
|
-
context.report({
|
|
66
|
-
message: "confusingAssign",
|
|
67
|
-
range,
|
|
68
|
-
suggestions
|
|
69
|
-
});
|
|
70
|
-
break;
|
|
71
|
-
case SyntaxKind.InKeyword:
|
|
72
|
-
case SyntaxKind.InstanceOfKeyword:
|
|
73
|
-
context.report({
|
|
74
|
-
data: { operator: operatorText },
|
|
75
|
-
message: "confusingOperator",
|
|
76
|
-
range,
|
|
77
|
-
suggestions
|
|
78
|
-
});
|
|
79
|
-
break;
|
|
80
|
-
default:
|
|
81
|
-
context.report({
|
|
82
|
-
message: "confusingEqual",
|
|
83
|
-
range,
|
|
84
|
-
suggestions
|
|
85
|
-
});
|
|
86
|
-
break;
|
|
87
|
-
}
|
|
88
|
-
} } };
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
//#endregion
|
|
92
|
-
export { nonNullAssertionPlacement_default as default };
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Reports type assertions that can be replaced with non-null assertions.";
|
|
3
|
-
readonly id: "nonNullableTypeAssertions";
|
|
4
|
-
readonly presets: readonly ["stylistic", "stylisticStrict"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "preferNonNullAssertion", undefined>;
|
|
9
|
-
export default _default;
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { getTSNodeRange, typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
3
|
-
import ts from "typescript";
|
|
4
|
-
import * as tsutils from "ts-api-utils";
|
|
5
|
-
//#region src/rules/nonNullableTypeAssertions.ts
|
|
6
|
-
function couldBeNullish(type) {
|
|
7
|
-
if (type.flags & ts.TypeFlags.TypeParameter) {
|
|
8
|
-
const constraint = type.getConstraint();
|
|
9
|
-
return constraint === void 0 || couldBeNullish(constraint);
|
|
10
|
-
}
|
|
11
|
-
if (tsutils.isUnionType(type)) return type.types.some(couldBeNullish);
|
|
12
|
-
return (type.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined)) !== 0;
|
|
13
|
-
}
|
|
14
|
-
function getTypesIfNotLoose(node, typeChecker) {
|
|
15
|
-
const type = typeChecker.getTypeAtLocation(node);
|
|
16
|
-
if (tsutils.isTypeFlagSet(type, ts.TypeFlags.Any | ts.TypeFlags.Unknown)) return;
|
|
17
|
-
return tsutils.unionConstituents(type);
|
|
18
|
-
}
|
|
19
|
-
function isConstAssertion(node, sourceFile) {
|
|
20
|
-
return node.type.kind === ts.SyntaxKind.TypeReference && node.type.typeName.kind === ts.SyntaxKind.Identifier && node.type.typeName.getText(sourceFile) === "const";
|
|
21
|
-
}
|
|
22
|
-
function needsParentheses(expression) {
|
|
23
|
-
switch (expression.kind) {
|
|
24
|
-
case ts.SyntaxKind.ArrowFunction:
|
|
25
|
-
case ts.SyntaxKind.AwaitExpression:
|
|
26
|
-
case ts.SyntaxKind.BinaryExpression:
|
|
27
|
-
case ts.SyntaxKind.ConditionalExpression:
|
|
28
|
-
case ts.SyntaxKind.PrefixUnaryExpression:
|
|
29
|
-
case ts.SyntaxKind.YieldExpression: return true;
|
|
30
|
-
default: return false;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
function sameTypeWithoutNullish(assertedTypes, originalTypes) {
|
|
34
|
-
const nonNullishOriginalTypes = originalTypes.filter((type) => (type.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined)) === 0);
|
|
35
|
-
if (nonNullishOriginalTypes.length === originalTypes.length) return false;
|
|
36
|
-
for (const assertedType of assertedTypes) if (couldBeNullish(assertedType) || !nonNullishOriginalTypes.includes(assertedType)) return false;
|
|
37
|
-
for (const originalType of nonNullishOriginalTypes) if (!assertedTypes.includes(originalType)) return false;
|
|
38
|
-
return true;
|
|
39
|
-
}
|
|
40
|
-
var nonNullableTypeAssertions_default = ruleCreator.createRule(typescriptLanguage, {
|
|
41
|
-
about: {
|
|
42
|
-
description: "Reports type assertions that can be replaced with non-null assertions.",
|
|
43
|
-
id: "nonNullableTypeAssertions",
|
|
44
|
-
presets: ["stylistic", "stylisticStrict"]
|
|
45
|
-
},
|
|
46
|
-
messages: { preferNonNullAssertion: {
|
|
47
|
-
primary: "Use a non-null assertion (`!`) instead of an explicit type assertion.",
|
|
48
|
-
secondary: ["When the only difference between the original and asserted type is nullability, a non-null assertion is more concise.", "Non-null assertions clearly communicate that you're asserting the value is not null or undefined."],
|
|
49
|
-
suggestions: ["Replace the type assertion with a `!` assertion."]
|
|
50
|
-
} },
|
|
51
|
-
setup(context) {
|
|
52
|
-
function checkNode(node, { sourceFile, typeChecker }) {
|
|
53
|
-
if (isConstAssertion(node, sourceFile)) return;
|
|
54
|
-
const originalTypes = getTypesIfNotLoose(node.expression, typeChecker);
|
|
55
|
-
if (!originalTypes) return;
|
|
56
|
-
const assertedTypes = getTypesIfNotLoose(node.type, typeChecker);
|
|
57
|
-
if (!assertedTypes || !sameTypeWithoutNullish(assertedTypes, originalTypes)) return;
|
|
58
|
-
const expressionText = node.expression.getText(sourceFile);
|
|
59
|
-
const replacement = needsParentheses(node.expression) ? `(${expressionText})!` : `${expressionText}!`;
|
|
60
|
-
context.report({
|
|
61
|
-
fix: {
|
|
62
|
-
range: getTSNodeRange(node, sourceFile),
|
|
63
|
-
text: replacement
|
|
64
|
-
},
|
|
65
|
-
message: "preferNonNullAssertion",
|
|
66
|
-
range: getTSNodeRange(node, sourceFile)
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
return { visitors: {
|
|
70
|
-
AsExpression: checkNode,
|
|
71
|
-
TypeAssertionExpression: checkNode
|
|
72
|
-
} };
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
//#endregion
|
|
76
|
-
export { nonNullableTypeAssertions_default as default };
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Reports non-octal decimal escape sequences (\\8 and \\9) in string literals.";
|
|
3
|
-
readonly id: "nonOctalDecimalEscapes";
|
|
4
|
-
readonly presets: readonly ["logical", "logicalStrict"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "unexpectedEscape", undefined>;
|
|
9
|
-
export default _default;
|