:sparkles: Monorepo for all the tooling which enables ESLint to support TypeScript
This report summarizes scanner evidence for typescript-eslint/typescript-eslint, a TypeScript project with 16,461 GitHub stars. SynthScan examined 426,202 lines of code across 1625 source files, recording 418 pattern matches distributed across 8 syntactic categories. The legacy adjusted pattern signal is 1.2 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 412 finding(s).
Are imports declared and package/API names verified? 6 finding(s).
Are wrappers, guards, and repeated structures necessary? 374 finding(s).
Which changes need focused human review? 418 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 418 distinct pattern matches across 8 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …kages/project-service/src/throttleOpenedFileCleanup.ts | 18 | export function throttleOpenedFileCleanup( | CODE |
| LOW | …project-service/src/getParsedConfigFileFromTSServer.ts | 5 | export function getParsedConfigFileFromTSServer( | CODE |
| LOW | packages/rule-tester/tests/RuleTester.test.ts | 2792 | function generateIncompatibleValidTestCase(): ValidTestCase<unknown[]> { | CODE |
| LOW | packages/rule-tester/tests/RuleTester.test.ts | 2806 | function generateIncompatibleInvalidTestCase(): InvalidTestCase< | CODE |
| LOW | packages/rule-tester/src/RuleTester.ts | 150 | function getUnsubstitutedMessagePlaceholders( | CODE |
| LOW | packages/rule-tester/src/utils/SourceCodeFixer.ts | 16 | function compareMessagesByFixRange( | CODE |
| LOW | packages/rule-tester/src/utils/SourceCodeFixer.ts | 27 | function compareMessagesByLocation(a: LintMessage, b: LintMessage): number { | CODE |
| LOW | packages/rule-tester/src/utils/serialization.ts | 4 | function isSerializablePrimitiveOrPlainObject(val: unknown): boolean { | CODE |
| LOW | packages/rule-tester/src/utils/dependencyConstraints.ts | 12 | function satisfiesDependencyConstraint( | CODE |
| LOW | packages/rule-tester/src/utils/dependencyConstraints.ts | 33 | export function satisfiesAllDependencyConstraints( | CODE |
| LOW | packages/rule-tester/src/utils/validationHelpers.ts | 88 | function defineStartEndAsErrorInTree( | CODE |
| LOW | packages/rule-tester/src/utils/flat-config-schema.ts | 513 | function createEslintrcErrorSchema(key: string): ObjectPropertySchema { | CODE |
| LOW | packages/rule-tester/src/utils/severity.ts | 10 | export function normalizeSeverityToString( | CODE |
| LOW | packages/rule-tester/src/utils/severity.ts | 30 | export function normalizeSeverityToNumber( | CODE |
| LOW | …es/rule-tester/src/utils/omitCustomConfigProperties.ts | 3 | export function omitCustomConfigProperties( | CODE |
| LOW | …s/typescript-eslint/src/getTSConfigRootDirFromStack.ts | 11 | export function getTSConfigRootDirFromStack(): string | undefined { | CODE |
| LOW | …/typescript-estree/tests/test-utils/persistentParse.ts | 29 | export function setupPersistentParseTests(): void { | CODE |
| LOW | …kages/typescript-estree/tests/test-utils/test-utils.ts | 8 | export function parseCodeAndGenerateServices( | CODE |
| LOW | …ges/typescript-estree/tests/lib/parse.symlinks.test.ts | 36 | async function createProjectWithSymlinkedDirectory(): Promise<string> { | CODE |
| LOW | packages/typescript-estree/src/node-utils.ts | 382 | export function findFirstMatchingAncestor( | CODE |
| LOW | packages/typescript-estree/src/node-utils.ts | 408 | export function unescapeStringLiteralText(text: string): string { | CODE |
| LOW | packages/typescript-estree/src/node-utils.ts | 455 | export function isChildUnwrappableOptionalChain( | CODE |
| LOW | packages/typescript-estree/src/node-utils.ts | 884 | function isPropertyAccessEntityNameExpression( | CODE |
| LOW | packages/typescript-estree/src/parser.ts | 74 | function useSingleRunProgramForProjectService( | CODE |
| LOW | packages/typescript-estree/src/parser.ts | 139 | export function clearDefaultProjectMatchedFiles(): void { | CODE |
| LOW | packages/typescript-estree/src/parser.ts | 256 | export function clearParseAndGenerateServicesCalls(): void { | CODE |
| LOW | …/typescript-estree/src/semantic-or-syntactic-errors.ts | 21 | export function getFirstSemanticOrSyntacticError( | CODE |
| LOW | …/typescript-estree/src/semantic-or-syntactic-errors.ts | 61 | function allowlistSupportedDiagnostics( | CODE |
| LOW | …/typescript-estree/src/semantic-or-syntactic-errors.ts | 112 | function convertDiagnosticToSemanticOrSyntacticError( | CODE |
| LOW | …/typescript-estree/src/useProgramFromProjectService.ts | 63 | function openClientFileFromProjectService( | CODE |
| LOW | …/typescript-estree/src/useProgramFromProjectService.ts | 205 | function openClientFileAndMaybeReload(): ts.server.OpenConfiguredProjectResult { | CODE |
| LOW | …/typescript-estree/src/useProgramFromProjectService.ts | 235 | function getSymlinkedFilePathInProjects( | CODE |
| LOW | …/typescript-estree/src/useProgramFromProjectService.ts | 258 | function createNoProgramWithProjectService( | CODE |
| LOW⚡ | …/typescript-estree/src/useProgramFromProjectService.ts | 307 | export function useProgramFromProjectService( | CODE |
| LOW⚡ | …/typescript-estree/src/useProgramFromProjectService.ts | 313 | export function useProgramFromProjectService( | CODE |
| LOW⚡ | …/typescript-estree/src/useProgramFromProjectService.ts | 319 | export function useProgramFromProjectService( | CODE |
| LOW⚡ | …/typescript-estree/src/useProgramFromProjectService.ts | 325 | export function useProgramFromProjectService( | CODE |
| LOW | …/typescript-estree/src/getImportClausePhaseModifier.ts | 10 | export function getImportClausePhaseModifier( | CODE |
| LOW | packages/typescript-estree/src/check-syntax-errors.ts | 711 | function checkForStatementDeclaration( | CODE |
| LOW | packages/typescript-estree/src/check-modifiers.ts | 424 | function checkObjectPropertyModifier(node: ts.Node, modifier: ts.Modifier) { | CODE |
| LOW | …estree/src/create-program/createProjectProgramError.ts | 10 | export function createProjectProgramError( | CODE |
| LOW | packages/typescript-estree/src/create-program/shared.ts | 40 | export function createDefaultCompilerOptionsFromExtra( | CODE |
| LOW | packages/typescript-estree/src/create-program/shared.ts | 112 | export function createSymlinkedDirectories( | CODE |
| LOW | …c/create-program/validateDefaultProjectForFilesGlob.ts | 8 | export function validateDefaultProjectForFilesGlob( | CODE |
| LOW | …cript-estree/src/create-program/useProvidedPrograms.ts | 63 | export function createProgramFromConfigFile( | CODE |
| LOW | …tree/src/create-program/getWatchProgramsForProjects.ts | 143 | export function getWatchProgramsForProjects( | CODE |
| LOW | …escript-estree/src/parseSettings/warnAboutTSVersion.ts | 26 | function buildUnsupportedTSVersionMessage(severity: 'error' | 'warn'): string { | CODE |
| LOW | …escript-estree/src/parseSettings/warnAboutTSVersion.ts | 44 | export function handleUnsupportedTSVersion( | CODE |
| LOW | …script-estree/src/parseSettings/createParseSettings.ts | 260 | export function clearTSServerProjectService(): void { | CODE |
| LOW⚡ | …-estree/src/parseSettings/candidateTSConfigRootDirs.ts | 3 | export function addCandidateTSConfigRootDir(candidate: string): void { | CODE |
| LOW⚡ | …-estree/src/parseSettings/candidateTSConfigRootDirs.ts | 7 | export function clearCandidateTSConfigRootDirs(): void { | CODE |
| LOW⚡ | …-estree/src/parseSettings/candidateTSConfigRootDirs.ts | 11 | export function getInferredTSConfigRootDir(): string { | CODE |
| LOW | …s/generated-rule-docs/addESLintHashToCodeBlocksMeta.ts | 17 | export function addESLintHashToCodeBlocksMeta( | CODE |
| LOW | …ns/generated-rule-docs/insertions/insertRuleOptions.ts | 97 | function findCommentIndexForOption( | CODE |
| LOW | …-24-consistent-type-exports-and-imports-why-and-how.md | 113 | export function getAndLogValue(getter: GetString) { | CODE |
| LOW | …-24-consistent-type-exports-and-imports-why-and-how.md | 125 | export function getAndLogValue(getter: GetString) { | CODE |
| LOW⚡ | packages/website/src/components/lib/jsonSchema.ts | 24 | export function getRuleJsonSchemaWithErrorLevel( | CODE |
| LOW | …te/src/components/editor/createProvideTwoslashInlay.ts | 16 | export function createTwoslashInlayProvider( | CODE |
| LOW | …ges/website/src/theme/MDXComponents/RuleAttributes.tsx | 58 | export function getRecommendationWithEmoji( | CODE |
| LOW | …kages/integration-tests/tools/integration-test-base.ts | 110 | export function typescriptIntegrationTest( | CODE |
| 314 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL⚡ | packages/website/src/components/lib/jsonSchema.ts | 20 | * monaco.languages.json.jsonDefaults.diagnosticsOptions.schemas.find(item => item.uri.includes('typescript-eslint/consi | COMMENT |
| CRITICAL⚡ | packages/website/src/components/lib/jsonSchema.ts | 21 | * monaco.languages.json.jsonDefaults.diagnosticsOptions.schemas.find(item => item.uri.includes('no-unused-labels')) | COMMENT |
| CRITICAL⚡ | packages/website/src/components/lib/jsonSchema.ts | 22 | * monaco.languages.json.jsonDefaults.diagnosticsOptions.schemas.filter(item => item.schema.type === 'array') | COMMENT |
| CRITICAL | …kages/eslint-plugin/tests/rules/no-unsafe-call.test.ts | 129 | x.a.b.c.d.e.f.g(); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/website-eslint/src/mock/assert.js | 1 | // Copyright Joyent, Inc. and other Node contributors. | COMMENT |
| LOW | packages/website-eslint/src/mock/path.js | 1 | /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ | COMMENT |
| LOW | packages/utils/src/eslint-utils/getParserServices.ts | 61 | context: Readonly<TSESLint.RuleContext<string, unknown[]>>, | COMMENT |
| LOW | packages/type-utils/tests/TypeOrValueSpecifier.test.ts | 421 | // }, | COMMENT |
| LOW | …nt-plugin/tests/rules/no-unnecessary-condition.test.ts | 3421 | ], | COMMENT |
| LOW | …ckages/eslint-plugin/tests/rules/require-await.test.ts | 861 | { | COMMENT |
| LOW | …ckages/eslint-plugin/src/util/getOperatorPrecedence.ts | 21 | // ConditionalExpression | COMMENT |
| LOW | …ckages/eslint-plugin/src/util/getOperatorPrecedence.ts | 41 | // `*=` `/=` `%=` `+=` `-=` `<<=` `>>=` `>>>=` `&=` `^=` `|=` `**=` | COMMENT |
| LOW | …ckages/eslint-plugin/src/util/getOperatorPrecedence.ts | 61 | COMMENT | |
| LOW | …ckages/eslint-plugin/src/util/getOperatorPrecedence.ts | 81 | COMMENT | |
| LOW | …ckages/eslint-plugin/src/util/getOperatorPrecedence.ts | 101 | // RelationalExpression `instanceof` ShiftExpression | COMMENT |
| LOW | …ckages/eslint-plugin/src/util/getOperatorPrecedence.ts | 121 | // MultiplicativeExpression MultiplicativeOperator ExponentiationExpression | COMMENT |
| LOW | …ckages/eslint-plugin/src/util/getOperatorPrecedence.ts | 141 | // `++` UnaryExpression | COMMENT |
| LOW | …ckages/eslint-plugin/src/util/getOperatorPrecedence.ts | 161 | // SuperCall | COMMENT |
| LOW | …ckages/eslint-plugin/src/util/getOperatorPrecedence.ts | 181 | // Literal | COMMENT |
| LOW | …lint-plugin/src/rules/no-unnecessary-type-assertion.ts | 101 | 'strictNullChecks', | COMMENT |
| LOW | …plugin/src/rules/no-unnecessary-template-expression.ts | 281 | // "'va`lue'" -> "va`lue" | COMMENT |
| LOW | …es/eslint-plugin/src/rules/no-unnecessary-condition.ts | 461 | COMMENT | |
| LOW | packages/eslint-plugin/src/rules/no-deprecated.ts | 301 | // /** @deprecated Some Reason */ | COMMENT |
| LOW | …ges/eslint-plugin/src/rules/consistent-type-imports.ts | 301 | unusedSpecifiers, | COMMENT |
| LOW | …ges/eslint-plugin/src/rules/consistent-type-imports.ts | 321 | // choose with option (2) and just avoid reporting on any imports in a | COMMENT |
| LOW | …ges/eslint-plugin/src/rules/consistent-type-exports.ts | 141 | // Things get a lot more complicated when we're dealing with | COMMENT |
| LOW | packages/eslint-plugin/src/rules/no-unused-vars.ts | 581 | // 1) there is at least one specifier that is used | COMMENT |
| LOW | packages/eslint-plugin/src/rules/no-unused-vars.ts | 701 | // | COMMENT |
| LOW | …/src/rules/prefer-optional-chain-utils/analyzeChain.ts | 421 | for (const operand of chain) { | COMMENT |
| LOW | …/src/rules/prefer-optional-chain-utils/analyzeChain.ts | 441 | // conditions in the user's code where there were none before - and it would | COMMENT |
| LOW | …/src/rules/prefer-optional-chain-utils/analyzeChain.ts | 761 | ); | COMMENT |
| LOW | …/src/rules/prefer-optional-chain-utils/analyzeChain.ts | 841 | ) | COMMENT |
| LOW | …/src/rules/prefer-optional-chain-utils/compareNodes.ts | 121 | return NodeComparisonResult.Equal; | COMMENT |
| LOW | …/src/rules/prefer-optional-chain-utils/compareNodes.ts | 161 | // but we want to try comparing by discarding the "extra" code | COMMENT |
| LOW | …/src/rules/prefer-optional-chain-utils/compareNodes.ts | 301 | // ^^^^^^^ nodeA | COMMENT |
| LOW | packages/eslint-plugin/src/rules/enum-utils/shared.ts | 81 | // ```ts | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packages/eslint-plugin/src/rules/member-ordering.ts | 966 | * @return True if all members are correctly sorted. | COMMENT |
| HIGH | packages/eslint-plugin/src/rules/member-ordering.ts | 1045 | * @return True if all required and optional members are correctly sorted. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | packages/eslint-plugin/src/rules/no-inferrable-types.ts | 276 | // Essentially a readonly property without a type | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/workflows/pr-title-validation.yml | 1 | # IMPORTANT: Do not reuse old name of "Semantic PR Titles" here | COMMENT |
| LOW | .github/workflows/breaking-change-validation.yml | 1 | # IMPORTANT: Do not reuse old name of "Semantic Breaking Change PR Test" here | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pnpm-lock.yaml | 6040 | deprecated: Renamed to emoji-blast. Let me know if you need help renaming. :) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …sts/rules/no-unused-vars/no-unused-vars-eslint.test.ts | 278 | var doSomething = function doSomething() {}; | CODE |
| LOW | …-plugin/tests/rules/no-shadow/no-shadow-eslint.test.ts | 28 | var doSomething = function doSomething() {}; | CODE |