@flint.fyi/ts 0.20.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} +360 -365
- package/dist/index.mjs +22467 -0
- package/package.json +10 -10
- package/lib/index.d.ts +0 -2
- package/lib/index.js +0 -2
- package/lib/plugin.js +0 -621
- package/lib/rules/accessorPairGroups.d.ts +0 -10
- package/lib/rules/accessorPairGroups.js +0 -48
- package/lib/rules/accessorPairTypes.d.ts +0 -10
- package/lib/rules/accessorPairTypes.js +0 -72
- package/lib/rules/accessorThisRecursion.d.ts +0 -10
- package/lib/rules/accessorThisRecursion.js +0 -65
- package/lib/rules/anyArguments.d.ts +0 -10
- package/lib/rules/anyArguments.js +0 -234
- package/lib/rules/anyAssignments.d.ts +0 -10
- package/lib/rules/anyAssignments.js +0 -265
- package/lib/rules/anyCalls.d.ts +0 -10
- package/lib/rules/anyCalls.js +0 -68
- package/lib/rules/anyMemberAccess.d.ts +0 -10
- package/lib/rules/anyMemberAccess.js +0 -85
- package/lib/rules/anyReturns.d.ts +0 -10
- package/lib/rules/anyReturns.js +0 -102
- package/lib/rules/arguments.d.ts +0 -10
- package/lib/rules/arguments.js +0 -38
- package/lib/rules/arrayCallbackReturns.d.ts +0 -10
- package/lib/rules/arrayCallbackReturns.js +0 -73
- package/lib/rules/arrayConstructors.d.ts +0 -10
- package/lib/rules/arrayConstructors.js +0 -47
- package/lib/rules/arrayDeleteUnnecessaryCounts.d.ts +0 -10
- package/lib/rules/arrayDeleteUnnecessaryCounts.js +0 -54
- package/lib/rules/arrayElementDeletions.d.ts +0 -10
- package/lib/rules/arrayElementDeletions.js +0 -43
- package/lib/rules/arrayEmptyCallbackSlots.d.ts +0 -10
- package/lib/rules/arrayEmptyCallbackSlots.js +0 -45
- package/lib/rules/arrayExistenceChecksConsistency.d.ts +0 -10
- package/lib/rules/arrayExistenceChecksConsistency.js +0 -86
- package/lib/rules/arrayFilteredFinds.d.ts +0 -10
- package/lib/rules/arrayFilteredFinds.js +0 -80
- package/lib/rules/arrayFinds.d.ts +0 -10
- package/lib/rules/arrayFinds.js +0 -41
- package/lib/rules/arrayFlatMapMethods.d.ts +0 -10
- package/lib/rules/arrayFlatMapMethods.js +0 -47
- package/lib/rules/arrayFlatMethods.d.ts +0 -10
- package/lib/rules/arrayFlatMethods.js +0 -83
- package/lib/rules/arrayFlatUnnecessaryDepths.d.ts +0 -10
- package/lib/rules/arrayFlatUnnecessaryDepths.js +0 -33
- package/lib/rules/arrayIncludes.d.ts +0 -10
- package/lib/rules/arrayIncludes.js +0 -59
- package/lib/rules/arrayIncludesMethods.d.ts +0 -10
- package/lib/rules/arrayIncludesMethods.js +0 -37
- package/lib/rules/arrayIndexOfMethods.d.ts +0 -10
- package/lib/rules/arrayIndexOfMethods.js +0 -51
- package/lib/rules/arrayLoops.d.ts +0 -10
- package/lib/rules/arrayLoops.js +0 -36
- package/lib/rules/arrayMapIdentities.d.ts +0 -10
- package/lib/rules/arrayMapIdentities.js +0 -74
- package/lib/rules/arrayMutableReverses.d.ts +0 -10
- package/lib/rules/arrayMutableReverses.js +0 -39
- package/lib/rules/arrayMutableSorts.d.ts +0 -10
- package/lib/rules/arrayMutableSorts.js +0 -72
- package/lib/rules/arrayReduceTypeArguments.d.ts +0 -10
- package/lib/rules/arrayReduceTypeArguments.js +0 -64
- package/lib/rules/arraySliceUnnecessaryEnd.d.ts +0 -10
- package/lib/rules/arraySliceUnnecessaryEnd.js +0 -51
- package/lib/rules/arraySomeMethods.d.ts +0 -10
- package/lib/rules/arraySomeMethods.js +0 -77
- package/lib/rules/arrayTernarySpreadingConsistency.d.ts +0 -10
- package/lib/rules/arrayTernarySpreadingConsistency.js +0 -74
- package/lib/rules/arrayTypes.d.ts +0 -17
- package/lib/rules/arrayTypes.js +0 -111
- package/lib/rules/arrayUnnecessaryLengthChecks.d.ts +0 -10
- package/lib/rules/arrayUnnecessaryLengthChecks.js +0 -97
- package/lib/rules/asConstAssertions.d.ts +0 -10
- package/lib/rules/asConstAssertions.js +0 -57
- package/lib/rules/assignmentOperatorShorthands.d.ts +0 -10
- package/lib/rules/assignmentOperatorShorthands.js +0 -47
- package/lib/rules/asyncFunctionAwaits.d.ts +0 -10
- package/lib/rules/asyncFunctionAwaits.js +0 -55
- package/lib/rules/asyncPromiseExecutors.d.ts +0 -10
- package/lib/rules/asyncPromiseExecutors.js +0 -41
- package/lib/rules/asyncUnnecessaryPromiseWrappers.d.ts +0 -10
- package/lib/rules/asyncUnnecessaryPromiseWrappers.js +0 -52
- package/lib/rules/atAccesses.d.ts +0 -10
- package/lib/rules/atAccesses.js +0 -52
- package/lib/rules/builtinCoercions.d.ts +0 -10
- package/lib/rules/builtinCoercions.js +0 -117
- package/lib/rules/builtinConstructorNews.d.ts +0 -10
- package/lib/rules/builtinConstructorNews.js +0 -89
- package/lib/rules/caseDeclarations.d.ts +0 -10
- package/lib/rules/caseDeclarations.js +0 -40
- package/lib/rules/caseDuplicates.d.ts +0 -10
- package/lib/rules/caseDuplicates.js +0 -36
- package/lib/rules/caseFallthroughs.d.ts +0 -10
- package/lib/rules/caseFallthroughs.js +0 -76
- package/lib/rules/catchCallbackTypes.d.ts +0 -10
- package/lib/rules/catchCallbackTypes.js +0 -67
- package/lib/rules/caughtVariableNames.d.ts +0 -10
- package/lib/rules/caughtVariableNames.js +0 -40
- package/lib/rules/chainedAssignments.d.ts +0 -10
- package/lib/rules/chainedAssignments.js +0 -33
- package/lib/rules/charAtComparisons.d.ts +0 -10
- package/lib/rules/charAtComparisons.js +0 -58
- package/lib/rules/classAssignments.d.ts +0 -10
- package/lib/rules/classAssignments.js +0 -29
- package/lib/rules/classFieldDeclarations.d.ts +0 -10
- package/lib/rules/classFieldDeclarations.js +0 -40
- package/lib/rules/classLiteralProperties.d.ts +0 -10
- package/lib/rules/classLiteralProperties.js +0 -45
- package/lib/rules/classMemberDuplicates.d.ts +0 -10
- package/lib/rules/classMemberDuplicates.js +0 -71
- package/lib/rules/classMethodsThis.d.ts +0 -14
- package/lib/rules/classMethodsThis.js +0 -124
- package/lib/rules/combinedPushes.d.ts +0 -10
- package/lib/rules/combinedPushes.js +0 -56
- package/lib/rules/consecutiveNonNullAssertions.d.ts +0 -10
- package/lib/rules/consecutiveNonNullAssertions.js +0 -39
- package/lib/rules/consoleCalls.d.ts +0 -9
- package/lib/rules/consoleCalls.js +0 -28
- package/lib/rules/constantAssignments.d.ts +0 -10
- package/lib/rules/constantAssignments.js +0 -41
- package/lib/rules/constructorGenericCalls.d.ts +0 -16
- package/lib/rules/constructorGenericCalls.js +0 -138
- package/lib/rules/constructorReturns.d.ts +0 -10
- package/lib/rules/constructorReturns.js +0 -41
- package/lib/rules/constructorSupers.d.ts +0 -10
- package/lib/rules/constructorSupers.js +0 -77
- package/lib/rules/dateConstructorClones.d.ts +0 -10
- package/lib/rules/dateConstructorClones.js +0 -37
- package/lib/rules/dateNowTimestamps.d.ts +0 -10
- package/lib/rules/dateNowTimestamps.js +0 -57
- package/lib/rules/debuggerStatements.d.ts +0 -10
- package/lib/rules/debuggerStatements.js +0 -33
- package/lib/rules/defaultCaseLast.d.ts +0 -10
- package/lib/rules/defaultCaseLast.js +0 -36
- package/lib/rules/defaultParameterLast.d.ts +0 -10
- package/lib/rules/defaultParameterLast.js +0 -42
- package/lib/rules/deprecated.d.ts +0 -10
- package/lib/rules/deprecated.js +0 -243
- package/lib/rules/destructuringConsistency.d.ts +0 -10
- package/lib/rules/destructuringConsistency.js +0 -112
- package/lib/rules/duplicateArguments.d.ts +0 -10
- package/lib/rules/duplicateArguments.js +0 -45
- package/lib/rules/dynamicDeletes.d.ts +0 -10
- package/lib/rules/dynamicDeletes.js +0 -37
- package/lib/rules/elseIfDuplicates.d.ts +0 -10
- package/lib/rules/elseIfDuplicates.js +0 -38
- package/lib/rules/elseReturns.d.ts +0 -10
- package/lib/rules/elseReturns.js +0 -67
- package/lib/rules/emptyBlocks.d.ts +0 -10
- package/lib/rules/emptyBlocks.js +0 -56
- package/lib/rules/emptyDestructures.d.ts +0 -10
- package/lib/rules/emptyDestructures.js +0 -34
- package/lib/rules/emptyEnums.d.ts +0 -10
- package/lib/rules/emptyEnums.js +0 -30
- package/lib/rules/emptyExports.d.ts +0 -10
- package/lib/rules/emptyExports.js +0 -60
- package/lib/rules/emptyFiles.d.ts +0 -10
- package/lib/rules/emptyFiles.js +0 -44
- package/lib/rules/emptyFunctions.d.ts +0 -10
- package/lib/rules/emptyFunctions.js +0 -61
- package/lib/rules/emptyModuleAttributes.d.ts +0 -10
- package/lib/rules/emptyModuleAttributes.js +0 -35
- package/lib/rules/emptyObjectTypes.d.ts +0 -10
- package/lib/rules/emptyObjectTypes.js +0 -47
- package/lib/rules/emptyStaticBlocks.d.ts +0 -10
- package/lib/rules/emptyStaticBlocks.js +0 -42
- package/lib/rules/emptyTypeParameterLists.d.ts +0 -10
- package/lib/rules/emptyTypeParameterLists.js +0 -31
- package/lib/rules/enumInitializers.d.ts +0 -10
- package/lib/rules/enumInitializers.js +0 -54
- package/lib/rules/enumMemberLiterals.d.ts +0 -10
- package/lib/rules/enumMemberLiterals.js +0 -39
- package/lib/rules/enumValueConsistency.d.ts +0 -10
- package/lib/rules/enumValueConsistency.js +0 -56
- package/lib/rules/enumValueDuplicates.d.ts +0 -10
- package/lib/rules/enumValueDuplicates.js +0 -60
- package/lib/rules/equalityOperatorNegations.d.ts +0 -9
- package/lib/rules/equalityOperatorNegations.js +0 -60
- package/lib/rules/equalityOperators.d.ts +0 -10
- package/lib/rules/equalityOperators.js +0 -44
- package/lib/rules/errorMessages.d.ts +0 -10
- package/lib/rules/errorMessages.js +0 -60
- package/lib/rules/errorSubclassProperties.d.ts +0 -10
- package/lib/rules/errorSubclassProperties.js +0 -144
- package/lib/rules/errorUnnecessaryCaptureStackTraces.d.ts +0 -10
- package/lib/rules/errorUnnecessaryCaptureStackTraces.js +0 -55
- package/lib/rules/escapeSequenceCasing.d.ts +0 -10
- package/lib/rules/escapeSequenceCasing.js +0 -75
- package/lib/rules/evals.d.ts +0 -10
- package/lib/rules/evals.js +0 -31
- package/lib/rules/evolvingVariableTypes.d.ts +0 -10
- package/lib/rules/evolvingVariableTypes.js +0 -33
- package/lib/rules/exceptionAssignments.d.ts +0 -10
- package/lib/rules/exceptionAssignments.js +0 -39
- package/lib/rules/explicitAnys.d.ts +0 -10
- package/lib/rules/explicitAnys.js +0 -55
- package/lib/rules/exponentiationOperators.d.ts +0 -10
- package/lib/rules/exponentiationOperators.js +0 -34
- package/lib/rules/exportFromImports.d.ts +0 -10
- package/lib/rules/exportFromImports.js +0 -119
- package/lib/rules/exportMutables.d.ts +0 -10
- package/lib/rules/exportMutables.js +0 -33
- package/lib/rules/exportUniqueNames.d.ts +0 -10
- package/lib/rules/exportUniqueNames.js +0 -65
- package/lib/rules/extraneousClasses.d.ts +0 -16
- package/lib/rules/extraneousClasses.js +0 -111
- package/lib/rules/fetchMethodBodies.d.ts +0 -10
- package/lib/rules/fetchMethodBodies.js +0 -72
- package/lib/rules/finallyStatementSafety.d.ts +0 -10
- package/lib/rules/finallyStatementSafety.js +0 -47
- package/lib/rules/forDirections.d.ts +0 -10
- package/lib/rules/forDirections.js +0 -75
- package/lib/rules/forInArrays.d.ts +0 -10
- package/lib/rules/forInArrays.js +0 -46
- package/lib/rules/forInGuards.d.ts +0 -9
- package/lib/rules/forInGuards.js +0 -44
- package/lib/rules/functionApplySpreads.d.ts +0 -10
- package/lib/rules/functionApplySpreads.js +0 -63
- package/lib/rules/functionAssignments.d.ts +0 -10
- package/lib/rules/functionAssignments.js +0 -29
- package/lib/rules/functionCurryingRedundancy.d.ts +0 -10
- package/lib/rules/functionCurryingRedundancy.js +0 -53
- package/lib/rules/functionDeclarationStyles.d.ts +0 -16
- package/lib/rules/functionDeclarationStyles.js +0 -67
- package/lib/rules/functionNameMatches.d.ts +0 -10
- package/lib/rules/functionNameMatches.js +0 -74
- package/lib/rules/functionNewCalls.d.ts +0 -10
- package/lib/rules/functionNewCalls.js +0 -42
- package/lib/rules/generatorFunctionYields.d.ts +0 -10
- package/lib/rules/generatorFunctionYields.js +0 -50
- package/lib/rules/getterReturns.d.ts +0 -10
- package/lib/rules/getterReturns.js +0 -65
- package/lib/rules/globalAssignments.d.ts +0 -10
- package/lib/rules/globalAssignments.js +0 -47
- package/lib/rules/globalObjectCalls.d.ts +0 -10
- package/lib/rules/globalObjectCalls.js +0 -42
- package/lib/rules/globalThisAliases.d.ts +0 -10
- package/lib/rules/globalThisAliases.js +0 -47
- package/lib/rules/impliedEvals.d.ts +0 -10
- package/lib/rules/impliedEvals.js +0 -130
- package/lib/rules/importEmptyBlocks.d.ts +0 -10
- package/lib/rules/importEmptyBlocks.js +0 -53
- package/lib/rules/importTypeSideEffects.d.ts +0 -10
- package/lib/rules/importTypeSideEffects.js +0 -31
- package/lib/rules/indexedObjectTypes.d.ts +0 -16
- package/lib/rules/indexedObjectTypes.js +0 -83
- package/lib/rules/instanceOfArrays.d.ts +0 -10
- package/lib/rules/instanceOfArrays.js +0 -31
- package/lib/rules/irregularWhitespaces.d.ts +0 -16
- package/lib/rules/irregularWhitespaces.js +0 -97
- package/lib/rules/isNaNComparisons.d.ts +0 -10
- package/lib/rules/isNaNComparisons.js +0 -43
- package/lib/rules/literalConstructorWrappers.d.ts +0 -10
- package/lib/rules/literalConstructorWrappers.js +0 -64
- package/lib/rules/mathMethods.d.ts +0 -10
- package/lib/rules/mathMethods.js +0 -128
- package/lib/rules/meaninglessVoidOperators.d.ts +0 -10
- package/lib/rules/meaninglessVoidOperators.js +0 -39
- package/lib/rules/misleadingVoidExpressions.d.ts +0 -10
- package/lib/rules/misleadingVoidExpressions.js +0 -128
- package/lib/rules/moduleSpecifierLists.d.ts +0 -10
- package/lib/rules/moduleSpecifierLists.js +0 -92
- package/lib/rules/multilineAmbiguities.d.ts +0 -10
- package/lib/rules/multilineAmbiguities.js +0 -64
- package/lib/rules/namedDefaultExports.d.ts +0 -10
- package/lib/rules/namedDefaultExports.js +0 -60
- package/lib/rules/namespaceDeclarations.d.ts +0 -14
- package/lib/rules/namespaceDeclarations.js +0 -37
- package/lib/rules/namespaceImplicitAmbientImports.d.ts +0 -10
- package/lib/rules/namespaceImplicitAmbientImports.js +0 -40
- package/lib/rules/namespaceKeywords.d.ts +0 -10
- package/lib/rules/namespaceKeywords.js +0 -40
- package/lib/rules/nativeObjectExtensions.d.ts +0 -10
- package/lib/rules/nativeObjectExtensions.js +0 -114
- package/lib/rules/negativeIndexLengthMethods.d.ts +0 -10
- package/lib/rules/negativeIndexLengthMethods.js +0 -180
- package/lib/rules/negativeZeroComparisons.d.ts +0 -10
- package/lib/rules/negativeZeroComparisons.js +0 -48
- package/lib/rules/nestedStandaloneIfs.d.ts +0 -10
- package/lib/rules/nestedStandaloneIfs.js +0 -105
- package/lib/rules/newDefinitions.d.ts +0 -10
- package/lib/rules/newDefinitions.js +0 -84
- package/lib/rules/newExpressions.d.ts +0 -10
- package/lib/rules/newExpressions.js +0 -38
- package/lib/rules/newNativeNonConstructors.d.ts +0 -10
- package/lib/rules/newNativeNonConstructors.js +0 -39
- package/lib/rules/nonNullAssertedNullishCoalesces.d.ts +0 -10
- package/lib/rules/nonNullAssertedNullishCoalesces.js +0 -63
- package/lib/rules/nonNullAssertedOptionalChains.d.ts +0 -10
- package/lib/rules/nonNullAssertedOptionalChains.js +0 -69
- package/lib/rules/nonNullAssertionPlacement.d.ts +0 -10
- package/lib/rules/nonNullAssertionPlacement.js +0 -94
- package/lib/rules/nonNullableTypeAssertions.d.ts +0 -10
- package/lib/rules/nonNullableTypeAssertions.js +0 -78
- package/lib/rules/nonOctalDecimalEscapes.d.ts +0 -10
- package/lib/rules/nonOctalDecimalEscapes.js +0 -48
- package/lib/rules/nullishCheckStyle.d.ts +0 -21
- package/lib/rules/nullishCheckStyle.js +0 -144
- package/lib/rules/nullishCoalescingOperators.d.ts +0 -22
- package/lib/rules/nullishCoalescingOperators.js +0 -323
- package/lib/rules/numberMethodRanges.d.ts +0 -10
- package/lib/rules/numberMethodRanges.js +0 -74
- package/lib/rules/numberStaticMethods.d.ts +0 -10
- package/lib/rules/numberStaticMethods.js +0 -53
- package/lib/rules/numericErasingOperations.d.ts +0 -10
- package/lib/rules/numericErasingOperations.js +0 -46
- package/lib/rules/numericLiteralParsing.d.ts +0 -10
- package/lib/rules/numericLiteralParsing.js +0 -66
- package/lib/rules/numericPrecision.d.ts +0 -10
- package/lib/rules/numericPrecision.js +0 -102
- package/lib/rules/numericSeparatorGroups.d.ts +0 -10
- package/lib/rules/numericSeparatorGroups.js +0 -101
- package/lib/rules/objectAssignSpreads.d.ts +0 -10
- package/lib/rules/objectAssignSpreads.js +0 -53
- package/lib/rules/objectCalls.d.ts +0 -10
- package/lib/rules/objectCalls.js +0 -38
- package/lib/rules/objectEntriesMethods.d.ts +0 -10
- package/lib/rules/objectEntriesMethods.js +0 -82
- package/lib/rules/objectHasOwns.d.ts +0 -10
- package/lib/rules/objectHasOwns.js +0 -50
- package/lib/rules/objectKeyDuplicates.d.ts +0 -10
- package/lib/rules/objectKeyDuplicates.js +0 -63
- package/lib/rules/objectProto.d.ts +0 -10
- package/lib/rules/objectProto.js +0 -50
- package/lib/rules/objectPrototypeBuiltIns.d.ts +0 -10
- package/lib/rules/objectPrototypeBuiltIns.js +0 -54
- package/lib/rules/objectShorthand.d.ts +0 -10
- package/lib/rules/objectShorthand.js +0 -84
- package/lib/rules/objectSpreadUnnecessaryFallbacks.d.ts +0 -10
- package/lib/rules/objectSpreadUnnecessaryFallbacks.js +0 -43
- package/lib/rules/objectTypeDefinitions.d.ts +0 -10
- package/lib/rules/objectTypeDefinitions.js +0 -34
- package/lib/rules/octalEscapes.d.ts +0 -10
- package/lib/rules/octalEscapes.js +0 -58
- package/lib/rules/octalNumbers.d.ts +0 -10
- package/lib/rules/octalNumbers.js +0 -55
- package/lib/rules/operatorAssignmentShorthand.d.ts +0 -10
- package/lib/rules/operatorAssignmentShorthand.js +0 -77
- package/lib/rules/overloadSignaturesAdjacent.d.ts +0 -10
- package/lib/rules/overloadSignaturesAdjacent.js +0 -140
- package/lib/rules/parameterReassignments.d.ts +0 -10
- package/lib/rules/parameterReassignments.js +0 -45
- package/lib/rules/parseIntRadixes.d.ts +0 -10
- package/lib/rules/parseIntRadixes.js +0 -62
- package/lib/rules/propertyAccessNotation.d.ts +0 -13
- package/lib/rules/propertyAccessNotation.js +0 -119
- package/lib/rules/recursionOnlyArguments.d.ts +0 -10
- package/lib/rules/recursionOnlyArguments.js +0 -71
- package/lib/rules/redundantTypeConstituents.d.ts +0 -10
- package/lib/rules/redundantTypeConstituents.js +0 -277
- package/lib/rules/regexAllGlobalFlags.d.ts +0 -10
- package/lib/rules/regexAllGlobalFlags.js +0 -56
- package/lib/rules/regexAmbiguousInvalidity.d.ts +0 -10
- package/lib/rules/regexAmbiguousInvalidity.js +0 -297
- package/lib/rules/regexCharacterClassRanges.d.ts +0 -10
- package/lib/rules/regexCharacterClassRanges.js +0 -137
- package/lib/rules/regexCharacterClassSetOperations.d.ts +0 -10
- package/lib/rules/regexCharacterClassSetOperations.js +0 -81
- package/lib/rules/regexCharacterClasses.d.ts +0 -10
- package/lib/rules/regexCharacterClasses.js +0 -234
- package/lib/rules/regexConciseCharacterClassNegations.d.ts +0 -10
- package/lib/rules/regexConciseCharacterClassNegations.js +0 -52
- package/lib/rules/regexContradictoryAssertions.d.ts +0 -10
- package/lib/rules/regexContradictoryAssertions.js +0 -210
- package/lib/rules/regexControlCharacterEscapes.d.ts +0 -10
- package/lib/rules/regexControlCharacterEscapes.js +0 -130
- package/lib/rules/regexControlCharacters.d.ts +0 -10
- package/lib/rules/regexControlCharacters.js +0 -95
- package/lib/rules/regexDigitMatchers.d.ts +0 -10
- package/lib/rules/regexDigitMatchers.js +0 -180
- package/lib/rules/regexDollarEscapes.d.ts +0 -10
- package/lib/rules/regexDollarEscapes.js +0 -91
- package/lib/rules/regexDuplicateCharacterClassCharacters.d.ts +0 -10
- package/lib/rules/regexDuplicateCharacterClassCharacters.js +0 -128
- package/lib/rules/regexEmptyAlternatives.d.ts +0 -10
- package/lib/rules/regexEmptyAlternatives.js +0 -140
- package/lib/rules/regexEmptyCapturingGroups.d.ts +0 -10
- package/lib/rules/regexEmptyCapturingGroups.js +0 -67
- package/lib/rules/regexEmptyCharacterClasses.d.ts +0 -10
- package/lib/rules/regexEmptyCharacterClasses.js +0 -68
- package/lib/rules/regexEmptyGroups.d.ts +0 -10
- package/lib/rules/regexEmptyGroups.js +0 -66
- package/lib/rules/regexEmptyLazyQuantifiers.d.ts +0 -10
- package/lib/rules/regexEmptyLazyQuantifiers.js +0 -92
- package/lib/rules/regexEmptyLookaroundsAssertions.d.ts +0 -10
- package/lib/rules/regexEmptyLookaroundsAssertions.js +0 -68
- package/lib/rules/regexEmptyStringLiterals.d.ts +0 -10
- package/lib/rules/regexEmptyStringLiterals.js +0 -66
- package/lib/rules/regexEscapeBackspaces.d.ts +0 -10
- package/lib/rules/regexEscapeBackspaces.js +0 -69
- package/lib/rules/regexExecutors.d.ts +0 -10
- package/lib/rules/regexExecutors.js +0 -58
- package/lib/rules/regexGraphemeStringLiterals.d.ts +0 -10
- package/lib/rules/regexGraphemeStringLiterals.js +0 -51
- package/lib/rules/regexHexadecimalEscapes.d.ts +0 -10
- package/lib/rules/regexHexadecimalEscapes.js +0 -71
- package/lib/rules/regexIgnoreCaseFlags.d.ts +0 -10
- package/lib/rules/regexIgnoreCaseFlags.js +0 -145
- package/lib/rules/regexInvisibleCharacters.d.ts +0 -10
- package/lib/rules/regexInvisibleCharacters.js +0 -90
- package/lib/rules/regexLetterCasing.d.ts +0 -10
- package/lib/rules/regexLetterCasing.js +0 -186
- package/lib/rules/regexLiterals.d.ts +0 -10
- package/lib/rules/regexLiterals.js +0 -92
- package/lib/rules/regexLookaroundAssertions.d.ts +0 -10
- package/lib/rules/regexLookaroundAssertions.js +0 -163
- package/lib/rules/regexLookaroundQuantifierOptimizations.d.ts +0 -10
- package/lib/rules/regexLookaroundQuantifierOptimizations.js +0 -94
- package/lib/rules/regexMatchNotation.d.ts +0 -10
- package/lib/rules/regexMatchNotation.js +0 -139
- package/lib/rules/regexMisleadingCapturingGroups.d.ts +0 -10
- package/lib/rules/regexMisleadingCapturingGroups.js +0 -229
- package/lib/rules/regexMisleadingQuantifiers.d.ts +0 -10
- package/lib/rules/regexMisleadingQuantifiers.js +0 -78
- package/lib/rules/regexMisleadingUnicodeCharacters.d.ts +0 -10
- package/lib/rules/regexMisleadingUnicodeCharacters.js +0 -203
- package/lib/rules/regexNamedBackreferences.d.ts +0 -10
- package/lib/rules/regexNamedBackreferences.js +0 -48
- package/lib/rules/regexNamedCaptureGroups.d.ts +0 -9
- package/lib/rules/regexNamedCaptureGroups.js +0 -67
- package/lib/rules/regexNamedReplacements.d.ts +0 -10
- package/lib/rules/regexNamedReplacements.js +0 -93
- package/lib/rules/regexNonStandardFlags.d.ts +0 -10
- package/lib/rules/regexNonStandardFlags.js +0 -66
- package/lib/rules/regexObscureRanges.d.ts +0 -10
- package/lib/rules/regexObscureRanges.js +0 -93
- package/lib/rules/regexOctalEscapes.d.ts +0 -10
- package/lib/rules/regexOctalEscapes.js +0 -70
- package/lib/rules/regexPlusQuantifiers.d.ts +0 -10
- package/lib/rules/regexPlusQuantifiers.js +0 -68
- package/lib/rules/regexPredefinedAssertions.d.ts +0 -10
- package/lib/rules/regexPredefinedAssertions.js +0 -127
- package/lib/rules/regexQuestionQuantifiers.d.ts +0 -10
- package/lib/rules/regexQuestionQuantifiers.js +0 -104
- package/lib/rules/regexRepeatQuantifiers.d.ts +0 -10
- package/lib/rules/regexRepeatQuantifiers.js +0 -96
- package/lib/rules/regexResultArrayGroups.d.ts +0 -10
- package/lib/rules/regexResultArrayGroups.js +0 -187
- package/lib/rules/regexSetOperationOptimizations.d.ts +0 -10
- package/lib/rules/regexSetOperationOptimizations.js +0 -177
- package/lib/rules/regexStandaloneBackslashes.d.ts +0 -10
- package/lib/rules/regexStandaloneBackslashes.js +0 -59
- package/lib/rules/regexStarQuantifiers.d.ts +0 -10
- package/lib/rules/regexStarQuantifiers.js +0 -68
- package/lib/rules/regexSuperLinearBacktracking.d.ts +0 -10
- package/lib/rules/regexSuperLinearBacktracking.js +0 -98
- package/lib/rules/regexSuperLinearMoves.d.ts +0 -10
- package/lib/rules/regexSuperLinearMoves.js +0 -142
- package/lib/rules/regexTestMethods.d.ts +0 -10
- package/lib/rules/regexTestMethods.js +0 -83
- package/lib/rules/regexUnicodeCodepointEscapes.d.ts +0 -10
- package/lib/rules/regexUnicodeCodepointEscapes.js +0 -107
- package/lib/rules/regexUnicodeEscapes.d.ts +0 -9
- package/lib/rules/regexUnicodeEscapes.js +0 -97
- package/lib/rules/regexUnicodeFlag.d.ts +0 -9
- package/lib/rules/regexUnicodeFlag.js +0 -97
- package/lib/rules/regexUnicodeProperties.d.ts +0 -10
- package/lib/rules/regexUnicodeProperties.js +0 -133
- package/lib/rules/regexUnnecessaryAssertions.d.ts +0 -10
- package/lib/rules/regexUnnecessaryAssertions.js +0 -223
- package/lib/rules/regexUnnecessaryBackreferences.d.ts +0 -10
- package/lib/rules/regexUnnecessaryBackreferences.js +0 -125
- package/lib/rules/regexUnnecessaryCharacterClasses.d.ts +0 -10
- package/lib/rules/regexUnnecessaryCharacterClasses.js +0 -74
- package/lib/rules/regexUnnecessaryCharacterRanges.d.ts +0 -10
- package/lib/rules/regexUnnecessaryCharacterRanges.js +0 -108
- package/lib/rules/regexUnnecessaryDisjunctions.d.ts +0 -10
- package/lib/rules/regexUnnecessaryDisjunctions.js +0 -118
- package/lib/rules/regexUnnecessaryDollarReplacements.d.ts +0 -10
- package/lib/rules/regexUnnecessaryDollarReplacements.js +0 -144
- package/lib/rules/regexUnnecessaryEscapes.d.ts +0 -10
- package/lib/rules/regexUnnecessaryEscapes.js +0 -136
- package/lib/rules/regexUnnecessaryLookaroundAssertions.d.ts +0 -10
- package/lib/rules/regexUnnecessaryLookaroundAssertions.js +0 -80
- package/lib/rules/regexUnnecessaryNestedAssertions.d.ts +0 -10
- package/lib/rules/regexUnnecessaryNestedAssertions.js +0 -198
- package/lib/rules/regexUnnecessaryNestedQuantifiers.d.ts +0 -10
- package/lib/rules/regexUnnecessaryNestedQuantifiers.js +0 -93
- package/lib/rules/regexUnnecessaryNonCapturingGroups.d.ts +0 -10
- package/lib/rules/regexUnnecessaryNonCapturingGroups.js +0 -104
- package/lib/rules/regexUnnecessaryNumericQuantifiers.d.ts +0 -10
- package/lib/rules/regexUnnecessaryNumericQuantifiers.js +0 -69
- package/lib/rules/regexUnnecessaryOptionalAssertions.d.ts +0 -10
- package/lib/rules/regexUnnecessaryOptionalAssertions.js +0 -137
- package/lib/rules/regexUnnecessaryReferentialBackreferences.d.ts +0 -10
- package/lib/rules/regexUnnecessaryReferentialBackreferences.js +0 -123
- package/lib/rules/regexUnnecessarySetOperands.d.ts +0 -10
- package/lib/rules/regexUnnecessarySetOperands.js +0 -136
- package/lib/rules/regexUnusedCapturingGroups.d.ts +0 -10
- package/lib/rules/regexUnusedCapturingGroups.js +0 -69
- package/lib/rules/regexUnusedFlags.d.ts +0 -10
- package/lib/rules/regexUnusedFlags.js +0 -116
- package/lib/rules/regexUnusedLazyQuantifiers.d.ts +0 -10
- package/lib/rules/regexUnusedLazyQuantifiers.js +0 -63
- package/lib/rules/regexUnusedQuantifiers.d.ts +0 -10
- package/lib/rules/regexUnusedQuantifiers.js +0 -63
- package/lib/rules/regexValidity.d.ts +0 -10
- package/lib/rules/regexValidity.js +0 -146
- package/lib/rules/regexWordMatchers.d.ts +0 -10
- package/lib/rules/regexWordMatchers.js +0 -146
- package/lib/rules/regexZeroQuantifiers.d.ts +0 -10
- package/lib/rules/regexZeroQuantifiers.js +0 -60
- package/lib/rules/requireImports.d.ts +0 -10
- package/lib/rules/requireImports.js +0 -48
- package/lib/rules/responseJsonMethods.d.ts +0 -10
- package/lib/rules/responseJsonMethods.js +0 -51
- package/lib/rules/restrictedIdentifiers.d.ts +0 -13
- package/lib/rules/restrictedIdentifiers.js +0 -41
- package/lib/rules/restrictedImports.d.ts +0 -27
- package/lib/rules/restrictedImports.js +0 -166
- package/lib/rules/returnAssignments.d.ts +0 -10
- package/lib/rules/returnAssignments.js +0 -38
- package/lib/rules/returnThisTypes.d.ts +0 -10
- package/lib/rules/returnThisTypes.js +0 -94
- package/lib/rules/ruleCreator.d.ts +0 -3
- package/lib/rules/ruleCreator.js +0 -17
- package/lib/rules/selfAssignments.d.ts +0 -10
- package/lib/rules/selfAssignments.js +0 -29
- package/lib/rules/sequences.d.ts +0 -10
- package/lib/rules/sequences.js +0 -28
- package/lib/rules/setSizeLengthChecks.d.ts +0 -10
- package/lib/rules/setSizeLengthChecks.js +0 -48
- package/lib/rules/setterReturns.d.ts +0 -10
- package/lib/rules/setterReturns.js +0 -41
- package/lib/rules/shadowedRestrictedNames.d.ts +0 -10
- package/lib/rules/shadowedRestrictedNames.js +0 -68
- package/lib/rules/singleVariableDeclarations.d.ts +0 -10
- package/lib/rules/singleVariableDeclarations.js +0 -36
- package/lib/rules/sizeComparisonOperators.d.ts +0 -16
- package/lib/rules/sizeComparisonOperators.js +0 -148
- package/lib/rules/sparseArrays.d.ts +0 -10
- package/lib/rules/sparseArrays.js +0 -43
- package/lib/rules/staticMemberOnlyClasses.d.ts +0 -10
- package/lib/rules/staticMemberOnlyClasses.js +0 -77
- package/lib/rules/stringCaseMismatches.d.ts +0 -10
- package/lib/rules/stringCaseMismatches.js +0 -58
- package/lib/rules/stringCodePoints.d.ts +0 -10
- package/lib/rules/stringCodePoints.js +0 -50
- package/lib/rules/stringSliceMethods.d.ts +0 -10
- package/lib/rules/stringSliceMethods.js +0 -47
- package/lib/rules/stringStartsEndsWith.d.ts +0 -10
- package/lib/rules/stringStartsEndsWith.js +0 -79
- package/lib/rules/structuredCloneMethods.d.ts +0 -10
- package/lib/rules/structuredCloneMethods.js +0 -39
- package/lib/rules/symbolDescriptions.d.ts +0 -10
- package/lib/rules/symbolDescriptions.js +0 -32
- package/lib/rules/thisAliases.d.ts +0 -10
- package/lib/rules/thisAliases.js +0 -44
- package/lib/rules/thisBeforeSuper.d.ts +0 -10
- package/lib/rules/thisBeforeSuper.js +0 -86
- package/lib/rules/throwErrors.d.ts +0 -10
- package/lib/rules/throwErrors.js +0 -61
- package/lib/rules/topLevelAwaits.d.ts +0 -10
- package/lib/rules/topLevelAwaits.js +0 -49
- package/lib/rules/tripleSlashReferenceValidity.d.ts +0 -10
- package/lib/rules/tripleSlashReferenceValidity.js +0 -54
- package/lib/rules/tripleSlashReferences.d.ts +0 -10
- package/lib/rules/tripleSlashReferences.js +0 -34
- package/lib/rules/tsComments.d.ts +0 -22
- package/lib/rules/tsComments.js +0 -130
- package/lib/rules/tslintComments.d.ts +0 -10
- package/lib/rules/tslintComments.js +0 -36
- package/lib/rules/typeAssertionStyles.d.ts +0 -10
- package/lib/rules/typeAssertionStyles.js +0 -32
- package/lib/rules/typeImports.d.ts +0 -20
- package/lib/rules/typeImports.js +0 -283
- package/lib/rules/typeofComparisons.d.ts +0 -10
- package/lib/rules/typeofComparisons.js +0 -58
- package/lib/rules/unassignedVariables.d.ts +0 -10
- package/lib/rules/unassignedVariables.js +0 -34
- package/lib/rules/undefinedTypeofChecks.d.ts +0 -10
- package/lib/rules/undefinedTypeofChecks.js +0 -41
- package/lib/rules/undefinedVariables.d.ts +0 -10
- package/lib/rules/undefinedVariables.js +0 -39
- package/lib/rules/unicodeBOMs.d.ts +0 -10
- package/lib/rules/unicodeBOMs.js +0 -39
- package/lib/rules/unnecessaryBinds.d.ts +0 -10
- package/lib/rules/unnecessaryBinds.js +0 -78
- package/lib/rules/unnecessaryBlocks.d.ts +0 -10
- package/lib/rules/unnecessaryBlocks.js +0 -60
- package/lib/rules/unnecessaryBooleanCasts.d.ts +0 -10
- package/lib/rules/unnecessaryBooleanCasts.js +0 -58
- package/lib/rules/unnecessaryCatches.d.ts +0 -10
- package/lib/rules/unnecessaryCatches.js +0 -48
- package/lib/rules/unnecessaryComparisons.d.ts +0 -10
- package/lib/rules/unnecessaryComparisons.js +0 -300
- package/lib/rules/unnecessaryConcatenation.d.ts +0 -10
- package/lib/rules/unnecessaryConcatenation.js +0 -28
- package/lib/rules/unnecessaryEscapes.d.ts +0 -10
- package/lib/rules/unnecessaryEscapes.js +0 -134
- package/lib/rules/unnecessaryMathClamps.d.ts +0 -10
- package/lib/rules/unnecessaryMathClamps.js +0 -114
- package/lib/rules/unnecessaryNumericFractions.d.ts +0 -10
- package/lib/rules/unnecessaryNumericFractions.js +0 -50
- package/lib/rules/unnecessaryRenames.d.ts +0 -10
- package/lib/rules/unnecessaryRenames.js +0 -92
- package/lib/rules/unnecessaryTernaries.d.ts +0 -10
- package/lib/rules/unnecessaryTernaries.js +0 -88
- package/lib/rules/unnecessaryUseStricts.d.ts +0 -10
- package/lib/rules/unnecessaryUseStricts.js +0 -40
- package/lib/rules/unsafeNegations.d.ts +0 -10
- package/lib/rules/unsafeNegations.js +0 -38
- package/lib/rules/utils/collectAccessorPairs.d.ts +0 -12
- package/lib/rules/utils/collectAccessorPairs.js +0 -29
- package/lib/rules/utils/countCommentsInRange.d.ts +0 -3
- package/lib/rules/utils/countCommentsInRange.js +0 -12
- package/lib/rules/utils/discriminateAnyType.d.ts +0 -16
- package/lib/rules/utils/discriminateAnyType.js +0 -38
- package/lib/rules/utils/equalityOperators.d.ts +0 -9
- package/lib/rules/utils/equalityOperators.js +0 -36
- package/lib/rules/utils/forEachReturnStatement.d.ts +0 -3
- package/lib/rules/utils/forEachReturnStatement.js +0 -29
- package/lib/rules/utils/formatReportedType.d.ts +0 -4
- package/lib/rules/utils/formatReportedType.js +0 -9
- package/lib/rules/utils/getConstrainedType.d.ts +0 -3
- package/lib/rules/utils/getConstrainedType.js +0 -9
- package/lib/rules/utils/getFunctionName.d.ts +0 -3
- package/lib/rules/utils/getFunctionName.js +0 -16
- package/lib/rules/utils/getRegExpConstruction.d.ts +0 -10
- package/lib/rules/utils/getRegExpConstruction.js +0 -26
- package/lib/rules/utils/getRegExpLiteralDetails.d.ts +0 -7
- package/lib/rules/utils/getRegExpLiteralDetails.js +0 -13
- package/lib/rules/utils/getThisExpression.d.ts +0 -3
- package/lib/rules/utils/getThisExpression.js +0 -16
- package/lib/rules/utils/isArrayOrTupleTypeAtLocation.d.ts +0 -3
- package/lib/rules/utils/isArrayOrTupleTypeAtLocation.js +0 -13
- package/lib/rules/utils/isBuiltinSymbolLike.d.ts +0 -3
- package/lib/rules/utils/isBuiltinSymbolLike.js +0 -33
- package/lib/rules/utils/isDirectEqualityCheck.d.ts +0 -4
- package/lib/rules/utils/isDirectEqualityCheck.js +0 -29
- package/lib/rules/utils/isErrorSubclass.d.ts +0 -3
- package/lib/rules/utils/isErrorSubclass.js +0 -27
- package/lib/rules/utils/isInBooleanContext.d.ts +0 -3
- package/lib/rules/utils/isInBooleanContext.js +0 -22
- package/lib/rules/utils/isTypeRecursive.d.ts +0 -3
- package/lib/rules/utils/isTypeRecursive.js +0 -8
- package/lib/rules/utils/isUnsafeAssignment.d.ts +0 -15
- package/lib/rules/utils/isUnsafeAssignment.js +0 -45
- package/lib/rules/utils/operators.d.ts +0 -5
- package/lib/rules/utils/operators.js +0 -35
- package/lib/rules/utils/parseRegexpAst.d.ts +0 -2
- package/lib/rules/utils/parseRegexpAst.js +0 -17
- package/lib/rules/utils/parseRegexpAstFull.d.ts +0 -3
- package/lib/rules/utils/parseRegexpAstFull.js +0 -18
- package/lib/rules/utils/skipParentheses.d.ts +0 -3
- package/lib/rules/utils/skipParentheses.js +0 -10
- package/lib/rules/variableDeletions.d.ts +0 -10
- package/lib/rules/variableDeletions.js +0 -35
- package/lib/rules/voidOperator.d.ts +0 -10
- package/lib/rules/voidOperator.js +0 -34
- package/lib/rules/withStatements.d.ts +0 -10
- package/lib/rules/withStatements.js +0 -30
- package/lib/rules/wrapperObjects.d.ts +0 -10
- package/lib/rules/wrapperObjects.js +0 -36
- package/lib/type-utils/getSpecifierNames.d.ts +0 -3
- package/lib/type-utils/getSpecifierNames.js +0 -9
- package/lib/type-utils/isDeclaredInModuleBlock.d.ts +0 -3
- package/lib/type-utils/isDeclaredInModuleBlock.js +0 -14
- package/lib/type-utils/isFromFile.d.ts +0 -3
- package/lib/type-utils/isFromFile.js +0 -13
- package/lib/type-utils/isFromPackage.d.ts +0 -3
- package/lib/type-utils/isFromPackage.js +0 -16
- package/lib/type-utils/matchesSpecifier.d.ts +0 -4
- package/lib/type-utils/matchesSpecifier.js +0 -20
- package/lib/type-utils/schemas.d.ts +0 -15
- package/lib/type-utils/schemas.js +0 -25
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { skipParentheses } from "./utils/skipParentheses.js";
|
|
3
|
-
import { getRegExpConstruction } from "./utils/getRegExpConstruction.js";
|
|
4
|
-
import { getRegExpLiteralDetails } from "./utils/getRegExpLiteralDetails.js";
|
|
5
|
-
import { getTSNodeRange, typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
6
|
-
import ts from "typescript";
|
|
7
|
-
import { parseRegExpLiteral, visitRegExpAST } from "@eslint-community/regexpp";
|
|
8
|
-
//#region src/rules/regexResultArrayGroups.ts
|
|
9
|
-
function extractCallExpression(expression) {
|
|
10
|
-
const unwrapped = skipParentheses(expression);
|
|
11
|
-
if (ts.isCallExpression(unwrapped)) return unwrapped;
|
|
12
|
-
if (ts.isNonNullExpression(unwrapped) || ts.isAsExpression(unwrapped) || ts.isTypeAssertionExpression(unwrapped)) return extractCallExpression(unwrapped.expression);
|
|
13
|
-
}
|
|
14
|
-
function findAssignmentsToSymbol(symbol, sourceFile, typeChecker) {
|
|
15
|
-
const assignments = [];
|
|
16
|
-
function visit(node) {
|
|
17
|
-
if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken && ts.isIdentifier(node.left)) {
|
|
18
|
-
if (typeChecker.getSymbolAtLocation(node.left) === symbol) assignments.push(node);
|
|
19
|
-
}
|
|
20
|
-
ts.forEachChild(node, visit);
|
|
21
|
-
}
|
|
22
|
-
visit(sourceFile);
|
|
23
|
-
return assignments;
|
|
24
|
-
}
|
|
25
|
-
function getNamedCapturingGroups(pattern, flags) {
|
|
26
|
-
const groups = [];
|
|
27
|
-
let ast;
|
|
28
|
-
try {
|
|
29
|
-
ast = parseRegExpLiteral(new RegExp(pattern, flags));
|
|
30
|
-
} catch {
|
|
31
|
-
return groups;
|
|
32
|
-
}
|
|
33
|
-
let index = 0;
|
|
34
|
-
visitRegExpAST(ast, { onCapturingGroupEnter(node) {
|
|
35
|
-
index++;
|
|
36
|
-
if (node.name) groups.push({
|
|
37
|
-
index,
|
|
38
|
-
name: node.name
|
|
39
|
-
});
|
|
40
|
-
} });
|
|
41
|
-
return groups;
|
|
42
|
-
}
|
|
43
|
-
function getNamedGroupsFromExpression(node, typeChecker, sourceFile) {
|
|
44
|
-
const unwrapped = skipParentheses(node);
|
|
45
|
-
if (ts.isIdentifier(unwrapped)) {
|
|
46
|
-
const symbol = typeChecker.getSymbolAtLocation(unwrapped);
|
|
47
|
-
if (symbol) return getRegexInfoFromSymbol(symbol.flags & ts.SymbolFlags.Alias ? typeChecker.getAliasedSymbol(symbol) : symbol, typeChecker, sourceFile);
|
|
48
|
-
}
|
|
49
|
-
if (ts.isCallExpression(unwrapped)) {
|
|
50
|
-
const regexInfo = getRegexFromCall(unwrapped, typeChecker, sourceFile);
|
|
51
|
-
if (regexInfo) {
|
|
52
|
-
const namedGroups = getNamedCapturingGroups(regexInfo.pattern, regexInfo.flags);
|
|
53
|
-
if (namedGroups.length) return namedGroups;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
if (ts.isNonNullExpression(unwrapped) || ts.isAsExpression(unwrapped) || ts.isTypeAssertionExpression(unwrapped)) return getNamedGroupsFromExpression(unwrapped.expression, typeChecker, sourceFile);
|
|
57
|
-
}
|
|
58
|
-
function getRegexFromCall(node, typeChecker, sourceFile) {
|
|
59
|
-
return getRegexFromExecCall(node, typeChecker, sourceFile) ?? getRegexFromMatchCall(node, typeChecker, sourceFile) ?? getRegexFromMatchAllCall(node, typeChecker, sourceFile);
|
|
60
|
-
}
|
|
61
|
-
function getRegexFromExecCall(node, typeChecker, sourceFile) {
|
|
62
|
-
if (!ts.isPropertyAccessExpression(node.expression)) return;
|
|
63
|
-
if (node.expression.name.text !== "exec" || node.arguments.length !== 1) return;
|
|
64
|
-
const regexObject = node.expression.expression;
|
|
65
|
-
return getRegexInfoFromExpression(regexObject, typeChecker, sourceFile);
|
|
66
|
-
}
|
|
67
|
-
function getRegexFromMatchAllCall(node, typeChecker, sourceFile) {
|
|
68
|
-
if (!ts.isPropertyAccessExpression(node.expression)) return;
|
|
69
|
-
if (node.expression.name.text !== "matchAll" || node.arguments.length !== 1) return;
|
|
70
|
-
if (!(typeChecker.getTypeAtLocation(node.expression.expression).flags & ts.TypeFlags.StringLike)) return;
|
|
71
|
-
const regexArg = node.arguments[0];
|
|
72
|
-
return getRegexInfoFromExpression(regexArg, typeChecker, sourceFile);
|
|
73
|
-
}
|
|
74
|
-
function getRegexFromMatchCall(node, typeChecker, sourceFile) {
|
|
75
|
-
if (!ts.isPropertyAccessExpression(node.expression) || node.expression.name.text !== "match" || node.arguments.length !== 1) return;
|
|
76
|
-
if (!(typeChecker.getTypeAtLocation(node.expression.expression).flags & ts.TypeFlags.StringLike)) return;
|
|
77
|
-
const regexArg = node.arguments[0];
|
|
78
|
-
const info = getRegexInfoFromExpression(regexArg, typeChecker, sourceFile);
|
|
79
|
-
if (info?.flags.includes("g")) return;
|
|
80
|
-
return info;
|
|
81
|
-
}
|
|
82
|
-
function getRegexInfoFromExpression(node, typeChecker, sourceFile) {
|
|
83
|
-
const unwrapped = skipParentheses(node);
|
|
84
|
-
if (ts.isRegularExpressionLiteral(unwrapped)) return getRegExpLiteralDetails(unwrapped, { sourceFile });
|
|
85
|
-
if (ts.isCallExpression(unwrapped) || ts.isNewExpression(unwrapped)) {
|
|
86
|
-
const construction = getRegExpConstruction(unwrapped, {
|
|
87
|
-
sourceFile,
|
|
88
|
-
typeChecker
|
|
89
|
-
});
|
|
90
|
-
if (construction) return {
|
|
91
|
-
flags: construction.flags,
|
|
92
|
-
pattern: construction.pattern.replace(/\\\\/g, "\\")
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
if (ts.isIdentifier(unwrapped)) {
|
|
96
|
-
const symbol = typeChecker.getSymbolAtLocation(unwrapped);
|
|
97
|
-
if (symbol) {
|
|
98
|
-
const declarations = symbol.getDeclarations();
|
|
99
|
-
if (declarations) {
|
|
100
|
-
for (const declaration of declarations) if (ts.isVariableDeclaration(declaration) && declaration.initializer) return getRegexInfoFromExpression(declaration.initializer, typeChecker, sourceFile);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
function getRegexInfoFromSymbol(symbol, typeChecker, sourceFile) {
|
|
106
|
-
const declarations = symbol.getDeclarations();
|
|
107
|
-
if (declarations) for (const declaration of declarations) {
|
|
108
|
-
if (ts.isVariableDeclaration(declaration) && declaration.initializer) {
|
|
109
|
-
const callExpression = extractCallExpression(declaration.initializer);
|
|
110
|
-
if (callExpression) {
|
|
111
|
-
const regexInfo = getRegexFromCall(callExpression, typeChecker, sourceFile);
|
|
112
|
-
if (regexInfo) {
|
|
113
|
-
const namedGroups = getNamedCapturingGroups(regexInfo.pattern, regexInfo.flags);
|
|
114
|
-
if (namedGroups.length) return namedGroups;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
if (ts.isParameter(declaration)) continue;
|
|
119
|
-
}
|
|
120
|
-
const assignments = findAssignmentsToSymbol(symbol, sourceFile, typeChecker);
|
|
121
|
-
for (const assignment of assignments) {
|
|
122
|
-
const callExpression = extractCallExpression(assignment.right);
|
|
123
|
-
if (callExpression) {
|
|
124
|
-
const regexInfo = getRegexFromCall(callExpression, typeChecker, sourceFile);
|
|
125
|
-
if (regexInfo) {
|
|
126
|
-
const namedGroups = getNamedCapturingGroups(regexInfo.pattern, regexInfo.flags);
|
|
127
|
-
if (namedGroups.length) return namedGroups;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
function isAnyType(type) {
|
|
133
|
-
return (type.flags & ts.TypeFlags.Any) !== 0;
|
|
134
|
-
}
|
|
135
|
-
function isRegExpExecArrayOrRegExpMatchArray(type, typeChecker) {
|
|
136
|
-
const symbol = type.getSymbol();
|
|
137
|
-
if (symbol) {
|
|
138
|
-
const name = symbol.getName();
|
|
139
|
-
if (name === "RegExpExecArray" || name === "RegExpMatchArray") return true;
|
|
140
|
-
}
|
|
141
|
-
if (type.isUnionOrIntersection()) return type.types.every((constituent) => isRegExpExecArrayOrRegExpMatchArray(constituent, typeChecker) || (constituent.flags & ts.TypeFlags.Null) !== 0 || (constituent.flags & ts.TypeFlags.Undefined) !== 0);
|
|
142
|
-
return false;
|
|
143
|
-
}
|
|
144
|
-
var regexResultArrayGroups_default = ruleCreator.createRule(typescriptLanguage, {
|
|
145
|
-
about: {
|
|
146
|
-
description: "Reports indexed access on regex result arrays when named capturing groups should be used.",
|
|
147
|
-
id: "regexResultArrayGroups",
|
|
148
|
-
presets: ["stylisticStrict"]
|
|
149
|
-
},
|
|
150
|
-
messages: { preferGroups: {
|
|
151
|
-
primary: "Use `.groups.{{ name }}` instead of numeric index for the named capturing group '{{ name }}'.",
|
|
152
|
-
secondary: ["When a regex has named capturing groups, accessing them by name is more readable and maintainable.", "Numeric indices are fragile and can break if the regex pattern is modified."],
|
|
153
|
-
suggestions: ["Replace the indexed access with `.groups.{{ name }}`.", "Use the named capturing group syntax for better code clarity."]
|
|
154
|
-
} },
|
|
155
|
-
setup(context) {
|
|
156
|
-
return { visitors: { ElementAccessExpression: (node, { sourceFile, typeChecker }) => {
|
|
157
|
-
const argument = skipParentheses(node.argumentExpression);
|
|
158
|
-
if (!ts.isNumericLiteral(argument)) return;
|
|
159
|
-
const index = Number(argument.text);
|
|
160
|
-
if (index <= 0 || !Number.isInteger(index)) return;
|
|
161
|
-
const object = skipParentheses(node.expression);
|
|
162
|
-
const objectType = typeChecker.getTypeAtLocation(object);
|
|
163
|
-
if (isAnyType(objectType)) return;
|
|
164
|
-
if (!isRegExpExecArrayOrRegExpMatchArray(objectType, typeChecker)) return;
|
|
165
|
-
const namedGroups = getNamedGroupsFromExpression(object, typeChecker, sourceFile);
|
|
166
|
-
if (!namedGroups) return;
|
|
167
|
-
const namedGroup = namedGroups.find((group) => group.index === index);
|
|
168
|
-
if (!namedGroup) return;
|
|
169
|
-
context.report({
|
|
170
|
-
data: { name: namedGroup.name },
|
|
171
|
-
fix: {
|
|
172
|
-
range: getTSNodeRange(node, sourceFile),
|
|
173
|
-
text: `${object.getText(sourceFile)}${node.questionDotToken ? "?" : ""}.groups.${namedGroup.name}`
|
|
174
|
-
},
|
|
175
|
-
message: "preferGroups",
|
|
176
|
-
range: {
|
|
177
|
-
begin: node.argumentExpression.getStart(sourceFile),
|
|
178
|
-
end: node.getEnd()
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
} } };
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
//#endregion
|
|
185
|
-
export { regexResultArrayGroups_default as default };
|
|
186
|
-
|
|
187
|
-
//# sourceMappingURL=regexResultArrayGroups.js.map
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Reports set operations in regular expressions that can be simplified.";
|
|
3
|
-
readonly id: "regexSetOperationOptimizations";
|
|
4
|
-
readonly presets: readonly ["logical", "logicalStrict"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "toIntersection" | "toNegationOfConjunction" | "toNegationOfDisjunction" | "toSubtraction", undefined>;
|
|
9
|
-
export default _default;
|
|
10
|
-
//# sourceMappingURL=regexSetOperationOptimizations.d.ts.map
|
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { getRegExpLiteralDetails } from "./utils/getRegExpLiteralDetails.js";
|
|
3
|
-
import { getTSNodeRange, typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
4
|
-
import { RegExpParser, visitRegExpAST } from "@eslint-community/regexpp";
|
|
5
|
-
import { toUnicodeSet } from "regexp-ast-analysis";
|
|
6
|
-
//#region src/rules/regexSetOperationOptimizations.ts
|
|
7
|
-
function collectIntersectionOperands(expression) {
|
|
8
|
-
const operands = [];
|
|
9
|
-
let operand = expression;
|
|
10
|
-
while (operand.type === "ClassIntersection") {
|
|
11
|
-
operands.push(operand.right);
|
|
12
|
-
operand = operand.left;
|
|
13
|
-
}
|
|
14
|
-
return [operand, ...operands.toReversed()];
|
|
15
|
-
}
|
|
16
|
-
function getParsedElement(pattern, unicodeSets) {
|
|
17
|
-
try {
|
|
18
|
-
const ast = new RegExpParser().parsePattern(pattern, void 0, void 0, {
|
|
19
|
-
unicode: false,
|
|
20
|
-
unicodeSets
|
|
21
|
-
});
|
|
22
|
-
if (ast.alternatives.length !== 1) return;
|
|
23
|
-
const alt = ast.alternatives[0];
|
|
24
|
-
if (alt.elements.length !== 1) return;
|
|
25
|
-
const element = alt.elements[0];
|
|
26
|
-
if (element.type === "Assertion" || element.type === "Quantifier" || element.type === "CapturingGroup" || element.type === "Group" || element.type === "Backreference") return;
|
|
27
|
-
return element;
|
|
28
|
-
} catch {
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
function getRawTextToNot(negatedNode) {
|
|
33
|
-
if (negatedNode.type === "CharacterClass" || negatedNode.type === "ExpressionCharacterClass") return `${negatedNode.raw[0]}${negatedNode.raw.slice(2)}`;
|
|
34
|
-
const escapeChar = negatedNode.raw[1]?.toLowerCase();
|
|
35
|
-
if (!escapeChar) return negatedNode.raw;
|
|
36
|
-
return `${negatedNode.raw[0]}${escapeChar}${negatedNode.raw.slice(2)}`;
|
|
37
|
-
}
|
|
38
|
-
function hasNegate(node) {
|
|
39
|
-
return node.type === "CharacterClass" || node.type === "ExpressionCharacterClass" || node.type === "CharacterSet" && (node.kind !== "property" || !node.strings);
|
|
40
|
-
}
|
|
41
|
-
function isFixedPatternEquivalent(targetNode, fixedText, unicodeSets) {
|
|
42
|
-
const flags = {
|
|
43
|
-
unicode: false,
|
|
44
|
-
unicodeSets
|
|
45
|
-
};
|
|
46
|
-
const originalUs = toUnicodeSet(targetNode, flags);
|
|
47
|
-
const convertedElement = getParsedElement(fixedText, unicodeSets);
|
|
48
|
-
if (!convertedElement) return false;
|
|
49
|
-
const convertedUs = toUnicodeSet(convertedElement, flags);
|
|
50
|
-
return originalUs.equals(convertedUs);
|
|
51
|
-
}
|
|
52
|
-
function isNegated(node) {
|
|
53
|
-
return hasNegate(node) && node.negate;
|
|
54
|
-
}
|
|
55
|
-
var regexSetOperationOptimizations_default = ruleCreator.createRule(typescriptLanguage, {
|
|
56
|
-
about: {
|
|
57
|
-
description: "Reports set operations in regular expressions that can be simplified.",
|
|
58
|
-
id: "regexSetOperationOptimizations",
|
|
59
|
-
presets: ["logical", "logicalStrict"]
|
|
60
|
-
},
|
|
61
|
-
messages: {
|
|
62
|
-
toIntersection: {
|
|
63
|
-
primary: "This subtraction can be simplified to an intersection.",
|
|
64
|
-
secondary: ["Subtracting a negated set is equivalent to intersecting with the positive set.", "This simplification allows for a more clear and readable regular expression."],
|
|
65
|
-
suggestions: ["Convert the subtraction to an intersection."]
|
|
66
|
-
},
|
|
67
|
-
toNegationOfConjunction: {
|
|
68
|
-
primary: "This character class can be simplified to a negated conjunction.",
|
|
69
|
-
secondary: ["A union of negated sets is equivalent to the negation of their intersection.", "This simplification allows for a more clear and readable regular expression."],
|
|
70
|
-
suggestions: ["Convert to a negated conjunction."]
|
|
71
|
-
},
|
|
72
|
-
toNegationOfDisjunction: {
|
|
73
|
-
primary: "This {{ target }} can be simplified to a negated disjunction.",
|
|
74
|
-
secondary: ["An intersection of negated sets is equivalent to the negation of their union.", "This simplification allows for a more clear and readable regular expression."],
|
|
75
|
-
suggestions: ["Convert to a negated disjunction."]
|
|
76
|
-
},
|
|
77
|
-
toSubtraction: {
|
|
78
|
-
primary: "This intersection can be simplified to a subtraction.",
|
|
79
|
-
secondary: ["Intersecting with a negated set is equivalent to subtracting the positive set.", "This simplification allows for a more clear and readable regular expression."],
|
|
80
|
-
suggestions: ["Convert the intersection to a subtraction."]
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
setup(context) {
|
|
84
|
-
return { visitors: { RegularExpressionLiteral: (node, { sourceFile }) => {
|
|
85
|
-
const details = getRegExpLiteralDetails(node, { sourceFile });
|
|
86
|
-
if (!details.flags.includes("v")) return;
|
|
87
|
-
let regexpAst;
|
|
88
|
-
try {
|
|
89
|
-
regexpAst = new RegExpParser().parsePattern(details.pattern, void 0, void 0, {
|
|
90
|
-
unicode: false,
|
|
91
|
-
unicodeSets: true
|
|
92
|
-
});
|
|
93
|
-
} catch {
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
const nodeRange = getTSNodeRange(node, sourceFile);
|
|
97
|
-
function reportWithFix(targetNode, messageId, fixedText, data) {
|
|
98
|
-
if (!details.pattern) return false;
|
|
99
|
-
if (!isFixedPatternEquivalent(targetNode, fixedText, true)) return false;
|
|
100
|
-
const newPattern = details.pattern.slice(0, targetNode.start) + fixedText + details.pattern.slice(targetNode.end);
|
|
101
|
-
context.report({
|
|
102
|
-
data,
|
|
103
|
-
fix: {
|
|
104
|
-
range: nodeRange,
|
|
105
|
-
text: `/${newPattern}/${details.flags}`
|
|
106
|
-
},
|
|
107
|
-
message: messageId,
|
|
108
|
-
range: nodeRange
|
|
109
|
-
});
|
|
110
|
-
return true;
|
|
111
|
-
}
|
|
112
|
-
function toNegationOfDisjunction(classNode) {
|
|
113
|
-
if (classNode.expression.type !== "ClassIntersection") return false;
|
|
114
|
-
const operands = collectIntersectionOperands(classNode.expression);
|
|
115
|
-
const negatedOperands = [];
|
|
116
|
-
const others = [];
|
|
117
|
-
for (const operand of operands) if (isNegated(operand)) negatedOperands.push(operand);
|
|
118
|
-
else others.push(operand);
|
|
119
|
-
if (negatedOperands.length < 2) return false;
|
|
120
|
-
const fixedOperands = negatedOperands.map((negatedOperand) => getRawTextToNot(negatedOperand)).join("");
|
|
121
|
-
if (negatedOperands.length === operands.length) return reportWithFix(classNode, "toNegationOfDisjunction", `[${classNode.negate ? "" : "^"}${fixedOperands}]`, { target: "character class" });
|
|
122
|
-
const operandTextList = [`[^${fixedOperands}]`, ...others.map((operand) => operand.raw)];
|
|
123
|
-
return reportWithFix(classNode, "toNegationOfDisjunction", `[${classNode.negate ? "^" : ""}${operandTextList.join("&&")}]`, { target: "expression" });
|
|
124
|
-
}
|
|
125
|
-
function toNegationOfConjunction(ccNode) {
|
|
126
|
-
if (ccNode.elements.length <= 1) return false;
|
|
127
|
-
const elements = ccNode.elements;
|
|
128
|
-
const negatedElements = elements.filter(isNegated);
|
|
129
|
-
if (negatedElements.length !== elements.length) return false;
|
|
130
|
-
const fixedElements = negatedElements.map((negatedElement) => getRawTextToNot(negatedElement));
|
|
131
|
-
return reportWithFix(ccNode, "toNegationOfConjunction", `[${ccNode.negate ? "" : "^"}${fixedElements.join("&&")}]`);
|
|
132
|
-
}
|
|
133
|
-
function toSubtraction(classNode) {
|
|
134
|
-
const expression = classNode.expression;
|
|
135
|
-
if (expression.type !== "ClassIntersection") return false;
|
|
136
|
-
const operands = collectIntersectionOperands(expression);
|
|
137
|
-
const negatedOperand = operands.find(isNegated);
|
|
138
|
-
if (!negatedOperand) return false;
|
|
139
|
-
const others = operands.filter((operand) => operand !== negatedOperand);
|
|
140
|
-
let fixedLeftText = others.map((operand) => operand.raw).join("&&");
|
|
141
|
-
if (others.length >= 2) fixedLeftText = `[${fixedLeftText}]`;
|
|
142
|
-
const fixedRightText = getRawTextToNot(negatedOperand);
|
|
143
|
-
return reportWithFix(classNode, "toSubtraction", `[${classNode.negate ? "^" : ""}${fixedLeftText}--${fixedRightText}]`);
|
|
144
|
-
}
|
|
145
|
-
function toIntersection(expression, expressionRight, eccNode) {
|
|
146
|
-
if (expression.type !== "ClassSubtraction") return false;
|
|
147
|
-
const { left, right } = expression;
|
|
148
|
-
if (!isNegated(right)) return false;
|
|
149
|
-
let fixedText = `${left.type === "ClassSubtraction" ? `[${left.raw}]` : left.raw}&&${getRawTextToNot(right)}`;
|
|
150
|
-
if (expressionRight) fixedText = `[${fixedText}]`;
|
|
151
|
-
const targetRaw = eccNode.raw;
|
|
152
|
-
return reportWithFix(eccNode, "toIntersection", targetRaw.slice(0, expression.start - eccNode.start) + fixedText + targetRaw.slice(expression.end - eccNode.start));
|
|
153
|
-
}
|
|
154
|
-
function verifyExpressions(eccNode) {
|
|
155
|
-
let operand = eccNode.expression;
|
|
156
|
-
let right = null;
|
|
157
|
-
while (operand.type === "ClassIntersection" || operand.type === "ClassSubtraction") {
|
|
158
|
-
toIntersection(operand, right, eccNode);
|
|
159
|
-
right = operand.right;
|
|
160
|
-
operand = operand.left;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
visitRegExpAST(regexpAst, {
|
|
164
|
-
onCharacterClassEnter(ccNode) {
|
|
165
|
-
toNegationOfConjunction(ccNode);
|
|
166
|
-
},
|
|
167
|
-
onExpressionCharacterClassEnter(eccNode) {
|
|
168
|
-
if (!toNegationOfDisjunction(eccNode) && !toSubtraction(eccNode)) verifyExpressions(eccNode);
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
} } };
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
//#endregion
|
|
175
|
-
export { regexSetOperationOptimizations_default as default };
|
|
176
|
-
|
|
177
|
-
//# sourceMappingURL=regexSetOperationOptimizations.js.map
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Reports standalone backslashes in regex patterns that look like incomplete escape sequences.";
|
|
3
|
-
readonly id: "regexStandaloneBackslashes";
|
|
4
|
-
readonly presets: readonly ["logical", "logicalStrict"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "standaloneBackslash", undefined>;
|
|
9
|
-
export default _default;
|
|
10
|
-
//# sourceMappingURL=regexStandaloneBackslashes.d.ts.map
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { parseRegexpAst } from "./utils/parseRegexpAst.js";
|
|
3
|
-
import { getRegExpConstruction } from "./utils/getRegExpConstruction.js";
|
|
4
|
-
import { getRegExpLiteralDetails } from "./utils/getRegExpLiteralDetails.js";
|
|
5
|
-
import { typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
6
|
-
import { visitRegExpAST } from "@eslint-community/regexpp";
|
|
7
|
-
//#region src/rules/regexStandaloneBackslashes.ts
|
|
8
|
-
const codepointBackslash = 92;
|
|
9
|
-
var regexStandaloneBackslashes_default = ruleCreator.createRule(typescriptLanguage, {
|
|
10
|
-
about: {
|
|
11
|
-
description: "Reports standalone backslashes in regex patterns that look like incomplete escape sequences.",
|
|
12
|
-
id: "regexStandaloneBackslashes",
|
|
13
|
-
presets: ["logical", "logicalStrict"]
|
|
14
|
-
},
|
|
15
|
-
messages: { standaloneBackslash: {
|
|
16
|
-
primary: "This standalone backslash (`\\`) looks like an incomplete escape sequence.",
|
|
17
|
-
secondary: ["This backslash is interpreted as a literal `\\` character because the following character doesn't form a valid escape sequence.", "This commonly happens with incomplete control escapes like `\\c` or `\\c1`."],
|
|
18
|
-
suggestions: ["Use a valid escape sequence or escape the backslash with `\\\\`."]
|
|
19
|
-
} },
|
|
20
|
-
setup(context) {
|
|
21
|
-
function findStandaloneBackslashes(pattern, flags) {
|
|
22
|
-
const results = [];
|
|
23
|
-
const regexpAst = parseRegexpAst(pattern, flags);
|
|
24
|
-
if (!regexpAst) return results;
|
|
25
|
-
visitRegExpAST(regexpAst, { onCharacterEnter(charNode) {
|
|
26
|
-
if (charNode.value === codepointBackslash && charNode.raw === "\\") results.push(charNode);
|
|
27
|
-
} });
|
|
28
|
-
return results;
|
|
29
|
-
}
|
|
30
|
-
function checkPattern(pattern, patternStart, flags) {
|
|
31
|
-
const backslashes = findStandaloneBackslashes(pattern, flags);
|
|
32
|
-
for (const backslash of backslashes) context.report({
|
|
33
|
-
message: "standaloneBackslash",
|
|
34
|
-
range: {
|
|
35
|
-
begin: patternStart + backslash.start,
|
|
36
|
-
end: patternStart + backslash.end
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
function checkRegexLiteral(node, services) {
|
|
41
|
-
const details = getRegExpLiteralDetails(node, services);
|
|
42
|
-
checkPattern(details.pattern, details.start, details.flags);
|
|
43
|
-
}
|
|
44
|
-
function checkRegExpConstructor(node, services) {
|
|
45
|
-
const construction = getRegExpConstruction(node, services);
|
|
46
|
-
if (!construction) return;
|
|
47
|
-
checkPattern(construction.pattern.replace(/\\\\/g, "\\"), construction.start + 1, construction.flags);
|
|
48
|
-
}
|
|
49
|
-
return { visitors: {
|
|
50
|
-
CallExpression: checkRegExpConstructor,
|
|
51
|
-
NewExpression: checkRegExpConstructor,
|
|
52
|
-
RegularExpressionLiteral: checkRegexLiteral
|
|
53
|
-
} };
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
//#endregion
|
|
57
|
-
export { regexStandaloneBackslashes_default as default };
|
|
58
|
-
|
|
59
|
-
//# sourceMappingURL=regexStandaloneBackslashes.js.map
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Reports quantifiers `{0,}` in regular expressions that should use `*` instead.";
|
|
3
|
-
readonly id: "regexStarQuantifiers";
|
|
4
|
-
readonly presets: readonly ["stylisticStrict"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "preferStar", undefined>;
|
|
9
|
-
export default _default;
|
|
10
|
-
//# sourceMappingURL=regexStarQuantifiers.d.ts.map
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { parseRegexpAst } from "./utils/parseRegexpAst.js";
|
|
3
|
-
import { getRegExpConstruction } from "./utils/getRegExpConstruction.js";
|
|
4
|
-
import { getRegExpLiteralDetails } from "./utils/getRegExpLiteralDetails.js";
|
|
5
|
-
import { typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
6
|
-
import { visitRegExpAST } from "@eslint-community/regexpp";
|
|
7
|
-
//#region src/rules/regexStarQuantifiers.ts
|
|
8
|
-
function getQuantifierOffsets(quantifier) {
|
|
9
|
-
return [quantifier.element.end - quantifier.start, quantifier.greedy ? quantifier.end - quantifier.start : quantifier.end - quantifier.start - 1];
|
|
10
|
-
}
|
|
11
|
-
var regexStarQuantifiers_default = ruleCreator.createRule(typescriptLanguage, {
|
|
12
|
-
about: {
|
|
13
|
-
description: "Reports quantifiers `{0,}` in regular expressions that should use `*` instead.",
|
|
14
|
-
id: "regexStarQuantifiers",
|
|
15
|
-
presets: ["stylisticStrict"]
|
|
16
|
-
},
|
|
17
|
-
messages: { preferStar: {
|
|
18
|
-
primary: "Prefer the more succinct '*' quantifier instead of '{{ quantifier }}'.",
|
|
19
|
-
secondary: ["The `*` quantifier is a more concise way to express matching zero or more of the preceding element."],
|
|
20
|
-
suggestions: ["Replace '{{ quantifier }}' with '*'."]
|
|
21
|
-
} },
|
|
22
|
-
setup(context) {
|
|
23
|
-
function checkPattern(pattern, patternStart, flags, isStringPattern) {
|
|
24
|
-
const regexpAst = parseRegexpAst(pattern, flags);
|
|
25
|
-
if (!regexpAst) return;
|
|
26
|
-
visitRegExpAST(regexpAst, { onQuantifierEnter(quantifier) {
|
|
27
|
-
if (quantifier.min !== 0 || quantifier.max !== Infinity) return;
|
|
28
|
-
const [startOffset, endOffset] = getQuantifierOffsets(quantifier);
|
|
29
|
-
const quantifierText = quantifier.raw.slice(startOffset, endOffset);
|
|
30
|
-
if (quantifierText === "*") return;
|
|
31
|
-
const replacement = quantifier.greedy ? "*" : "*?";
|
|
32
|
-
context.report({
|
|
33
|
-
data: { quantifier: quantifierText },
|
|
34
|
-
fix: {
|
|
35
|
-
range: {
|
|
36
|
-
begin: patternStart + quantifier.start + startOffset,
|
|
37
|
-
end: patternStart + quantifier.start + (isStringPattern ? endOffset : quantifier.raw.length)
|
|
38
|
-
},
|
|
39
|
-
text: replacement
|
|
40
|
-
},
|
|
41
|
-
message: "preferStar",
|
|
42
|
-
range: {
|
|
43
|
-
begin: patternStart + quantifier.start + startOffset,
|
|
44
|
-
end: patternStart + quantifier.start + endOffset
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
} });
|
|
48
|
-
}
|
|
49
|
-
function checkRegexLiteral(node, services) {
|
|
50
|
-
const details = getRegExpLiteralDetails(node, services);
|
|
51
|
-
checkPattern(details.pattern, details.start, details.flags, false);
|
|
52
|
-
}
|
|
53
|
-
function checkRegExpConstructor(node, services) {
|
|
54
|
-
const construction = getRegExpConstruction(node, services);
|
|
55
|
-
if (!construction) return;
|
|
56
|
-
checkPattern(construction.raw, construction.start + 1, construction.flags, true);
|
|
57
|
-
}
|
|
58
|
-
return { visitors: {
|
|
59
|
-
CallExpression: checkRegExpConstructor,
|
|
60
|
-
NewExpression: checkRegExpConstructor,
|
|
61
|
-
RegularExpressionLiteral: checkRegexLiteral
|
|
62
|
-
} };
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
//#endregion
|
|
66
|
-
export { regexStarQuantifiers_default as default };
|
|
67
|
-
|
|
68
|
-
//# sourceMappingURL=regexStarQuantifiers.js.map
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Reports regular expressions with exponential or polynomial backtracking.";
|
|
3
|
-
readonly id: "regexSuperLinearBacktracking";
|
|
4
|
-
readonly presets: readonly ["logical", "logicalStrict"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "self" | "trade", undefined>;
|
|
9
|
-
export default _default;
|
|
10
|
-
//# sourceMappingURL=regexSuperLinearBacktracking.d.ts.map
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
-
import { getRegExpConstruction } from "./utils/getRegExpConstruction.js";
|
|
3
|
-
import { getRegExpLiteralDetails } from "./utils/getRegExpLiteralDetails.js";
|
|
4
|
-
import { parseRegexpAstFull } from "./utils/parseRegexpAstFull.js";
|
|
5
|
-
import { typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
6
|
-
import { analyse } from "scslre";
|
|
7
|
-
//#region src/rules/regexSuperLinearBacktracking.ts
|
|
8
|
-
function mentionQuantifier(quantifier) {
|
|
9
|
-
return `'${quantifier.raw}'`;
|
|
10
|
-
}
|
|
11
|
-
var regexSuperLinearBacktracking_default = ruleCreator.createRule(typescriptLanguage, {
|
|
12
|
-
about: {
|
|
13
|
-
description: "Reports regular expressions with exponential or polynomial backtracking.",
|
|
14
|
-
id: "regexSuperLinearBacktracking",
|
|
15
|
-
presets: ["logical", "logicalStrict"]
|
|
16
|
-
},
|
|
17
|
-
messages: {
|
|
18
|
-
self: {
|
|
19
|
-
primary: "Quantifier {{ quant }} can reach itself via {{ parentQuant }}, causing {{ complexity }} backtracking.",
|
|
20
|
-
secondary: ["This pattern can be exploited to cause denial of service (ReDoS) attacks.", "Using any string accepted by {{ attack }}, the regex can be forced to backtrack excessively."],
|
|
21
|
-
suggestions: ["Make the inner quantifier possessive or use atomic groups.", "Rewrite the pattern to remove the self-referential quantifier."]
|
|
22
|
-
},
|
|
23
|
-
trade: {
|
|
24
|
-
primary: "Quantifiers {{ startQuant }} and {{ endQuant }} can exchange characters, causing {{ complexity }} backtracking.",
|
|
25
|
-
secondary: ["This pattern can be exploited to cause denial of service (ReDoS) attacks.", "Using any string accepted by {{ attack }}, the regex can be forced to backtrack excessively."],
|
|
26
|
-
suggestions: ["Make one of the quantifiers possessive or use atomic groups.", "Rewrite the pattern to remove the ambiguity between quantifiers."]
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
setup(context) {
|
|
30
|
-
function analyseAndReport(parsed, patternStart, flags) {
|
|
31
|
-
let result;
|
|
32
|
-
try {
|
|
33
|
-
result = analyse(parsed, { reportTypes: { Move: false } });
|
|
34
|
-
} catch {
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
for (const report of result.reports) {
|
|
38
|
-
const complexity = report.exponential ? "exponential" : "polynomial";
|
|
39
|
-
const attack = `/${report.character.literal.source}+/${flags.includes("i") ? "i" : ""}`;
|
|
40
|
-
if (report.type === "Self") {
|
|
41
|
-
const quantStart = patternStart + report.quant.start;
|
|
42
|
-
const quantEnd = patternStart + report.quant.end;
|
|
43
|
-
context.report({
|
|
44
|
-
data: {
|
|
45
|
-
attack,
|
|
46
|
-
complexity,
|
|
47
|
-
parentQuant: mentionQuantifier(report.parentQuant),
|
|
48
|
-
quant: mentionQuantifier(report.quant)
|
|
49
|
-
},
|
|
50
|
-
message: "self",
|
|
51
|
-
range: {
|
|
52
|
-
begin: quantStart,
|
|
53
|
-
end: quantEnd
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
} else if (report.type === "Trade") {
|
|
57
|
-
const startQuantStart = patternStart + report.startQuant.start;
|
|
58
|
-
const endQuantEnd = patternStart + report.endQuant.end;
|
|
59
|
-
context.report({
|
|
60
|
-
data: {
|
|
61
|
-
attack,
|
|
62
|
-
complexity,
|
|
63
|
-
endQuant: mentionQuantifier(report.endQuant),
|
|
64
|
-
startQuant: mentionQuantifier(report.startQuant)
|
|
65
|
-
},
|
|
66
|
-
message: "trade",
|
|
67
|
-
range: {
|
|
68
|
-
begin: startQuantStart,
|
|
69
|
-
end: endQuantEnd
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
function checkRegexLiteral(node, services) {
|
|
76
|
-
const details = getRegExpLiteralDetails(node, services);
|
|
77
|
-
const parsed = parseRegexpAstFull(details.pattern, details.flags);
|
|
78
|
-
if (!parsed) return;
|
|
79
|
-
analyseAndReport(parsed, details.start, details.flags);
|
|
80
|
-
}
|
|
81
|
-
function checkRegExpConstructor(node, services) {
|
|
82
|
-
const construction = getRegExpConstruction(node, services);
|
|
83
|
-
if (!construction) return;
|
|
84
|
-
const parsed = parseRegexpAstFull(construction.pattern, construction.flags);
|
|
85
|
-
if (!parsed) return;
|
|
86
|
-
analyseAndReport(parsed, construction.start + 1, construction.flags);
|
|
87
|
-
}
|
|
88
|
-
return { visitors: {
|
|
89
|
-
CallExpression: checkRegExpConstructor,
|
|
90
|
-
NewExpression: checkRegExpConstructor,
|
|
91
|
-
RegularExpressionLiteral: checkRegexLiteral
|
|
92
|
-
} };
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
//#endregion
|
|
96
|
-
export { regexSuperLinearBacktracking_default as default };
|
|
97
|
-
|
|
98
|
-
//# sourceMappingURL=regexSuperLinearBacktracking.js.map
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
|
-
readonly description: "Reports quantifiers that can cause quadratic regex matching time.";
|
|
3
|
-
readonly id: "regexSuperLinearMoves";
|
|
4
|
-
readonly presets: readonly ["logical"];
|
|
5
|
-
} & {
|
|
6
|
-
readonly pluginId: string;
|
|
7
|
-
readonly url: string;
|
|
8
|
-
}, "superLinear", undefined>;
|
|
9
|
-
export default _default;
|
|
10
|
-
//# sourceMappingURL=regexSuperLinearMoves.d.ts.map
|