@flint.fyi/ts 0.21.0 → 0.22.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 +22467 -0
- package/package.json +8 -7
- 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,51 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { getTSNodeRange, isGlobalVariable, typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
3
|
-
import ts from "typescript";
|
|
4
|
-
//#region src/rules/numberStaticMethods.ts
|
|
5
|
-
const globalReplacements = /* @__PURE__ */ new Map([["isFinite", "Number.isFinite"], ["isNaN", "Number.isNaN"]]);
|
|
6
|
-
function isDeclarationName(node) {
|
|
7
|
-
return ts.isFunctionDeclaration(node.parent) && node.parent.name === node || ts.isVariableDeclaration(node.parent) && node.parent.name === node || ts.isParameter(node.parent) && node.parent.name === node;
|
|
8
|
-
}
|
|
9
|
-
function isLeftHandSide(node) {
|
|
10
|
-
return node.parent.kind === ts.SyntaxKind.BinaryExpression && ts.isBinaryExpression(node.parent) && node.parent.left === node && node.parent.operatorToken.kind >= ts.SyntaxKind.FirstAssignment && node.parent.operatorToken.kind <= ts.SyntaxKind.LastAssignment;
|
|
11
|
-
}
|
|
12
|
-
function isPropertyAccessOfNode(node) {
|
|
13
|
-
return ts.isPropertyAccessExpression(node.parent) && node.parent.name === node;
|
|
14
|
-
}
|
|
15
|
-
function isPropertyShorthandOfNode(node) {
|
|
16
|
-
return ts.isShorthandPropertyAssignment(node.parent) && node.parent.name === node;
|
|
17
|
-
}
|
|
18
|
-
var numberStaticMethods_default = ruleCreator.createRule(typescriptLanguage, {
|
|
19
|
-
about: {
|
|
20
|
-
description: "Reports using legacy global functions instead of `Number` static methods.",
|
|
21
|
-
id: "numberStaticMethods",
|
|
22
|
-
presets: ["logicalStrict"]
|
|
23
|
-
},
|
|
24
|
-
messages: { preferNumberMethod: {
|
|
25
|
-
primary: "Prefer the more precise `{{ replacement }}` over the legacy global `{{ name }}`.",
|
|
26
|
-
secondary: ["`Number` static methods clearly indicate you're working with numbers.", "The global methods like `isFinite` and `isNaN` coerce their arguments, which can lead to unexpected behavior."],
|
|
27
|
-
suggestions: ["Replace `{{ name }}` with `{{ replacement }}`."]
|
|
28
|
-
} },
|
|
29
|
-
setup(context) {
|
|
30
|
-
return { visitors: { Identifier: (node, { program, sourceFile, typeChecker }) => {
|
|
31
|
-
const replacement = globalReplacements.get(node.text);
|
|
32
|
-
if (!replacement || isPropertyAccessOfNode(node) || isPropertyShorthandOfNode(node) || isDeclarationName(node) || !isGlobalVariable(node, typeChecker, program) || isLeftHandSide(node)) return;
|
|
33
|
-
const range = getTSNodeRange(node, sourceFile);
|
|
34
|
-
context.report({
|
|
35
|
-
data: {
|
|
36
|
-
name: node.text,
|
|
37
|
-
replacement
|
|
38
|
-
},
|
|
39
|
-
message: "preferNumberMethod",
|
|
40
|
-
range,
|
|
41
|
-
suggestions: [{
|
|
42
|
-
id: "replaceWithNumberMethod",
|
|
43
|
-
range,
|
|
44
|
-
text: replacement
|
|
45
|
-
}]
|
|
46
|
-
});
|
|
47
|
-
} } };
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
//#endregion
|
|
51
|
-
export { numberStaticMethods_default as default };
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Reports operations that always result in zero, such as multiplication by zero.";
|
|
3
|
-
readonly id: "numericErasingOperations";
|
|
4
|
-
readonly presets: readonly ["logicalStrict"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "erasingOperation", undefined>;
|
|
9
|
-
export default _default;
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { getStaticNumberValue, getTSNodeRange, typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
3
|
-
import ts from "typescript";
|
|
4
|
-
//#region src/rules/numericErasingOperations.ts
|
|
5
|
-
function isZeroLiteral(node) {
|
|
6
|
-
return Object.is(getStaticNumberValue(node), 0);
|
|
7
|
-
}
|
|
8
|
-
var numericErasingOperations_default = ruleCreator.createRule(typescriptLanguage, {
|
|
9
|
-
about: {
|
|
10
|
-
description: "Reports operations that always result in zero, such as multiplication by zero.",
|
|
11
|
-
id: "numericErasingOperations",
|
|
12
|
-
presets: ["logicalStrict"]
|
|
13
|
-
},
|
|
14
|
-
messages: { erasingOperation: {
|
|
15
|
-
primary: "This expression will always evaluate to zero.",
|
|
16
|
-
secondary: ["Using `0` in this operation always produces a result that is also `0`.", "This is often a sign of incompletely refactored code or incorrect program logic."],
|
|
17
|
-
suggestions: [
|
|
18
|
-
"Remove the operation",
|
|
19
|
-
"Replace with `0`",
|
|
20
|
-
"Change the operation to use a non-zero value"
|
|
21
|
-
]
|
|
22
|
-
} },
|
|
23
|
-
setup(context) {
|
|
24
|
-
return { visitors: { BinaryExpression: (node, { sourceFile }) => {
|
|
25
|
-
switch (node.operatorToken.kind) {
|
|
26
|
-
case ts.SyntaxKind.AmpersandToken:
|
|
27
|
-
case ts.SyntaxKind.AsteriskToken:
|
|
28
|
-
if (isZeroLiteral(node.left) || isZeroLiteral(node.right)) context.report({
|
|
29
|
-
message: "erasingOperation",
|
|
30
|
-
range: getTSNodeRange(node, sourceFile)
|
|
31
|
-
});
|
|
32
|
-
break;
|
|
33
|
-
case ts.SyntaxKind.SlashToken:
|
|
34
|
-
if (isZeroLiteral(node.left) && !isZeroLiteral(node.right)) context.report({
|
|
35
|
-
message: "erasingOperation",
|
|
36
|
-
range: getTSNodeRange(node, sourceFile)
|
|
37
|
-
});
|
|
38
|
-
break;
|
|
39
|
-
}
|
|
40
|
-
} } };
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
//#endregion
|
|
44
|
-
export { numericErasingOperations_default as default };
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Reports parseInt calls with binary, hexadecimal, or octal strings that can be replaced with numeric literals.";
|
|
3
|
-
readonly id: "numericLiteralParsing";
|
|
4
|
-
readonly presets: readonly ["stylistic", "stylisticStrict"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "preferLiteral", undefined>;
|
|
9
|
-
export default _default;
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { getStaticNumberValue, getStaticStringValue, getTSNodeRange, isGlobalDeclaration, typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
3
|
-
import { SyntaxKind } from "typescript";
|
|
4
|
-
import { nullThrows } from "@flint.fyi/utils";
|
|
5
|
-
//#region src/rules/numericLiteralParsing.ts
|
|
6
|
-
function convertToLiteral(value, radix) {
|
|
7
|
-
const parsed = Number.parseInt(value, radix);
|
|
8
|
-
if (Number.isNaN(parsed)) return value;
|
|
9
|
-
switch (radix) {
|
|
10
|
-
case 2: return `0b${parsed.toString(2)}`;
|
|
11
|
-
case 8: return `0o${parsed.toString(8)}`;
|
|
12
|
-
case 16: return `0x${parsed.toString(16).toUpperCase()}`;
|
|
13
|
-
default: return value;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
var numericLiteralParsing_default = ruleCreator.createRule(typescriptLanguage, {
|
|
17
|
-
about: {
|
|
18
|
-
description: "Reports parseInt calls with binary, hexadecimal, or octal strings that can be replaced with numeric literals.",
|
|
19
|
-
id: "numericLiteralParsing",
|
|
20
|
-
presets: ["stylistic", "stylisticStrict"]
|
|
21
|
-
},
|
|
22
|
-
messages: { preferLiteral: {
|
|
23
|
-
primary: "Use {{ literal }} instead of parseInt with radix {{ radix }}.",
|
|
24
|
-
secondary: ["Binary, octal, and hexadecimal numeric literals are more readable and direct than using parseInt with a radix.", "Numeric literals are supported natively and don't require function calls."],
|
|
25
|
-
suggestions: ["Replace the parseInt call with the numeric literal."]
|
|
26
|
-
} },
|
|
27
|
-
setup(context) {
|
|
28
|
-
function checkParseIntCall(node, sourceFile) {
|
|
29
|
-
if (node.arguments.length !== 2) return;
|
|
30
|
-
const stringValue = getStaticStringValue(nullThrows(node.arguments[0], "First argument is expected to be present by prior length check"));
|
|
31
|
-
if (!stringValue) return;
|
|
32
|
-
const radixValue = getStaticNumberValue(nullThrows(node.arguments[1], "Second argument is expected to be present by prior length check"));
|
|
33
|
-
if (radixValue === void 0 || ![
|
|
34
|
-
2,
|
|
35
|
-
8,
|
|
36
|
-
16
|
|
37
|
-
].includes(radixValue)) return;
|
|
38
|
-
context.report({
|
|
39
|
-
data: {
|
|
40
|
-
literal: convertToLiteral(stringValue, radixValue),
|
|
41
|
-
radix: String(radixValue)
|
|
42
|
-
},
|
|
43
|
-
message: "preferLiteral",
|
|
44
|
-
range: getTSNodeRange(node, sourceFile)
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
return { visitors: { CallExpression: (node, { program, sourceFile, typeChecker }) => {
|
|
48
|
-
if (node.expression.kind === SyntaxKind.Identifier) {
|
|
49
|
-
if (node.expression.text === "parseInt" && isGlobalDeclaration(node.expression, typeChecker, program)) checkParseIntCall(node, sourceFile);
|
|
50
|
-
} else if (node.expression.kind === SyntaxKind.PropertyAccessExpression && node.expression.expression.kind === SyntaxKind.Identifier && node.expression.expression.text === "Number" && node.expression.name.kind === SyntaxKind.Identifier && node.expression.name.text === "parseInt" && isGlobalDeclaration(node.expression.expression, typeChecker, program)) checkParseIntCall(node, sourceFile);
|
|
51
|
-
} } };
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
//#endregion
|
|
55
|
-
export { numericLiteralParsing_default as default };
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Reports numeric literals that lose precision when converted to JavaScript numbers.";
|
|
3
|
-
readonly id: "numericPrecision";
|
|
4
|
-
readonly presets: readonly ["logicalStrict"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "lossOfPrecision", undefined>;
|
|
9
|
-
export default _default;
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { getTSNodeRange, typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
3
|
-
//#region src/rules/numericPrecision.ts
|
|
4
|
-
function baseTenLosesPrecision(raw, value) {
|
|
5
|
-
const normalizedRawNumber = convertNumberToScientificNotation(raw.toLowerCase(), false);
|
|
6
|
-
const requestedPrecision = normalizedRawNumber.coefficient.length;
|
|
7
|
-
if (requestedPrecision > 100) return true;
|
|
8
|
-
const normalizedStoredNumber = convertNumberToScientificNotation(value.toPrecision(requestedPrecision), true);
|
|
9
|
-
return normalizedRawNumber.magnitude !== normalizedStoredNumber.magnitude || normalizedRawNumber.coefficient !== normalizedStoredNumber.coefficient;
|
|
10
|
-
}
|
|
11
|
-
function convertNumberToScientificNotation(stringNumber, parseAsFloat) {
|
|
12
|
-
const splitNumber = stringNumber.split("e");
|
|
13
|
-
const originalCoefficient = splitNumber[0];
|
|
14
|
-
const normalizedNumber = parseAsFloat || stringNumber.includes(".") ? normalizeFloat(originalCoefficient) : normalizeInteger(originalCoefficient);
|
|
15
|
-
if (splitNumber.length > 1) normalizedNumber.magnitude += parseInt(splitNumber[1], 10);
|
|
16
|
-
return normalizedNumber;
|
|
17
|
-
}
|
|
18
|
-
function getRaw(text) {
|
|
19
|
-
return text.replace(/_/g, "");
|
|
20
|
-
}
|
|
21
|
-
function isBaseTen(raw) {
|
|
22
|
-
return [
|
|
23
|
-
"0x",
|
|
24
|
-
"0X",
|
|
25
|
-
"0b",
|
|
26
|
-
"0B",
|
|
27
|
-
"0o",
|
|
28
|
-
"0O"
|
|
29
|
-
].every((prefix) => !raw.startsWith(prefix)) && !/^0[0-7]+$/.test(raw);
|
|
30
|
-
}
|
|
31
|
-
function losesPrecision(raw, value) {
|
|
32
|
-
if (value === 0) return false;
|
|
33
|
-
return isBaseTen(raw) ? baseTenLosesPrecision(raw, value) : notBaseTenLosesPrecision(raw, value);
|
|
34
|
-
}
|
|
35
|
-
function normalizeFloat(stringFloat) {
|
|
36
|
-
const trimmedFloat = removeLeadingZeros(stringFloat);
|
|
37
|
-
const indexOfDecimalPoint = trimmedFloat.indexOf(".");
|
|
38
|
-
switch (indexOfDecimalPoint) {
|
|
39
|
-
case -1: return {
|
|
40
|
-
coefficient: trimmedFloat,
|
|
41
|
-
magnitude: trimmedFloat.length - 1
|
|
42
|
-
};
|
|
43
|
-
case 0: {
|
|
44
|
-
const significantDigits = removeLeadingZeros(trimmedFloat.slice(1));
|
|
45
|
-
return {
|
|
46
|
-
coefficient: significantDigits,
|
|
47
|
-
magnitude: significantDigits.length - trimmedFloat.length
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
default: return {
|
|
51
|
-
coefficient: trimmedFloat.replace(".", ""),
|
|
52
|
-
magnitude: indexOfDecimalPoint - 1
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
function normalizeInteger(stringInteger) {
|
|
57
|
-
const trimmedInteger = removeLeadingZeros(stringInteger);
|
|
58
|
-
return {
|
|
59
|
-
coefficient: removeTrailingZeros(trimmedInteger),
|
|
60
|
-
magnitude: trimmedInteger.length - 1
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
function notBaseTenLosesPrecision(raw, value) {
|
|
64
|
-
const rawString = raw.toUpperCase();
|
|
65
|
-
let base;
|
|
66
|
-
if (rawString.startsWith("0B")) base = 2;
|
|
67
|
-
else if (rawString.startsWith("0X")) base = 16;
|
|
68
|
-
else base = 8;
|
|
69
|
-
return !rawString.endsWith(value.toString(base).toUpperCase());
|
|
70
|
-
}
|
|
71
|
-
function removeLeadingZeros(numberAsString) {
|
|
72
|
-
for (let i = 0; i < numberAsString.length; i++) if (numberAsString[i] !== "0") return numberAsString.slice(i);
|
|
73
|
-
return numberAsString;
|
|
74
|
-
}
|
|
75
|
-
function removeTrailingZeros(numberAsString) {
|
|
76
|
-
for (let i = numberAsString.length - 1; i >= 0; i--) if (numberAsString[i] !== "0") return numberAsString.slice(0, i + 1);
|
|
77
|
-
return numberAsString;
|
|
78
|
-
}
|
|
79
|
-
var numericPrecision_default = ruleCreator.createRule(typescriptLanguage, {
|
|
80
|
-
about: {
|
|
81
|
-
description: "Reports numeric literals that lose precision when converted to JavaScript numbers.",
|
|
82
|
-
id: "numericPrecision",
|
|
83
|
-
presets: ["logicalStrict"]
|
|
84
|
-
},
|
|
85
|
-
messages: { lossOfPrecision: {
|
|
86
|
-
primary: "This number literal will lose precision at runtime.",
|
|
87
|
-
secondary: ["JavaScript numbers are 64-bit floating-point values with limited precision.", "Numbers with more than 15-17 significant digits cannot be accurately represented."],
|
|
88
|
-
suggestions: ["If large amounts of precision are needed, switch to a `BigInt` or a different data structure.", "Remove the digits that are lost at runtime."]
|
|
89
|
-
} },
|
|
90
|
-
setup(context) {
|
|
91
|
-
return { visitors: { NumericLiteral: (node, { sourceFile }) => {
|
|
92
|
-
if (losesPrecision(getRaw(node.getText(sourceFile)), Number(node.text))) context.report({
|
|
93
|
-
message: "lossOfPrecision",
|
|
94
|
-
range: getTSNodeRange(node, sourceFile)
|
|
95
|
-
});
|
|
96
|
-
} } };
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
//#endregion
|
|
100
|
-
export { numericPrecision_default as default };
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Reports numeric literals with inconsistent separator grouping.";
|
|
3
|
-
readonly id: "numericSeparatorGroups";
|
|
4
|
-
readonly presets: readonly ["stylisticStrict"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "invalidGrouping", undefined>;
|
|
9
|
-
export default _default;
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { getTSNodeRange, typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
3
|
-
//#region src/rules/numericSeparatorGroups.ts
|
|
4
|
-
const groupLength = 3;
|
|
5
|
-
const minimumDigits = 5;
|
|
6
|
-
function addSeparator(value, fromLeft) {
|
|
7
|
-
return value.length < minimumDigits ? value : addSeparatorAlways(value, fromLeft);
|
|
8
|
-
}
|
|
9
|
-
function addSeparatorAlways(value, fromLeft) {
|
|
10
|
-
const { length } = value;
|
|
11
|
-
const parts = [];
|
|
12
|
-
if (fromLeft) for (let start = 0; start < length; start += groupLength) {
|
|
13
|
-
const end = Math.min(start + groupLength, length);
|
|
14
|
-
parts.push(value.slice(start, end));
|
|
15
|
-
}
|
|
16
|
-
else for (let end = length; end > 0; end -= groupLength) {
|
|
17
|
-
const start = Math.max(end - groupLength, 0);
|
|
18
|
-
parts.unshift(value.slice(start, end));
|
|
19
|
-
}
|
|
20
|
-
return parts.join("_");
|
|
21
|
-
}
|
|
22
|
-
function format(stripped, hasSeparators) {
|
|
23
|
-
const { mark, number, power, sign } = parseNumber(stripped);
|
|
24
|
-
return formatNumber(number, hasSeparators) + mark + sign + (hasSeparators ? addSeparatorAlways(power) : addSeparator(power));
|
|
25
|
-
}
|
|
26
|
-
function formatNumber(value, hasSeparators) {
|
|
27
|
-
const { dot, fractional, integer } = parseFloatNumber(value);
|
|
28
|
-
const [prefix, suffix] = hasSeparators ? [addSeparatorAlways(integer), addSeparatorAlways(fractional, true)] : [addSeparator(integer), addSeparator(fractional, true)];
|
|
29
|
-
return prefix + dot + suffix;
|
|
30
|
-
}
|
|
31
|
-
function parseFloatNumber(value) {
|
|
32
|
-
const dotIndex = value.indexOf(".");
|
|
33
|
-
if (dotIndex === -1) return {
|
|
34
|
-
dot: "",
|
|
35
|
-
fractional: "",
|
|
36
|
-
integer: value
|
|
37
|
-
};
|
|
38
|
-
return {
|
|
39
|
-
dot: ".",
|
|
40
|
-
fractional: value.slice(dotIndex + 1),
|
|
41
|
-
integer: value.slice(0, dotIndex)
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
function parseNumber(value) {
|
|
45
|
-
const match = /^([+-]?(?:\d+(?:\.\d+)?|\.\d+))(e)([+-]?)(\d+)$/i.exec(value);
|
|
46
|
-
if (match) return {
|
|
47
|
-
mark: match[2].toLowerCase(),
|
|
48
|
-
number: match[1],
|
|
49
|
-
power: match[4],
|
|
50
|
-
sign: match[3] ?? ""
|
|
51
|
-
};
|
|
52
|
-
return {
|
|
53
|
-
mark: "",
|
|
54
|
-
number: value,
|
|
55
|
-
power: "",
|
|
56
|
-
sign: ""
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
var numericSeparatorGroups_default = ruleCreator.createRule(typescriptLanguage, {
|
|
60
|
-
about: {
|
|
61
|
-
description: "Reports numeric literals with inconsistent separator grouping.",
|
|
62
|
-
id: "numericSeparatorGroups",
|
|
63
|
-
presets: ["stylisticStrict"]
|
|
64
|
-
},
|
|
65
|
-
messages: { invalidGrouping: {
|
|
66
|
-
primary: "Use consistent grouping with numeric separators.",
|
|
67
|
-
secondary: ["Numeric separators should group digits consistently for readability.", "Use groups of 3 for decimals, 4 for binary/octal, and 2 for hexadecimal."],
|
|
68
|
-
suggestions: ["Add `_`s to the number to make it consistent with the rest of the codebase."]
|
|
69
|
-
} },
|
|
70
|
-
setup(context) {
|
|
71
|
-
function checkNode(node, raw, number, suffix, sourceFile) {
|
|
72
|
-
if (/[a-z]/i.test(number.slice(0, 2)) || number.includes("e")) return;
|
|
73
|
-
const stripped = number.replaceAll("_", "");
|
|
74
|
-
const formatted = format(stripped, number !== stripped) + suffix;
|
|
75
|
-
if (raw === formatted) return;
|
|
76
|
-
const range = getTSNodeRange(node, sourceFile);
|
|
77
|
-
context.report({
|
|
78
|
-
fix: {
|
|
79
|
-
range,
|
|
80
|
-
text: formatted
|
|
81
|
-
},
|
|
82
|
-
message: "invalidGrouping",
|
|
83
|
-
range
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
return { visitors: {
|
|
87
|
-
BigIntLiteral: (node, { sourceFile }) => {
|
|
88
|
-
const raw = node.getText(sourceFile);
|
|
89
|
-
checkNode(node, raw, raw.slice(0, -1), "n", sourceFile);
|
|
90
|
-
},
|
|
91
|
-
NumericLiteral: (node, { sourceFile }) => {
|
|
92
|
-
const raw = node.getText(sourceFile);
|
|
93
|
-
checkNode(node, raw, raw, "", sourceFile);
|
|
94
|
-
}
|
|
95
|
-
} };
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
//#endregion
|
|
99
|
-
export { numericSeparatorGroups_default as default };
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Prefer object spread syntax over `Object.assign()` when the first argument is an object literal.";
|
|
3
|
-
readonly id: "objectAssignSpreads";
|
|
4
|
-
readonly presets: readonly ["stylistic", "stylisticStrict"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "preferObjectLiteral" | "preferObjectSpread", undefined>;
|
|
9
|
-
export default _default;
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { getTSNodeRange, isGlobalDeclarationOfName, typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
3
|
-
import { SyntaxKind } from "typescript";
|
|
4
|
-
//#region src/rules/objectAssignSpreads.ts
|
|
5
|
-
function hasAccessors(node) {
|
|
6
|
-
return node.properties.some((property) => property.kind === SyntaxKind.GetAccessor || property.kind === SyntaxKind.SetAccessor);
|
|
7
|
-
}
|
|
8
|
-
function hasArgumentsWithAccessors(node) {
|
|
9
|
-
return node.arguments.length > 1 && node.arguments.filter((argument) => argument.kind === SyntaxKind.ObjectLiteralExpression).some(hasAccessors);
|
|
10
|
-
}
|
|
11
|
-
function hasArraySpread(node) {
|
|
12
|
-
return node.arguments.some((argument) => argument.kind === SyntaxKind.SpreadElement);
|
|
13
|
-
}
|
|
14
|
-
function isObjectAssignCall(node, typeChecker, program) {
|
|
15
|
-
return node.expression.kind === SyntaxKind.PropertyAccessExpression && node.expression.name.kind === SyntaxKind.Identifier && node.expression.name.text === "assign" && node.expression.expression.kind === SyntaxKind.Identifier && isGlobalDeclarationOfName(node.expression.expression, "Object", typeChecker, program);
|
|
16
|
-
}
|
|
17
|
-
var objectAssignSpreads_default = ruleCreator.createRule(typescriptLanguage, {
|
|
18
|
-
about: {
|
|
19
|
-
description: "Prefer object spread syntax over `Object.assign()` when the first argument is an object literal.",
|
|
20
|
-
id: "objectAssignSpreads",
|
|
21
|
-
presets: ["stylistic", "stylisticStrict"]
|
|
22
|
-
},
|
|
23
|
-
messages: {
|
|
24
|
-
preferObjectLiteral: {
|
|
25
|
-
primary: "`Object.assign()` with a single object literal argument is unnecessary.",
|
|
26
|
-
secondary: ["When `Object.assign()` is called with only one object literal argument, the result is identical to using the literal directly.", "Using the object literal directly is simpler and more readable."],
|
|
27
|
-
suggestions: ["Replace `Object.assign({ prop: value })` with `{ prop: value }`."]
|
|
28
|
-
},
|
|
29
|
-
preferObjectSpread: {
|
|
30
|
-
primary: "`Object.assign()` with an object literal as the first argument can be replaced with object spread syntax.",
|
|
31
|
-
secondary: [
|
|
32
|
-
"Object spread syntax (`{ ...source }`) is more concise and readable than `Object.assign({}, source)`.",
|
|
33
|
-
"Spread syntax was introduced in ES2018 and is widely supported in modern JavaScript environments.",
|
|
34
|
-
"Using spread syntax makes object cloning and merging more idiomatic."
|
|
35
|
-
],
|
|
36
|
-
suggestions: ["Replace `Object.assign({}, source)` with `{ ...source }`.", "Replace `Object.assign({ prop: value }, source)` with `{ prop: value, ...source }`."]
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
setup(context) {
|
|
40
|
-
return { visitors: { CallExpression: (node, { program, sourceFile, typeChecker }) => {
|
|
41
|
-
if (!isObjectAssignCall(node, typeChecker, program) || node.arguments.length < 1) return;
|
|
42
|
-
if (node.arguments[0].kind !== SyntaxKind.ObjectLiteralExpression || hasArraySpread(node) || hasArgumentsWithAccessors(node)) return;
|
|
43
|
-
context.report({
|
|
44
|
-
message: node.arguments.length === 1 ? "preferObjectLiteral" : "preferObjectSpread",
|
|
45
|
-
range: getTSNodeRange(node, sourceFile)
|
|
46
|
-
});
|
|
47
|
-
} } };
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
//#endregion
|
|
51
|
-
export { objectAssignSpreads_default as default };
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Prefer `{}` object literal notation or `Object.create` instead of calling or constructing `Object`.";
|
|
3
|
-
readonly id: "objectCalls";
|
|
4
|
-
readonly presets: readonly ["stylistic", "stylisticStrict"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "preferObjectLiteral", undefined>;
|
|
9
|
-
export default _default;
|
package/lib/rules/objectCalls.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { getTSNodeRange, isGlobalDeclarationOfName, typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
3
|
-
import { SyntaxKind } from "typescript";
|
|
4
|
-
//#region src/rules/objectCalls.ts
|
|
5
|
-
var objectCalls_default = ruleCreator.createRule(typescriptLanguage, {
|
|
6
|
-
about: {
|
|
7
|
-
description: "Prefer `{}` object literal notation or `Object.create` instead of calling or constructing `Object`.",
|
|
8
|
-
id: "objectCalls",
|
|
9
|
-
presets: ["stylistic", "stylisticStrict"]
|
|
10
|
-
},
|
|
11
|
-
messages: { preferObjectLiteral: {
|
|
12
|
-
primary: "Prefer directly using `{}` instead of calling or constructing `Object`.",
|
|
13
|
-
secondary: [
|
|
14
|
-
"Calling or constructing Object with `Object()` or `new Object()` is unnecessarily verbose and less idiomatic than using object literal syntax.",
|
|
15
|
-
"`{}` object literal notation is the preferred and more concise way to create plain objects.",
|
|
16
|
-
"For creating objects without a prototype, use `Object.create(null)`."
|
|
17
|
-
],
|
|
18
|
-
suggestions: ["Replace `Object()` or `new Object()` with `{}` to create an empty object.", "Use `Object.create(null)` when you need an object without a prototype."]
|
|
19
|
-
} },
|
|
20
|
-
setup(context) {
|
|
21
|
-
function checkNode(node, { program, sourceFile, typeChecker }) {
|
|
22
|
-
if (node.expression.kind !== SyntaxKind.Identifier || !isGlobalDeclarationOfName(node.expression, "Object", typeChecker, program)) return;
|
|
23
|
-
const reportNode = node.kind === SyntaxKind.NewExpression ? node.getChildAt(0, sourceFile) : node.expression;
|
|
24
|
-
context.report({
|
|
25
|
-
message: "preferObjectLiteral",
|
|
26
|
-
range: getTSNodeRange(reportNode, sourceFile)
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
return { visitors: {
|
|
30
|
-
CallExpression: checkNode,
|
|
31
|
-
NewExpression: checkNode
|
|
32
|
-
} };
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
//#endregion
|
|
36
|
-
export { objectCalls_default as default };
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Prefer Object.fromEntries() over reduce patterns that build objects from key-value pairs.";
|
|
3
|
-
readonly id: "objectEntriesMethods";
|
|
4
|
-
readonly presets: readonly ["stylistic", "stylisticStrict"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "preferFromEntries", undefined>;
|
|
9
|
-
export default _default;
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { skipParentheses } from "./utils/skipParentheses.js";
|
|
3
|
-
import { isArrayOrTupleTypeAtLocation } from "./utils/isArrayOrTupleTypeAtLocation.js";
|
|
4
|
-
import { getTSNodeRange, isGlobalDeclarationOfName, typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
5
|
-
import { SyntaxKind } from "typescript";
|
|
6
|
-
//#region src/rules/objectEntriesMethods.ts
|
|
7
|
-
function isArrowFunctionWithParams(node) {
|
|
8
|
-
return node.kind === SyntaxKind.ArrowFunction && !!node.parameters.length;
|
|
9
|
-
}
|
|
10
|
-
function isEmptyObject(node, typeChecker, program) {
|
|
11
|
-
const unwrapped = skipParentheses(node);
|
|
12
|
-
return isEmptyObjectLiteral(unwrapped) || isObjectCreateNull(unwrapped, typeChecker, program);
|
|
13
|
-
}
|
|
14
|
-
function isEmptyObjectLiteral(node) {
|
|
15
|
-
return node.kind === SyntaxKind.ObjectLiteralExpression && !node.properties.length;
|
|
16
|
-
}
|
|
17
|
-
function isObjectAssignPattern(callback, typeChecker, program) {
|
|
18
|
-
if (callback.parameters.length < 1) return false;
|
|
19
|
-
const firstParameter = callback.parameters[0];
|
|
20
|
-
if (firstParameter.name.kind !== SyntaxKind.Identifier) return false;
|
|
21
|
-
const accumulatorName = firstParameter.name.text;
|
|
22
|
-
const body = skipParentheses(callback.body);
|
|
23
|
-
if (!isObjectMethodCall(body, "assign", typeChecker, program) || body.arguments.length !== 2 || !isGlobalDeclarationOfName(body.expression.expression, "Object", typeChecker, program)) return false;
|
|
24
|
-
const firstArg = body.arguments[0];
|
|
25
|
-
if (firstArg.kind !== SyntaxKind.Identifier || firstArg.text !== accumulatorName) return false;
|
|
26
|
-
const secondArg = body.arguments[1];
|
|
27
|
-
if (secondArg.kind !== SyntaxKind.ObjectLiteralExpression || secondArg.properties.length !== 1) return false;
|
|
28
|
-
const property = secondArg.properties[0];
|
|
29
|
-
return property.kind === SyntaxKind.PropertyAssignment && property.name.kind === SyntaxKind.ComputedPropertyName;
|
|
30
|
-
}
|
|
31
|
-
function isObjectCreateNull(node, typeChecker, program) {
|
|
32
|
-
if (!isObjectMethodCall(node, "create", typeChecker, program) || !isGlobalDeclarationOfName(node.expression.expression, "Object", typeChecker, program) || node.arguments.length !== 1) return false;
|
|
33
|
-
return node.arguments[0].kind === SyntaxKind.NullKeyword;
|
|
34
|
-
}
|
|
35
|
-
function isObjectMethodCall(node, text, typeChecker, program) {
|
|
36
|
-
return node.kind === SyntaxKind.CallExpression && node.expression.kind === SyntaxKind.PropertyAccessExpression && node.expression.name.kind === SyntaxKind.Identifier && node.expression.name.text === text && isGlobalDeclarationOfName(node.expression.expression, "Object", typeChecker, program);
|
|
37
|
-
}
|
|
38
|
-
function isReduceCallWithEmptyObject(node, typeChecker, program) {
|
|
39
|
-
if (node.expression.kind !== SyntaxKind.PropertyAccessExpression || node.expression.name.kind !== SyntaxKind.Identifier || node.expression.name.text !== "reduce" || node.questionDotToken !== void 0 || node.arguments.length !== 2) return false;
|
|
40
|
-
const initialValue = node.arguments[1];
|
|
41
|
-
return isEmptyObject(initialValue, typeChecker, program) && isArrayOrTupleTypeAtLocation(node.expression.expression, typeChecker);
|
|
42
|
-
}
|
|
43
|
-
function isSpreadAccumulatorPattern(callback) {
|
|
44
|
-
if (callback.parameters.length < 1) return false;
|
|
45
|
-
const firstParam = callback.parameters[0];
|
|
46
|
-
if (firstParam?.name.kind !== SyntaxKind.Identifier) return false;
|
|
47
|
-
const accumulatorName = firstParam.name.text;
|
|
48
|
-
const body = skipParentheses(callback.body);
|
|
49
|
-
if (body.kind !== SyntaxKind.ObjectLiteralExpression || body.properties.length !== 2) return false;
|
|
50
|
-
const firstProp = body.properties[0];
|
|
51
|
-
if (firstProp.kind !== SyntaxKind.SpreadAssignment || firstProp.expression.kind !== SyntaxKind.Identifier || firstProp.expression.text !== accumulatorName) return false;
|
|
52
|
-
const secondProp = body.properties[1];
|
|
53
|
-
return secondProp.kind === SyntaxKind.PropertyAssignment && secondProp.name.kind === SyntaxKind.ComputedPropertyName;
|
|
54
|
-
}
|
|
55
|
-
var objectEntriesMethods_default = ruleCreator.createRule(typescriptLanguage, {
|
|
56
|
-
about: {
|
|
57
|
-
description: "Prefer Object.fromEntries() over reduce patterns that build objects from key-value pairs.",
|
|
58
|
-
id: "objectEntriesMethods",
|
|
59
|
-
presets: ["stylistic", "stylisticStrict"]
|
|
60
|
-
},
|
|
61
|
-
messages: { preferFromEntries: {
|
|
62
|
-
primary: "Using reduce to build an object from key-value pairs can be replaced with Object.fromEntries().",
|
|
63
|
-
secondary: ["Object.fromEntries() is more readable and concise for converting an iterable of key-value pairs into an object.", "The reduce pattern creates unnecessary intermediate objects on each iteration."],
|
|
64
|
-
suggestions: ["Convert the array to key-value pairs with map() and use Object.fromEntries()."]
|
|
65
|
-
} },
|
|
66
|
-
setup(context) {
|
|
67
|
-
return { visitors: { CallExpression: (node, { program, sourceFile, typeChecker }) => {
|
|
68
|
-
if (!isReduceCallWithEmptyObject(node, typeChecker, program)) return;
|
|
69
|
-
const callback = node.arguments[0];
|
|
70
|
-
if (!isArrowFunctionWithParams(callback) || callback.body.kind === SyntaxKind.Block) return;
|
|
71
|
-
if (!isObjectAssignPattern(callback, typeChecker, program) && !isSpreadAccumulatorPattern(callback)) return;
|
|
72
|
-
context.report({
|
|
73
|
-
message: "preferFromEntries",
|
|
74
|
-
range: getTSNodeRange(node, sourceFile)
|
|
75
|
-
});
|
|
76
|
-
} } };
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
//#endregion
|
|
80
|
-
export { objectEntriesMethods_default as default };
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Prefer Object.hasOwn() over Object.prototype.hasOwnProperty.call() for checking own properties.";
|
|
3
|
-
readonly id: "objectHasOwns";
|
|
4
|
-
readonly presets: readonly ["stylistic", "stylisticStrict"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "preferHasOwn", undefined>;
|
|
9
|
-
export default _default;
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { getTSNodeRange, isGlobalDeclarationOfName, typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
3
|
-
import { SyntaxKind } from "typescript";
|
|
4
|
-
//#region src/rules/objectHasOwns.ts
|
|
5
|
-
var objectHasOwns_default = ruleCreator.createRule(typescriptLanguage, {
|
|
6
|
-
about: {
|
|
7
|
-
description: "Prefer Object.hasOwn() over Object.prototype.hasOwnProperty.call() for checking own properties.",
|
|
8
|
-
id: "objectHasOwns",
|
|
9
|
-
presets: ["stylistic", "stylisticStrict"]
|
|
10
|
-
},
|
|
11
|
-
messages: { preferHasOwn: {
|
|
12
|
-
primary: "`hasOwnProperty()` calls can fail on objects without `Object.prototype` or with overridden properties.",
|
|
13
|
-
secondary: [
|
|
14
|
-
"`Object.hasOwn()` is a more modern and safer way to check if an object has its own property.",
|
|
15
|
-
"It avoids issues with objects that don't inherit from `Object.prototype` or have a modified hasOwnProperty property.",
|
|
16
|
-
"`Object.hasOwn()` was introduced in ES2022 and is more concise than the hasOwnProperty alternatives."
|
|
17
|
-
],
|
|
18
|
-
suggestions: ["Use the safer, more modern `Object.hasOwn(obj, key)`.", "Use an alternative key check such as the `in` operator."]
|
|
19
|
-
} },
|
|
20
|
-
setup(context) {
|
|
21
|
-
function isObjectPrototypeHasOwnProperty(node, typeChecker, program) {
|
|
22
|
-
return node.kind === SyntaxKind.PropertyAccessExpression && node.name.kind === SyntaxKind.Identifier && node.name.text === "prototype" && node.expression.kind === SyntaxKind.Identifier && isGlobalDeclarationOfName(node.expression, "Object", typeChecker, program);
|
|
23
|
-
}
|
|
24
|
-
function isObjectLiteralHasOwnProperty(node) {
|
|
25
|
-
return node.kind === SyntaxKind.ObjectLiteralExpression && !node.properties.length;
|
|
26
|
-
}
|
|
27
|
-
function isHasOwnProperty(node, typeChecker, program) {
|
|
28
|
-
if (node.kind !== SyntaxKind.PropertyAccessExpression || node.name.kind !== SyntaxKind.Identifier || node.name.text !== "hasOwnProperty") return false;
|
|
29
|
-
return isObjectPrototypeHasOwnProperty(node.expression, typeChecker, program) || isObjectLiteralHasOwnProperty(node.expression);
|
|
30
|
-
}
|
|
31
|
-
return { visitors: { CallExpression: (node, { program, sourceFile, typeChecker }) => {
|
|
32
|
-
if (node.expression.kind !== SyntaxKind.PropertyAccessExpression || node.expression.name.kind !== SyntaxKind.Identifier) return;
|
|
33
|
-
if (node.expression.name.text === "call" && node.arguments.length >= 2 && isHasOwnProperty(node.expression.expression, typeChecker, program)) {
|
|
34
|
-
context.report({
|
|
35
|
-
message: "preferHasOwn",
|
|
36
|
-
range: getTSNodeRange(node, sourceFile)
|
|
37
|
-
});
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
if (node.expression.name.text === "hasOwnProperty" && node.arguments.length >= 1 && !isHasOwnProperty(node.expression, typeChecker, program)) context.report({
|
|
41
|
-
message: "preferHasOwn",
|
|
42
|
-
range: getTSNodeRange(node, sourceFile)
|
|
43
|
-
});
|
|
44
|
-
} } };
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
//#endregion
|
|
48
|
-
export { objectHasOwns_default as default };
|