@flint.fyi/ts 0.18.1 → 0.19.1
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 +1237 -1207
- package/lib/plugin.js +5 -0
- package/lib/rules/accessorPairGroups.d.ts +4 -4
- package/lib/rules/accessorPairTypes.d.ts +4 -4
- package/lib/rules/accessorThisRecursion.d.ts +4 -4
- package/lib/rules/anyArguments.d.ts +4 -4
- package/lib/rules/anyAssignments.d.ts +4 -4
- package/lib/rules/anyCalls.d.ts +4 -4
- package/lib/rules/anyMemberAccess.d.ts +4 -4
- package/lib/rules/anyReturns.d.ts +4 -4
- package/lib/rules/arguments.d.ts +4 -4
- package/lib/rules/arrayCallbackReturns.d.ts +4 -4
- package/lib/rules/arrayConstructors.d.ts +4 -4
- package/lib/rules/arrayDeleteUnnecessaryCounts.d.ts +4 -4
- package/lib/rules/arrayElementDeletions.d.ts +4 -4
- package/lib/rules/arrayEmptyCallbackSlots.d.ts +4 -4
- package/lib/rules/arrayExistenceChecksConsistency.d.ts +4 -4
- package/lib/rules/arrayFilteredFinds.d.ts +4 -4
- package/lib/rules/arrayFinds.d.ts +4 -4
- package/lib/rules/arrayFlatMapMethods.d.ts +4 -4
- package/lib/rules/arrayFlatMethods.d.ts +4 -4
- package/lib/rules/arrayFlatUnnecessaryDepths.d.ts +4 -4
- package/lib/rules/arrayIncludes.d.ts +4 -4
- package/lib/rules/arrayIncludesMethods.d.ts +4 -4
- package/lib/rules/arrayIndexOfMethods.d.ts +4 -4
- package/lib/rules/arrayLoops.d.ts +4 -4
- package/lib/rules/arrayMapIdentities.d.ts +4 -4
- package/lib/rules/arrayMutableReverses.d.ts +4 -4
- package/lib/rules/arrayMutableSorts.d.ts +4 -4
- package/lib/rules/arrayReduceTypeArguments.d.ts +4 -4
- package/lib/rules/arraySliceUnnecessaryEnd.d.ts +4 -4
- package/lib/rules/arraySomeMethods.d.ts +4 -4
- package/lib/rules/arrayTernarySpreadingConsistency.d.ts +4 -4
- package/lib/rules/arrayTypes.d.ts +5 -5
- package/lib/rules/arrayUnnecessaryLengthChecks.d.ts +4 -4
- package/lib/rules/asConstAssertions.d.ts +4 -4
- package/lib/rules/assignmentOperatorShorthands.d.ts +4 -4
- package/lib/rules/asyncPromiseExecutors.d.ts +4 -4
- package/lib/rules/asyncUnnecessaryPromiseWrappers.d.ts +4 -4
- package/lib/rules/atAccesses.d.ts +4 -4
- package/lib/rules/builtinCoercions.d.ts +4 -4
- package/lib/rules/builtinConstructorNews.d.ts +4 -4
- package/lib/rules/caseDeclarations.d.ts +4 -4
- package/lib/rules/caseDuplicates.d.ts +4 -4
- package/lib/rules/caseFallthroughs.d.ts +4 -4
- package/lib/rules/catchCallbackTypes.d.ts +4 -4
- package/lib/rules/caughtVariableNames.d.ts +4 -4
- package/lib/rules/chainedAssignments.d.ts +4 -4
- package/lib/rules/charAtComparisons.d.ts +4 -4
- package/lib/rules/classAssignments.d.ts +4 -4
- package/lib/rules/classFieldDeclarations.d.ts +4 -4
- package/lib/rules/classLiteralProperties.d.ts +4 -4
- package/lib/rules/classMemberDuplicates.d.ts +4 -4
- package/lib/rules/classMethodsThis.d.ts +6 -6
- package/lib/rules/combinedPushes.d.ts +4 -4
- package/lib/rules/consecutiveNonNullAssertions.d.ts +4 -4
- package/lib/rules/consoleCalls.d.ts +3 -3
- package/lib/rules/constantAssignments.d.ts +4 -4
- package/lib/rules/constructorGenericCalls.d.ts +4 -4
- package/lib/rules/constructorReturns.d.ts +4 -4
- package/lib/rules/constructorSupers.d.ts +4 -4
- package/lib/rules/dateConstructorClones.d.ts +4 -4
- package/lib/rules/dateNowTimestamps.d.ts +4 -4
- package/lib/rules/debuggerStatements.d.ts +4 -4
- package/lib/rules/defaultCaseLast.d.ts +4 -4
- package/lib/rules/defaultParameterLast.d.ts +4 -4
- package/lib/rules/deprecated.d.ts +4 -4
- package/lib/rules/destructuringConsistency.d.ts +4 -4
- package/lib/rules/duplicateArguments.d.ts +4 -4
- package/lib/rules/dynamicDeletes.d.ts +4 -4
- package/lib/rules/elseIfDuplicates.d.ts +4 -4
- package/lib/rules/elseReturns.d.ts +4 -4
- package/lib/rules/emptyBlocks.d.ts +4 -4
- package/lib/rules/emptyDestructures.d.ts +4 -4
- package/lib/rules/emptyEnums.d.ts +4 -4
- package/lib/rules/emptyExports.d.ts +4 -4
- package/lib/rules/emptyFiles.d.ts +4 -4
- package/lib/rules/emptyFunctions.d.ts +4 -4
- package/lib/rules/emptyModuleAttributes.d.ts +4 -4
- package/lib/rules/emptyObjectTypes.d.ts +4 -4
- package/lib/rules/emptyStaticBlocks.d.ts +4 -4
- package/lib/rules/emptyTypeParameterLists.d.ts +4 -4
- package/lib/rules/enumInitializers.d.ts +4 -4
- package/lib/rules/enumMemberLiterals.d.ts +4 -4
- package/lib/rules/enumValueConsistency.d.ts +4 -4
- package/lib/rules/enumValueDuplicates.d.ts +4 -4
- package/lib/rules/equalityOperatorNegations.d.ts +3 -3
- package/lib/rules/equalityOperators.d.ts +4 -4
- package/lib/rules/errorMessages.d.ts +4 -4
- package/lib/rules/errorSubclassProperties.d.ts +4 -4
- package/lib/rules/errorUnnecessaryCaptureStackTraces.d.ts +4 -4
- package/lib/rules/escapeSequenceCasing.d.ts +4 -4
- package/lib/rules/evals.d.ts +4 -4
- package/lib/rules/evolvingVariableTypes.d.ts +4 -4
- package/lib/rules/exceptionAssignments.d.ts +4 -4
- package/lib/rules/explicitAnys.d.ts +4 -4
- package/lib/rules/exponentiationOperators.d.ts +4 -4
- package/lib/rules/exportFromImports.d.ts +4 -4
- package/lib/rules/exportMutables.d.ts +4 -4
- package/lib/rules/exportUniqueNames.d.ts +4 -4
- package/lib/rules/extraneousClasses.d.ts +4 -4
- package/lib/rules/fetchMethodBodies.d.ts +4 -4
- package/lib/rules/finallyStatementSafety.d.ts +4 -4
- package/lib/rules/forDirections.d.ts +4 -4
- package/lib/rules/forInArrays.d.ts +4 -4
- package/lib/rules/forInGuards.d.ts +3 -3
- package/lib/rules/functionApplySpreads.d.ts +4 -4
- package/lib/rules/functionAssignments.d.ts +4 -4
- package/lib/rules/functionCurryingRedundancy.d.ts +4 -4
- package/lib/rules/functionDeclarationStyles.d.ts +5 -5
- package/lib/rules/functionNameMatches.d.ts +4 -4
- package/lib/rules/functionNewCalls.d.ts +4 -4
- package/lib/rules/generatorFunctionYields.d.ts +4 -4
- package/lib/rules/getterReturns.d.ts +4 -4
- package/lib/rules/globalAssignments.d.ts +4 -4
- package/lib/rules/globalObjectCalls.d.ts +4 -4
- package/lib/rules/globalThisAliases.d.ts +4 -4
- package/lib/rules/impliedEvals.d.ts +4 -4
- package/lib/rules/importEmptyBlocks.d.ts +4 -4
- package/lib/rules/importTypeSideEffects.d.ts +4 -4
- package/lib/rules/indexedObjectTypes.d.ts +5 -5
- package/lib/rules/instanceOfArrays.d.ts +4 -4
- package/lib/rules/irregularWhitespaces.d.ts +8 -8
- package/lib/rules/isNaNComparisons.d.ts +4 -4
- package/lib/rules/literalConstructorWrappers.d.ts +4 -4
- package/lib/rules/mathMethods.d.ts +4 -4
- package/lib/rules/meaninglessVoidOperators.d.ts +4 -4
- package/lib/rules/misleadingVoidExpressions.d.ts +4 -4
- package/lib/rules/moduleSpecifierLists.d.ts +4 -4
- package/lib/rules/multilineAmbiguities.d.ts +4 -4
- package/lib/rules/namedDefaultExports.d.ts +4 -4
- package/lib/rules/namespaceDeclarations.d.ts +6 -6
- package/lib/rules/namespaceImplicitAmbientImports.d.ts +4 -4
- package/lib/rules/namespaceKeywords.d.ts +4 -4
- package/lib/rules/nativeObjectExtensions.d.ts +4 -4
- package/lib/rules/negativeIndexLengthMethods.d.ts +4 -4
- package/lib/rules/negativeZeroComparisons.d.ts +4 -4
- package/lib/rules/nestedStandaloneIfs.d.ts +4 -4
- package/lib/rules/newDefinitions.d.ts +4 -4
- package/lib/rules/newExpressions.d.ts +4 -4
- package/lib/rules/newNativeNonConstructors.d.ts +4 -4
- package/lib/rules/nonNullAssertedNullishCoalesces.d.ts +4 -4
- package/lib/rules/nonNullAssertedOptionalChains.d.ts +4 -4
- package/lib/rules/nonNullAssertionPlacement.d.ts +4 -4
- package/lib/rules/nonNullableTypeAssertions.d.ts +4 -4
- package/lib/rules/nonOctalDecimalEscapes.d.ts +4 -4
- package/lib/rules/nullishCheckStyle.d.ts +5 -5
- package/lib/rules/nullishCoalescingOperators.d.ts +9 -9
- package/lib/rules/numberMethodRanges.d.ts +4 -4
- package/lib/rules/numberStaticMethods.d.ts +4 -4
- package/lib/rules/numericErasingOperations.d.ts +4 -4
- package/lib/rules/numericLiteralParsing.d.ts +4 -4
- package/lib/rules/numericPrecision.d.ts +4 -4
- package/lib/rules/numericSeparatorGroups.d.ts +4 -4
- package/lib/rules/objectAssignSpreads.d.ts +4 -4
- package/lib/rules/objectCalls.d.ts +4 -4
- package/lib/rules/objectEntriesMethods.d.ts +4 -4
- package/lib/rules/objectHasOwns.d.ts +4 -4
- package/lib/rules/objectKeyDuplicates.d.ts +4 -4
- package/lib/rules/objectProto.d.ts +4 -4
- package/lib/rules/objectPrototypeBuiltIns.d.ts +4 -4
- package/lib/rules/objectShorthand.d.ts +4 -4
- package/lib/rules/objectSpreadUnnecessaryFallbacks.d.ts +4 -4
- package/lib/rules/objectTypeDefinitions.d.ts +4 -4
- package/lib/rules/octalEscapes.d.ts +4 -4
- package/lib/rules/octalNumbers.d.ts +4 -4
- package/lib/rules/operatorAssignmentShorthand.d.ts +4 -4
- package/lib/rules/overloadSignaturesAdjacent.d.ts +4 -4
- package/lib/rules/parameterReassignments.d.ts +4 -4
- package/lib/rules/parseIntRadixes.d.ts +4 -4
- package/lib/rules/propertyAccessNotation.d.ts +5 -5
- package/lib/rules/recursionOnlyArguments.d.ts +4 -4
- package/lib/rules/redundantTypeConstituents.d.ts +4 -4
- package/lib/rules/regexAllGlobalFlags.d.ts +4 -4
- package/lib/rules/regexAmbiguousInvalidity.d.ts +4 -4
- package/lib/rules/regexCharacterClassRanges.d.ts +4 -4
- package/lib/rules/regexCharacterClassSetOperations.d.ts +4 -4
- package/lib/rules/regexCharacterClasses.d.ts +4 -4
- package/lib/rules/regexConciseCharacterClassNegations.d.ts +4 -4
- package/lib/rules/regexContradictoryAssertions.d.ts +4 -4
- package/lib/rules/regexControlCharacterEscapes.d.ts +4 -4
- package/lib/rules/regexControlCharacters.d.ts +4 -4
- package/lib/rules/regexDigitMatchers.d.ts +4 -4
- package/lib/rules/regexDollarEscapes.d.ts +4 -4
- package/lib/rules/regexDuplicateCharacterClassCharacters.d.ts +4 -4
- package/lib/rules/regexEmptyAlternatives.d.ts +4 -4
- package/lib/rules/regexEmptyCapturingGroups.d.ts +4 -4
- package/lib/rules/regexEmptyCharacterClasses.d.ts +4 -4
- package/lib/rules/regexEmptyGroups.d.ts +4 -4
- package/lib/rules/regexEmptyLazyQuantifiers.d.ts +4 -4
- package/lib/rules/regexEmptyLookaroundsAssertions.d.ts +4 -4
- package/lib/rules/regexEmptyStringLiterals.d.ts +4 -4
- package/lib/rules/regexEscapeBackspaces.d.ts +4 -4
- package/lib/rules/regexExecutors.d.ts +4 -4
- package/lib/rules/regexGraphemeStringLiterals.d.ts +4 -4
- package/lib/rules/regexHexadecimalEscapes.d.ts +4 -4
- package/lib/rules/regexIgnoreCaseFlags.d.ts +4 -4
- package/lib/rules/regexInvisibleCharacters.d.ts +4 -4
- package/lib/rules/regexLetterCasing.d.ts +4 -4
- package/lib/rules/regexLiterals.d.ts +4 -4
- package/lib/rules/regexLookaroundAssertions.d.ts +4 -4
- package/lib/rules/regexLookaroundQuantifierOptimizations.d.ts +4 -4
- package/lib/rules/regexMatchNotation.d.ts +4 -4
- package/lib/rules/regexMisleadingCapturingGroups.d.ts +4 -4
- package/lib/rules/regexMisleadingQuantifiers.d.ts +4 -4
- package/lib/rules/regexMisleadingUnicodeCharacters.d.ts +4 -4
- package/lib/rules/regexNamedBackreferences.d.ts +4 -4
- package/lib/rules/regexNamedCaptureGroups.d.ts +3 -3
- package/lib/rules/regexNamedReplacements.d.ts +4 -4
- package/lib/rules/regexNonStandardFlags.d.ts +4 -4
- package/lib/rules/regexObscureRanges.d.ts +4 -4
- package/lib/rules/regexOctalEscapes.d.ts +4 -4
- package/lib/rules/regexPlusQuantifiers.d.ts +4 -4
- package/lib/rules/regexPredefinedAssertions.d.ts +4 -4
- package/lib/rules/regexQuestionQuantifiers.d.ts +4 -4
- package/lib/rules/regexRepeatQuantifiers.d.ts +4 -4
- package/lib/rules/regexResultArrayGroups.d.ts +4 -4
- package/lib/rules/regexSetOperationOptimizations.d.ts +4 -4
- package/lib/rules/regexStandaloneBackslashes.d.ts +4 -4
- package/lib/rules/regexStarQuantifiers.d.ts +4 -4
- package/lib/rules/regexSuperLinearBacktracking.d.ts +4 -4
- package/lib/rules/regexSuperLinearMoves.d.ts +4 -4
- package/lib/rules/regexTestMethods.d.ts +4 -4
- package/lib/rules/regexUnicodeCodepointEscapes.d.ts +4 -4
- package/lib/rules/regexUnicodeEscapes.d.ts +3 -3
- package/lib/rules/regexUnicodeFlag.d.ts +3 -3
- package/lib/rules/regexUnicodeProperties.d.ts +4 -4
- package/lib/rules/regexUnnecessaryAssertions.d.ts +4 -4
- package/lib/rules/regexUnnecessaryBackreferences.d.ts +4 -4
- package/lib/rules/regexUnnecessaryCharacterClasses.d.ts +4 -4
- package/lib/rules/regexUnnecessaryCharacterRanges.d.ts +4 -4
- package/lib/rules/regexUnnecessaryDisjunctions.d.ts +4 -4
- package/lib/rules/regexUnnecessaryDollarReplacements.d.ts +4 -4
- package/lib/rules/regexUnnecessaryEscapes.d.ts +4 -4
- package/lib/rules/regexUnnecessaryLookaroundAssertions.d.ts +4 -4
- package/lib/rules/regexUnnecessaryNestedAssertions.d.ts +4 -4
- package/lib/rules/regexUnnecessaryNestedQuantifiers.d.ts +4 -4
- package/lib/rules/regexUnnecessaryNonCapturingGroups.d.ts +4 -4
- package/lib/rules/regexUnnecessaryNumericQuantifiers.d.ts +4 -4
- package/lib/rules/regexUnnecessaryOptionalAssertions.d.ts +4 -4
- package/lib/rules/regexUnnecessaryReferentialBackreferences.d.ts +4 -4
- package/lib/rules/regexUnnecessarySetOperands.d.ts +4 -4
- package/lib/rules/regexUnusedCapturingGroups.d.ts +4 -4
- package/lib/rules/regexUnusedFlags.d.ts +4 -4
- package/lib/rules/regexUnusedLazyQuantifiers.d.ts +4 -4
- package/lib/rules/regexUnusedQuantifiers.d.ts +4 -4
- package/lib/rules/regexValidity.d.ts +4 -4
- package/lib/rules/regexWordMatchers.d.ts +4 -4
- package/lib/rules/regexZeroQuantifiers.d.ts +4 -4
- package/lib/rules/requireImports.d.ts +10 -0
- package/lib/rules/requireImports.js +48 -0
- package/lib/rules/responseJsonMethods.d.ts +4 -4
- package/lib/rules/restrictedIdentifiers.d.ts +5 -5
- package/lib/rules/returnAssignments.d.ts +4 -4
- package/lib/rules/returnThisTypes.d.ts +4 -4
- package/lib/rules/ruleCreator.d.ts +1 -1
- package/lib/rules/selfAssignments.d.ts +4 -4
- package/lib/rules/sequences.d.ts +4 -4
- package/lib/rules/setSizeLengthChecks.d.ts +4 -4
- package/lib/rules/setterReturns.d.ts +4 -4
- package/lib/rules/shadowedRestrictedNames.d.ts +4 -4
- package/lib/rules/singleVariableDeclarations.d.ts +4 -4
- package/lib/rules/sizeComparisonOperators.d.ts +5 -5
- package/lib/rules/sparseArrays.d.ts +4 -4
- package/lib/rules/staticMemberOnlyClasses.d.ts +4 -4
- package/lib/rules/stringCaseMismatches.d.ts +4 -4
- package/lib/rules/stringCodePoints.d.ts +4 -4
- package/lib/rules/stringSliceMethods.d.ts +4 -4
- package/lib/rules/stringStartsEndsWith.d.ts +4 -4
- package/lib/rules/structuredCloneMethods.d.ts +4 -4
- package/lib/rules/symbolDescriptions.d.ts +4 -4
- package/lib/rules/thisAliases.d.ts +4 -4
- package/lib/rules/thisBeforeSuper.d.ts +4 -4
- package/lib/rules/throwErrors.d.ts +4 -4
- package/lib/rules/topLevelAwaits.d.ts +4 -4
- package/lib/rules/tripleSlashReferenceValidity.d.ts +4 -4
- package/lib/rules/tripleSlashReferences.d.ts +4 -4
- package/lib/rules/tsComments.d.ts +4 -4
- package/lib/rules/tslintComments.d.ts +4 -4
- package/lib/rules/typeAssertionStyles.d.ts +4 -4
- package/lib/rules/typeImports.d.ts +20 -0
- package/lib/rules/typeImports.js +284 -0
- package/lib/rules/typeofComparisons.d.ts +4 -4
- package/lib/rules/unassignedVariables.d.ts +4 -4
- package/lib/rules/undefinedTypeofChecks.d.ts +4 -4
- package/lib/rules/undefinedVariables.d.ts +4 -4
- package/lib/rules/unicodeBOMs.d.ts +4 -4
- package/lib/rules/unnecessaryBinds.d.ts +4 -4
- package/lib/rules/unnecessaryBlocks.d.ts +4 -4
- package/lib/rules/unnecessaryBooleanCasts.d.ts +4 -4
- package/lib/rules/unnecessaryCatches.d.ts +4 -4
- package/lib/rules/unnecessaryComparisons.d.ts +4 -4
- package/lib/rules/unnecessaryConcatenation.d.ts +4 -4
- package/lib/rules/unnecessaryEscapes.d.ts +4 -4
- package/lib/rules/unnecessaryMathClamps.d.ts +4 -4
- package/lib/rules/unnecessaryNumericFractions.d.ts +4 -4
- package/lib/rules/unnecessaryRenames.d.ts +4 -4
- package/lib/rules/unnecessaryTernaries.d.ts +4 -4
- package/lib/rules/unnecessaryUseStricts.d.ts +4 -4
- package/lib/rules/unsafeNegations.d.ts +4 -4
- package/lib/rules/utils/forEachChild.d.ts +4 -0
- package/lib/rules/utils/forEachChild.js +7 -0
- package/lib/rules/variableDeletions.d.ts +4 -4
- package/lib/rules/voidOperator.d.ts +4 -4
- package/lib/rules/withStatements.d.ts +4 -4
- package/lib/rules/wrapperObjects.d.ts +4 -4
- package/package.json +5 -5
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { ruleCreator } from "./ruleCreator.js";
|
|
2
|
+
import { forEachChild } from "./utils/forEachChild.js";
|
|
3
|
+
import { getTSNodeRange, typescriptLanguage } from "@flint.fyi/typescript-language";
|
|
4
|
+
import ts, { SyntaxKind } from "typescript";
|
|
5
|
+
import { z } from "zod/v4";
|
|
6
|
+
//#region src/rules/typeImports.ts
|
|
7
|
+
function containsDecorator(node) {
|
|
8
|
+
if (node.kind === SyntaxKind.Decorator) return true;
|
|
9
|
+
return forEachChild(node, containsDecorator) ?? false;
|
|
10
|
+
}
|
|
11
|
+
function formatWordList(words) {
|
|
12
|
+
if (words.length < 2) return words[0] ?? "";
|
|
13
|
+
const last = words.at(-1);
|
|
14
|
+
return `${words.slice(0, -1).join(", ")} and ${last}`;
|
|
15
|
+
}
|
|
16
|
+
function getImportSource(node, sourceFile) {
|
|
17
|
+
return ts.isStringLiteral(node.moduleSpecifier) ? node.moduleSpecifier.text : node.moduleSpecifier.getText(sourceFile);
|
|
18
|
+
}
|
|
19
|
+
function getImportSpecifiers(node) {
|
|
20
|
+
const importClause = node.importClause;
|
|
21
|
+
if (!importClause) return [];
|
|
22
|
+
const specifiers = [];
|
|
23
|
+
if (importClause.name) specifiers.push(importClause.name);
|
|
24
|
+
const namedBindings = importClause.namedBindings;
|
|
25
|
+
if (namedBindings) if (namedBindings.kind === ts.SyntaxKind.NamespaceImport) specifiers.push(namedBindings);
|
|
26
|
+
else specifiers.push(...namedBindings.elements);
|
|
27
|
+
return specifiers;
|
|
28
|
+
}
|
|
29
|
+
function getReferencedSymbol(typeChecker, node) {
|
|
30
|
+
const symbol = typeChecker.getSymbolAtLocation(node);
|
|
31
|
+
return symbol?.flags && (symbol.flags & ts.SymbolFlags.Alias) !== 0 ? typeChecker.getAliasedSymbol(symbol) : symbol;
|
|
32
|
+
}
|
|
33
|
+
function getSpecifierLocal(specifier) {
|
|
34
|
+
return specifier.kind === SyntaxKind.Identifier ? specifier : specifier.name;
|
|
35
|
+
}
|
|
36
|
+
function getTypeImportFix(report, sourceFile, fixStyle) {
|
|
37
|
+
const node = report.node;
|
|
38
|
+
const importText = node.getText(sourceFile);
|
|
39
|
+
const importClause = node.importClause;
|
|
40
|
+
const namedBindings = importClause?.namedBindings;
|
|
41
|
+
const range = getTSNodeRange(node, sourceFile);
|
|
42
|
+
if (report.valueSpecifiers.length || report.unusedSpecifiers.length) {
|
|
43
|
+
if (!importClause || importClause.name || namedBindings?.kind !== ts.SyntaxKind.NamedImports) return;
|
|
44
|
+
const typeSpecifiers = new Set(report.typeSpecifiers);
|
|
45
|
+
const remainingSpecifiers = namedBindings.elements.filter((specifier) => !typeSpecifiers.has(specifier));
|
|
46
|
+
const typeText = report.typeSpecifiers.map((specifier) => specifier.getText(sourceFile)).join(", ");
|
|
47
|
+
const remainingText = remainingSpecifiers.map((specifier) => specifier.getText(sourceFile)).join(", ");
|
|
48
|
+
const moduleText = node.moduleSpecifier.getText(sourceFile);
|
|
49
|
+
return {
|
|
50
|
+
range,
|
|
51
|
+
text: `import type { ${typeText}} from ${moduleText};\nimport { ${remainingText} } from ${moduleText};`
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
if (fixStyle === "inline-type-imports" && importClause && !importClause.name && namedBindings?.kind === ts.SyntaxKind.NamedImports) {
|
|
55
|
+
const moduleText = node.moduleSpecifier.getText(sourceFile);
|
|
56
|
+
return {
|
|
57
|
+
range,
|
|
58
|
+
text: `import { ${namedBindings.elements.map((specifier) => specifier.isTypeOnly ? specifier.getText(sourceFile) : `type ${specifier.getText(sourceFile)}`).join(", ")} } from ${moduleText};`
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
range,
|
|
63
|
+
text: importText.replace(/^import\b/, "import type")
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function getTypeKeywordFixRange(node, sourceFile) {
|
|
67
|
+
const range = getTypeKeywordRange(node, sourceFile);
|
|
68
|
+
if (sourceFile.text[range.end] === " ") range.end += 1;
|
|
69
|
+
return range;
|
|
70
|
+
}
|
|
71
|
+
function getTypeKeywordRange(node, sourceFile) {
|
|
72
|
+
for (const child of node.getChildren(sourceFile)) if (child.kind === SyntaxKind.TypeKeyword) {
|
|
73
|
+
const range = getTSNodeRange(child, sourceFile);
|
|
74
|
+
if (node.kind === SyntaxKind.ImportSpecifier && sourceFile.text[range.end] === " ") range.end += 1;
|
|
75
|
+
return range;
|
|
76
|
+
}
|
|
77
|
+
return getTSNodeRange(node, sourceFile);
|
|
78
|
+
}
|
|
79
|
+
function isInImportDeclaration(node) {
|
|
80
|
+
let current = node;
|
|
81
|
+
while (current) {
|
|
82
|
+
if (current.kind === SyntaxKind.ImportDeclaration) return true;
|
|
83
|
+
current = current.parent;
|
|
84
|
+
}
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
function isInlineTypeSpecifier(specifier) {
|
|
88
|
+
return specifier.kind === SyntaxKind.ImportSpecifier && specifier.isTypeOnly;
|
|
89
|
+
}
|
|
90
|
+
function isOnlyTypeReference(node) {
|
|
91
|
+
if (isTypeQueryReference(node) || isTypeOnlyExportReference(node) || isPropertySignatureComputedReference(node)) return true;
|
|
92
|
+
let current;
|
|
93
|
+
let parent = node.parent;
|
|
94
|
+
while (parent) {
|
|
95
|
+
if (parent.kind === ts.SyntaxKind.HeritageClause) return parent.token === SyntaxKind.ImplementsKeyword;
|
|
96
|
+
if (ts.isTypeAliasDeclaration(parent) || ts.isInterfaceDeclaration(parent) || ts.isTypeParameterDeclaration(parent)) return true;
|
|
97
|
+
if (ts.isTypeNode(parent) && !ts.isExpressionWithTypeArguments(parent)) return true;
|
|
98
|
+
current = parent;
|
|
99
|
+
parent = current.parent;
|
|
100
|
+
}
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
function isPropertySignatureComputedReference(node) {
|
|
104
|
+
let child = node;
|
|
105
|
+
let parent = node.parent;
|
|
106
|
+
while (parent) switch (parent.kind) {
|
|
107
|
+
case SyntaxKind.PropertySignature: return parent.name === child;
|
|
108
|
+
case SyntaxKind.ComputedPropertyName:
|
|
109
|
+
if (parent.expression !== child) return false;
|
|
110
|
+
child = parent;
|
|
111
|
+
parent = parent.parent;
|
|
112
|
+
continue;
|
|
113
|
+
case SyntaxKind.PropertyAccessExpression:
|
|
114
|
+
if (parent.expression !== child) return false;
|
|
115
|
+
child = parent;
|
|
116
|
+
parent = parent.parent;
|
|
117
|
+
continue;
|
|
118
|
+
default: return false;
|
|
119
|
+
}
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
function isTypeImportDeclaration(node) {
|
|
123
|
+
return node.importClause?.phaseModifier === SyntaxKind.TypeKeyword;
|
|
124
|
+
}
|
|
125
|
+
function isTypeOnlyExportReference(node) {
|
|
126
|
+
const parent = node.parent;
|
|
127
|
+
if (parent.kind !== SyntaxKind.ExportSpecifier) return false;
|
|
128
|
+
const exportDeclaration = parent.parent.parent;
|
|
129
|
+
return parent.name === node && exportDeclaration.isTypeOnly;
|
|
130
|
+
}
|
|
131
|
+
function isTypeQueryReference(node) {
|
|
132
|
+
let child = node;
|
|
133
|
+
let parent = node.parent;
|
|
134
|
+
while (parent) switch (parent.kind) {
|
|
135
|
+
case SyntaxKind.TypeQuery: return true;
|
|
136
|
+
case SyntaxKind.QualifiedName:
|
|
137
|
+
if (parent.left !== child) return false;
|
|
138
|
+
child = parent;
|
|
139
|
+
parent = parent.parent;
|
|
140
|
+
continue;
|
|
141
|
+
default: return false;
|
|
142
|
+
}
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
var typeImports_default = ruleCreator.createRule(typescriptLanguage, {
|
|
146
|
+
about: {
|
|
147
|
+
description: "Reports imports that do not match the configured type import style.",
|
|
148
|
+
id: "typeImports",
|
|
149
|
+
presets: ["stylistic"]
|
|
150
|
+
},
|
|
151
|
+
messages: {
|
|
152
|
+
avoidImportType: {
|
|
153
|
+
primary: "Use a regular import instead of a type-only import.",
|
|
154
|
+
secondary: ["This configuration prefers regular imports over `import type` syntax."],
|
|
155
|
+
suggestions: ["Change this type-only import to a regular import."]
|
|
156
|
+
},
|
|
157
|
+
someImportsAreOnlyTypes: {
|
|
158
|
+
primary: "Imports {{ typeImports }} are only used as types.",
|
|
159
|
+
secondary: ["These imports are only used in type positions.", "Using 'import type' improves tree-shaking and makes intent clear."],
|
|
160
|
+
suggestions: ["Change these imports to use 'import type'."]
|
|
161
|
+
},
|
|
162
|
+
typeOverValue: {
|
|
163
|
+
primary: "All imports in this declaration are only used as types. Use 'import type'.",
|
|
164
|
+
secondary: ["This import is only used in type positions.", "Using 'import type' improves tree-shaking and makes intent clear."],
|
|
165
|
+
suggestions: ["Change this declaration to use 'import type'."]
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
options: {
|
|
169
|
+
fixStyle: z.enum(["inline-type-imports", "separate-type-imports"]).default("inline-type-imports"),
|
|
170
|
+
prefer: z.enum(["no-type-imports", "type-imports"]).default("type-imports")
|
|
171
|
+
},
|
|
172
|
+
setup(context) {
|
|
173
|
+
return { visitors: { SourceFile(node, { options, program, sourceFile, typeChecker }) {
|
|
174
|
+
if (options.prefer === "no-type-imports") {
|
|
175
|
+
for (const statement of node.statements) {
|
|
176
|
+
if (!ts.isImportDeclaration(statement) || !statement.importClause) continue;
|
|
177
|
+
if (isTypeImportDeclaration(statement)) {
|
|
178
|
+
context.report({
|
|
179
|
+
fix: {
|
|
180
|
+
range: getTypeKeywordFixRange(statement.importClause, sourceFile),
|
|
181
|
+
text: ""
|
|
182
|
+
},
|
|
183
|
+
message: "avoidImportType",
|
|
184
|
+
range: getTypeKeywordRange(statement.importClause, sourceFile)
|
|
185
|
+
});
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
for (const specifier of getImportSpecifiers(statement)) {
|
|
189
|
+
if (!isInlineTypeSpecifier(specifier)) continue;
|
|
190
|
+
context.report({
|
|
191
|
+
fix: {
|
|
192
|
+
range: getTypeKeywordFixRange(specifier, sourceFile),
|
|
193
|
+
text: ""
|
|
194
|
+
},
|
|
195
|
+
message: "avoidImportType",
|
|
196
|
+
range: getTypeKeywordRange(specifier, sourceFile)
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const compilerOptions = program.getCompilerOptions();
|
|
203
|
+
if (compilerOptions.experimentalDecorators && compilerOptions.emitDecoratorMetadata && containsDecorator(node)) return;
|
|
204
|
+
const sourceImportsMap = {};
|
|
205
|
+
const importedSpecifiers = [];
|
|
206
|
+
const references = /* @__PURE__ */ new Map();
|
|
207
|
+
for (const statement of node.statements) {
|
|
208
|
+
if (!ts.isImportDeclaration(statement) || !statement.importClause) continue;
|
|
209
|
+
const source = getImportSource(statement, sourceFile);
|
|
210
|
+
sourceImportsMap[source] ??= { reportValueImports: [] };
|
|
211
|
+
if (isTypeImportDeclaration(statement)) continue;
|
|
212
|
+
for (const specifier of getImportSpecifiers(statement)) {
|
|
213
|
+
if (isInlineTypeSpecifier(specifier)) continue;
|
|
214
|
+
const local = getSpecifierLocal(specifier);
|
|
215
|
+
const importedSpecifier = {
|
|
216
|
+
local,
|
|
217
|
+
specifier,
|
|
218
|
+
symbol: getReferencedSymbol(typeChecker, local)
|
|
219
|
+
};
|
|
220
|
+
importedSpecifiers.push(importedSpecifier);
|
|
221
|
+
references.set(importedSpecifier, []);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
function collectReferences(node) {
|
|
225
|
+
if (ts.isIdentifier(node) && !isInImportDeclaration(node)) {
|
|
226
|
+
const symbol = getReferencedSymbol(typeChecker, node);
|
|
227
|
+
const importedSpecifier = importedSpecifiers.find((specifier) => specifier.local.text === node.text && (!specifier.symbol || specifier.symbol === symbol));
|
|
228
|
+
if (importedSpecifier) references.get(importedSpecifier)?.push(node);
|
|
229
|
+
}
|
|
230
|
+
forEachChild(node, collectReferences);
|
|
231
|
+
}
|
|
232
|
+
collectReferences(node);
|
|
233
|
+
for (const statement of node.statements) {
|
|
234
|
+
if (!ts.isImportDeclaration(statement) || !statement.importClause || isTypeImportDeclaration(statement)) continue;
|
|
235
|
+
const typeSpecifiers = [];
|
|
236
|
+
const valueSpecifiers = [];
|
|
237
|
+
const unusedSpecifiers = [];
|
|
238
|
+
for (const specifier of getImportSpecifiers(statement)) {
|
|
239
|
+
if (isInlineTypeSpecifier(specifier)) continue;
|
|
240
|
+
const importedSpecifier = importedSpecifiers.find(({ specifier: found }) => found === specifier);
|
|
241
|
+
const specifierReferences = importedSpecifier ? references.get(importedSpecifier) : void 0;
|
|
242
|
+
if (!specifierReferences?.length) unusedSpecifiers.push(specifier);
|
|
243
|
+
else if (specifierReferences.every(isOnlyTypeReference)) typeSpecifiers.push(specifier);
|
|
244
|
+
else valueSpecifiers.push(specifier);
|
|
245
|
+
}
|
|
246
|
+
if (typeSpecifiers.length) {
|
|
247
|
+
const sourceImports = sourceImportsMap[getImportSource(statement, sourceFile)];
|
|
248
|
+
if (!sourceImports) continue;
|
|
249
|
+
sourceImports.reportValueImports.push({
|
|
250
|
+
node: statement,
|
|
251
|
+
typeSpecifiers,
|
|
252
|
+
unusedSpecifiers,
|
|
253
|
+
valueSpecifiers
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
for (const sourceImports of Object.values(sourceImportsMap)) {
|
|
258
|
+
if (!sourceImports.reportValueImports.length) continue;
|
|
259
|
+
for (const report of sourceImports.reportValueImports) {
|
|
260
|
+
const fix = getTypeImportFix(report, sourceFile, options.fixStyle);
|
|
261
|
+
if (!report.valueSpecifiers.length && !report.unusedSpecifiers.length && !report.node.attributes?.elements.length) {
|
|
262
|
+
context.report({
|
|
263
|
+
fix,
|
|
264
|
+
message: "typeOverValue",
|
|
265
|
+
range: getTSNodeRange(report.node, sourceFile)
|
|
266
|
+
});
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
const importNames = report.typeSpecifiers.map((specifier) => `"${getSpecifierLocal(specifier).text}"`);
|
|
270
|
+
context.report({
|
|
271
|
+
data: { typeImports: formatWordList(importNames) },
|
|
272
|
+
fix,
|
|
273
|
+
message: "someImportsAreOnlyTypes",
|
|
274
|
+
range: getTSNodeRange(report.node, sourceFile)
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
} } };
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
//#endregion
|
|
282
|
+
export { typeImports_default as default };
|
|
283
|
+
|
|
284
|
+
//# sourceMappingURL=typeImports.js.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports typeof expressions that compare impossible string literals.";
|
|
3
3
|
readonly id: "typeofComparisons";
|
|
4
|
-
readonly presets: ["javascript"];
|
|
4
|
+
readonly presets: readonly ["javascript"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "invalidValue", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=typeofComparisons.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports variables that are declared but never assigned a value.";
|
|
3
3
|
readonly id: "unassignedVariables";
|
|
4
|
-
readonly presets: ["javascript"];
|
|
4
|
+
readonly presets: readonly ["javascript"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "noUnassigned", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=unassignedVariables.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports typeof undefined checks.";
|
|
3
3
|
readonly id: "undefinedTypeofChecks";
|
|
4
|
-
readonly presets: ["stylistic"];
|
|
4
|
+
readonly presets: readonly ["stylistic"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "directComparison", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=undefinedTypeofChecks.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports using variables that are not defined.";
|
|
3
3
|
readonly id: "undefinedVariables";
|
|
4
|
-
readonly presets: ["javascript"];
|
|
4
|
+
readonly presets: readonly ["javascript"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "undefinedVariable", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=undefinedVariables.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports files with Unicode Byte Order Marks (BOMs).";
|
|
3
3
|
readonly id: "unicodeBOMs";
|
|
4
|
-
readonly presets: ["stylistic", "stylisticStrict"];
|
|
4
|
+
readonly presets: readonly ["stylistic", "stylisticStrict"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "noBOM", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=unicodeBOMs.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports unnecessary `.bind()` calls.";
|
|
3
3
|
readonly id: "unnecessaryBinds";
|
|
4
|
-
readonly presets: ["logical"];
|
|
4
|
+
readonly presets: readonly ["logical"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "unnecessaryBinds" | "arrowBind", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=unnecessaryBinds.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports standalone block statements that don't create a meaningful scope.";
|
|
3
3
|
readonly id: "unnecessaryBlocks";
|
|
4
|
-
readonly presets: ["stylistic", "stylisticStrict"];
|
|
4
|
+
readonly presets: readonly ["stylistic", "stylisticStrict"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "unnecessaryBlock", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=unnecessaryBlocks.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports unnecessary boolean casts.";
|
|
3
3
|
readonly id: "unnecessaryBooleanCasts";
|
|
4
|
-
readonly presets: ["logical"];
|
|
4
|
+
readonly presets: readonly ["logical"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "unnecessary", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=unnecessaryBooleanCasts.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports catch clauses that only rethrow the caught error without modification.";
|
|
3
3
|
readonly id: "unnecessaryCatches";
|
|
4
|
-
readonly presets: ["logical", "logicalStrict"];
|
|
4
|
+
readonly presets: readonly ["logical", "logicalStrict"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "unnecessaryCatch", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=unnecessaryCatches.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports comparisons that are always true, always false, or can be simplified.";
|
|
3
3
|
readonly id: "unnecessaryComparisons";
|
|
4
|
-
readonly presets: ["logical", "logicalStrict"];
|
|
4
|
+
readonly presets: readonly ["logical", "logicalStrict"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "impossibleRange" | "ineffectiveCheck" | "redundantComparison" | "selfComparison", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=unnecessaryComparisons.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports string concatenation using the + operator when both operands are string literals.";
|
|
3
3
|
readonly id: "unnecessaryConcatenation";
|
|
4
|
-
readonly presets: ["stylistic", "stylisticStrict"];
|
|
4
|
+
readonly presets: readonly ["stylistic", "stylisticStrict"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "unnecessaryConcatenation", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=unnecessaryConcatenation.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports unnecessary escape sequences in string literals and template strings.";
|
|
3
3
|
readonly id: "unnecessaryEscapes";
|
|
4
|
-
readonly presets: ["stylistic"];
|
|
4
|
+
readonly presets: readonly ["stylistic"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "unnecessary", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=unnecessaryEscapes.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports unnecessary Math.min and Math.max calls with constant arguments or incorrect clamping patterns.";
|
|
3
3
|
readonly id: "unnecessaryMathClamps";
|
|
4
|
-
readonly presets: ["logical"];
|
|
4
|
+
readonly presets: readonly ["logical"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "constantArguments" | "incorrectClampOrder", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=unnecessaryMathClamps.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports numeric literals with unnecessary zero fractions or dangling dots.";
|
|
3
3
|
readonly id: "unnecessaryNumericFractions";
|
|
4
|
-
readonly presets: ["stylistic"];
|
|
4
|
+
readonly presets: readonly ["stylistic"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "danglingDot" | "zeroFraction", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=unnecessaryNumericFractions.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Renames that don't change the identifier name are unnecessary.";
|
|
3
3
|
readonly id: "unnecessaryRenames";
|
|
4
|
-
readonly presets: ["stylistic"];
|
|
4
|
+
readonly presets: readonly ["stylistic"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "unnecessaryRename", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=unnecessaryRenames.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports ternary expressions that can be simplified to boolean expressions or logical operators";
|
|
3
3
|
readonly id: "unnecessaryTernaries";
|
|
4
|
-
readonly presets: ["stylistic", "stylisticStrict"];
|
|
4
|
+
readonly presets: readonly ["stylistic", "stylisticStrict"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "unnecessaryBooleanTernary" | "unnecessaryLogicalTernary", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=unnecessaryTernaries.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports unnecessary \"use strict\" directives in ES modules and classes.";
|
|
3
3
|
readonly id: "unnecessaryUseStricts";
|
|
4
|
-
readonly presets: ["logical"];
|
|
4
|
+
readonly presets: readonly ["logical"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "unnecessaryUseStrict", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=unnecessaryUseStricts.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports negating the left operand of `in` or `instanceof` relations.";
|
|
3
3
|
readonly id: "unsafeNegations";
|
|
4
|
-
readonly presets: ["javascript"];
|
|
4
|
+
readonly presets: readonly ["javascript"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "preferNegatingRelation", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=unsafeNegations.d.ts.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AST } from "@flint.fyi/typescript-language";
|
|
2
|
+
import ts from "typescript";
|
|
3
|
+
export declare const forEachChild: <T>(node: AST.AnyNode, cbNode: (node: AST.AnyNode) => T | undefined, cbNodes?: (nodes: ts.NodeArray<AST.AnyNode>) => T | undefined) => T | undefined;
|
|
4
|
+
//# sourceMappingURL=forEachChild.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports attempting to delete variables with the delete operator.";
|
|
3
3
|
readonly id: "variableDeletions";
|
|
4
|
-
readonly presets: ["javascript"];
|
|
4
|
+
readonly presets: readonly ["javascript"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "noDeleteVar", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=variableDeletions.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports using the void operator.";
|
|
3
3
|
readonly id: "voidOperator";
|
|
4
|
-
readonly presets: ["stylistic", "stylisticStrict"];
|
|
4
|
+
readonly presets: readonly ["stylistic", "stylisticStrict"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "noVoid", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=voidOperator.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
declare const _default: import("@flint.fyi/core").Rule<{
|
|
2
2
|
readonly description: "Reports using with statements";
|
|
3
3
|
readonly id: "withStatements";
|
|
4
|
-
readonly presets: ["javascript"];
|
|
4
|
+
readonly presets: readonly ["javascript"];
|
|
5
5
|
} & {
|
|
6
|
-
|
|
7
|
-
url: string;
|
|
8
|
-
},
|
|
6
|
+
readonly pluginId: string;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}, "withStatement", undefined>;
|
|
9
9
|
export default _default;
|
|
10
10
|
//# sourceMappingURL=withStatements.d.ts.map
|