Redefined chart library built with React and D3
This report summarizes scanner evidence for recharts/recharts, a TypeScript project with 27,675 GitHub stars. SynthScan examined 281,486 lines of code across 1595 source files, recording 195 pattern matches distributed across 5 syntactic categories. The legacy adjusted pattern signal is 0.7 (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? 191 finding(s).
Are imports declared and package/API names verified? 4 finding(s).
Are wrappers, guards, and repeated structures necessary? 164 finding(s).
Which changes need focused human review? 195 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 195 distinct pattern matches across 5 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 | test-vr/tests/www/RangedAreaTemplate.tsx | 39 | function RangedAreaTemplateWithChartBaseValue({ | CODE |
| LOW | test-vr/tests/www/RangedAreaTemplate.tsx | 56 | export function AreaRangeViaBaseValueNumber() { | CODE |
| LOW | test-vr/tests/www/RangedAreaTemplate.tsx | 74 | export function AreaRangeViaChartBaseValueNumber() { | CODE |
| LOW | test-vr/tests/www/RangedAreaTemplate.tsx | 91 | export function AreaRangeViaBaseValueDataMin() { | CODE |
| LOW | test-vr/tests/www/RangedAreaTemplate.tsx | 109 | export function AreaRangeViaChartBaseValueDataMax() { | CODE |
| LOW | test-vr/tests/www/RangedAreaTemplate.tsx | 126 | export function AreaRangeViaBaseValueDataMax() { | CODE |
| LOW | test-vr/tests/theme/ScatterTheme.story.tsx | 70 | export function ScatterFillStrokeVariants() { | CODE |
| LOW | test-vr/tests/theme/RadialBarTheme.story.tsx | 56 | export function RadialBarFillStrokeVariants() { | CODE |
| LOW | test-vr/tests/theme/AreaTheme.story.tsx | 65 | export function UnthemedAreaWithCustomDot() { | CODE |
| LOW | test-vr/tests/theme/TreemapTheme.story.tsx | 59 | export function TreemapFillStrokeVariants() { | CODE |
| LOW | test-vr/tests/theme/TreemapTheme.story.tsx | 85 | export function TreemapColorPanelNestedTooltip() { | CODE |
| LOW | test-vr/tests/theme/PolarRadiusAxisTheme.story.tsx | 11 | function PolarRadiusAxisThemeChart() { | CODE |
| LOW | test-vr/tests/theme/PolarRadiusAxisTheme.story.tsx | 21 | export function PolarRadiusAxisThemeComparison() { | CODE |
| LOW | test-vr/tests/theme/SunburstTheme.story.tsx | 38 | export function SunburstFillStrokeVariants() { | CODE |
| LOW | test-vr/tests/theme/PolarAngleAxisTheme.story.tsx | 23 | export function PolarAngleAxisThemeComparison() { | CODE |
| LOW | test-vr/tests/ReferenceLine/ifOverflow.story.tsx | 5 | function IfOverflowTestWithSegment(props: { ifOverflow: IfOverflow | undefined }) { | CODE |
| LOW | test/cartesian/GraphicalItemClipPath.spec.tsx | 198 | const { spy } = renderTestCase(function useNeedsClipNumericalOverflow() { | CODE |
| LOW | test/cartesian/Brush.spec.tsx | 720 | function ControlledBrushWithChangingData({ children }: { children: React.ReactNode }) { | CODE |
| LOW | test/cartesian/Bar.zeroDimensionFiltering.spec.tsx | 15 | function generateSparseStackedData(totalCategories: number, nonZeroCount: number) { | CODE |
| LOW | test/cartesian/Scatter.animation.spec.tsx | 94 | function getAllScatterPointPathsDs(container: Element): ReadonlyArray<string | null> { | CODE |
| LOW | test/cartesian/Area.animation.spec.tsx | 37 | function expectPathToInterpolateLinearly( | CODE |
| LOW | test/cartesian/Area.animation.spec.tsx | 175 | async function expectAreaCurveDoesNotChange(container: Element, animationManager: MockAnimationManager) { | CODE |
| LOW | test/cartesian/Area.animation.spec.tsx | 240 | async function expectLabelsHideDuringAnimation(container: Element, animationManager: MockAnimationManager) { | CODE |
| LOW | test/cartesian/Area.animation.spec.tsx | 256 | async function horizontalClipPathAnimation( | CODE |
| LOW | test/cartesian/Funnel.animation.spec.tsx | 21 | async function expectAnimatedFunnelPaths( | CODE |
| LOW | test/cartesian/CartesianGrid/CartesianGrid.spec.tsx | 45 | function expectHorizontalGridLines(container: Element, expectedLines: ReadonlyArray<ExpectedHorizontalLine>) { | CODE |
| LOW | test/polar/PolarGrid.theme.spec.tsx | 26 | function getFirstConcentricPolygon(container: HTMLElement): Element { | CODE |
| LOW | test/polar/PolarGrid.spec.tsx | 940 | function RadialBarChartWithMultipleAxesWrapper({ children }: { children: React.ReactNode }) { | CODE |
| LOW | test/polar/Radar.animation.spec.tsx | 51 | async function expectAnimatedRadarPolygons( | CODE |
| LOW | test/polar/PolarAngleAxis/PolarAngleAxis.spec.tsx | 67 | function expectAngleAxisTickLabels(container: Element, expectedLabels: ReadonlyArray<ExpectedAxisTickLabel>) { | CODE |
| LOW | test/polar/RadialBar/RadialBar.animation.spec.tsx | 17 | async function expectAnimatedRadialBarPaths( | CODE |
| LOW | test/shape/Rectangle.animation.spec.tsx | 87 | async function expectAnimatedStrokeDasharray(container: HTMLElement, animationManager: MockAnimationManager) { | CODE |
| LOW | test/util/noUndefinedInDom.spec.tsx | 6 | function attributesContainingUndefined(container: Element): string[] { | CODE |
| LOW | test/chart/PieChart.spec.tsx | 248 | function assertActiveShapeInteractions(container: HTMLElement, selectors: string) { | CODE |
| LOW | test/chart/RadialBarChart.spec.tsx | 13 | function assertActiveShapeInteractions(container: HTMLElement) { | CODE |
| LOW | test/chart/ScatterChart.spec.tsx | 401 | function assertActiveShapeInteractions(container: HTMLElement) { | CODE |
| LOW | test/chart/AccessibilityLayer.spec.tsx | 67 | function assertNoKeyboardInteractions(container: HTMLElement) { | CODE |
| LOW | test/chart/BarChart.spec.tsx | 67 | function assertActiveBarInteractions(container: HTMLElement) { | CODE |
| LOW | test/animation/legacyAnimationLengthChange.spec.tsx | 257 | function renderChartWithSelectorSpy(chart: ChartWrapper) { | CODE |
| LOW | test/animation/legacyAnimationLengthChange.spec.tsx | 277 | async function completeLengthChangeAnimation(renderResult: ReturnType<typeof renderChartWithSelectorSpy>) { | CODE |
| LOW | test/component/Label.background.spec.tsx | 248 | function expectAllBackgroundsBelowAllTexts(container: Element) { | CODE |
| LOW | test/component/Legend/Legend.itemSorter.spec.tsx | 401 | function MyLegendHidingLineChartTestCase({ children }: { children: ReactNode }) { | CODE |
| LOW | test/component/Legend/Legend.itemSorter.spec.tsx | 478 | function MyLegendHidingAreaChartTestCase({ children }: { children: ReactNode }) { | CODE |
| LOW | test/component/Tooltip/tooltipTestHelpers.tsx | 97 | export function showTooltipOnCoordinateTouch( | CODE |
| LOW | …electors/combiners/combineDisplayedStackedData.spec.ts | 21 | function createMockBaseCartesianAxis(partialBaseAxis: Partial<BaseCartesianAxis>): BaseCartesianAxis { | CODE |
| LOW | test/hooks/useAxisScale.spec.tsx | 226 | function useCartesianScaleNumerical() { | CODE |
| LOW | test/helper/selectorTestHelpers.tsx | 9 | export function shouldReturnUndefinedOutOfContext(selector: Selector<RechartsRootState, unknown, never>): void { | CODE |
| LOW | test/helper/mockGetComputedTextLength.ts | 4 | export function mockGetComputedTextLength(length: number): void { | CODE |
| LOW | test/helper/mockGetComputedTextLength.ts | 12 | export function restoreMockGetComputedTextLength(): void { | CODE |
| LOW | test/helper/consoleWarningToError.ts | 79 | export function setupConsoleWarningToError(): void { | CODE |
| LOW | test/helper/logAllReduxActionsMiddleware.ts | 1 | export function logAllReduxActionsMiddleware(actionsThatLogPayload?: RegExp) { | CODE |
| LOW | test/helper/mockGetBoundingClientRect.ts | 34 | export function mockGetBoundingClientRect(rect: Partial<DOMRect>, mockClientHeightWidth = true): void { | CODE |
| LOW | test/helper/mockGetBoundingClientRect.ts | 52 | export function mockSequenceOfGetBoundingClientRect( | CODE |
| LOW | test/helper/mockHTMLElementProperty.ts | 15 | export function restoreHTMLElementProperties() { | CODE |
| LOW | test/helper/createSelectorTestCase.tsx | 201 | export function createSynchronisedSelectorTestCase( | CODE |
| LOW | test/helper/expectScale.ts | 49 | export function expectLastCalledWithScale(spy: Mock<(scale: RechartsScale) => unknown>, expected: ExpectedScale) { | CODE |
| LOW | test/helper/mockGetTotalLength.ts | 28 | export function restoreMockGetTotalLength(): void { | CODE |
| LOW | test/helper/expectStackGroups.ts | 68 | function rechartsStackedDataMatcher( | CODE |
| LOW | test/helper/expectStackGroups.ts | 88 | function rechartsStackedSeriesMatcher( | CODE |
| LOW | test/helper/expectStackGroups.ts | 108 | function rechartsStackedSeriesPointMatcher(received: StackDataPoint, expected: StackDataPoint): SyncExpectationResult { | CODE |
| 104 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .agents/shared/suppression-targets/WORKFLOW.md | 36 | ## Step 1: Start from a clean, current `main` | COMMENT |
| LOW | .agents/shared/suppression-targets/WORKFLOW.md | 59 | ## Step 2: Pick the target | COMMENT |
| LOW | .agents/shared/suppression-targets/WORKFLOW.md | 99 | ## Step 3: Create the branch | COMMENT |
| LOW | .agents/shared/suppression-targets/WORKFLOW.md | 130 | ## Step 6: Verify | COMMENT |
| LOW | .agents/shared/suppression-targets/WORKFLOW.md | 185 | ## Step 7: Decide the outcome | COMMENT |
| LOW | .agents/shared/suppression-targets/WORKFLOW.md | 251 | ## Step 8: Commit, push, and open the PR | COMMENT |
| LOW | .agents/shared/suppression-targets/WORKFLOW.md | 295 | ## Step 9: Report | COMMENT |
| LOW | .agents/skills/fix-type-violation/SKILL.md | 40 | ## Step 4: Understand each violation | COMMENT |
| LOW | .agents/skills/fix-type-violation/SKILL.md | 56 | ## Step 5: Fix the violations | COMMENT |
| LOW | .agents/skills/fix-type-violation/SKILL.md | 264 | ## Step 7: Give up criteria | COMMENT |
| LOW | .agents/skills/fix-type-violation/SKILL.md | 281 | ## Step 8: Commit message and PR title | COMMENT |
| LOW | .agents/skills/fix-perf-violation/SKILL.md | 58 | ## Step 4: Understand each violation | COMMENT |
| LOW | .agents/skills/fix-perf-violation/SKILL.md | 69 | ## Step 5: Fix the violations | COMMENT |
| LOW | .agents/skills/fix-perf-violation/SKILL.md | 207 | ## Step 7: Give up criteria | COMMENT |
| LOW | .agents/skills/fix-perf-violation/SKILL.md | 226 | ## Step 8: Commit message and PR title | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | storybook/css.d.ts | 1 | // Ambient CSS module declaration for Vite-bundled storybook. | COMMENT |
| LOW | test/cartesian/Bar/Bar.typed.spec.tsx | 141 | expectBars(container, []); | COMMENT |
| LOW | test/cartesian/Bar/Bar.typed.spec.tsx | 161 | // it('should allow when Bar data is matching Bar dataKey as function', () => { | COMMENT |
| LOW | test/cartesian/Bar/Bar.typed.spec.tsx | 181 | // * TypeScript can show errors here. | COMMENT |
| LOW | test/component/Legend/Legend.spec.tsx | 541 | // For Label "top", verticalAnchor is 'end' (above the point y). | COMMENT |
| LOW | test/component/Tooltip/Tooltip.sync.spec.tsx | 241 | // <XAxis dataKey="uv" name="stature" unit="cm" /> | COMMENT |
| LOW | test/component/Tooltip/Tooltip.sync.spec.tsx | 261 | // TODO: support synchronization in Sankey, Sunburst, Treemap | COMMENT |
| LOW | test/component/Tooltip/Tooltip.sync.spec.tsx | 281 | // expectedTransform: 'transform: translate(285px, 210px);', | COMMENT |
| LOW | .github/workflows/npm-publish.yml | 1 | # This workflow installs dependencies, builds the package, and publishes it to npm when a release is created | COMMENT |
| LOW | src/polar/Radar.tsx | 441 | * Radar provides a Cartesian label list context. Do we want to also provide a polar label list context? | COMMENT |
| LOW | src/util/resolveDefaultProps.tsx | 121 | // - Pick<T, Extract<...>>: Selects these specific properties from T. At this stage, they still retain their origina | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test-vr/tests/LegendPosition.story.tsx | 69 | const veryLongText1 = 'Lorem Ipsum dolor sit amet, consectetur adipiscing elit. '.repeat(3); | CODE |
| LOW | test-vr/tests/LegendPosition.story.tsx | 69 | const veryLongText1 = 'Lorem Ipsum dolor sit amet, consectetur adipiscing elit. '.repeat(3); | CODE |
| LOW | …exampleComponents/SunburstChart/BundleSizeSunburst.tsx | 198 | generatedAt: 'placeholder', | CODE |
| LOW | …c/docs/exampleComponents/TreeMap/BundleSizeTreemap.tsx | 198 | generatedAt: 'placeholder', | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/workflows/sync-playwright-versions.yml | 64 | # Check if there are changes to commit before creating a commit. | COMMENT |