Skip to content

refactor(app): restructure plugins into directory modules - #469

Closed
alfredo1996 wants to merge 1 commit into
release/1.1from
refactor/issue-421-plugin-directories
Closed

refactor(app): restructure plugins into directory modules#469
alfredo1996 wants to merge 1 commit into
release/1.1from
refactor/issue-421-plugin-directories

Conversation

@alfredo1996

@alfredo1996 alfredo1996 commented Apr 9, 2026

Copy link
Copy Markdown
Owner

Summary

Restructures all 17 chart plugins from flat files into self-contained directory modules:

Before:

plugins/bar.tsx
plugins/settings/bar.ts
plugins/transforms/bar.ts

After:

plugins/bar/
├── component.tsx   (plugin definition + React component)
├── settings.ts     (Zod settings schema)
├── transform.ts    (data transform function)
└── index.ts        (re-exports plugin)

77 files changed. Zero functional changes — pure file moves + import updates.

Test plan

  • npm -w app run build — passes
  • npm -w app run test — 132 files, 1760 tests pass

Closes #421

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Refactor
    • Reorganized plugin module structure to improve code organization and maintainability.
    • Consolidated plugin imports and file structure.
    • Removed centralized settings export from the plugins directory; settings must now be imported from individual plugin locations.

@alfredo1996 alfredo1996 added pkg:app Next.js application package area:charts Chart rendering refactor Code refactoring labels Apr 9, 2026
@coderabbitai

coderabbitai Bot commented Apr 9, 2026

Copy link
Copy Markdown

Warning

Rate limit exceeded

@alfredo1996 has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 17 minutes and 45 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 17 minutes and 45 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: ffac7592-9e22-4e1c-a341-8515dceb67c3

📥 Commits

Reviewing files that changed from the base of the PR and between e8258d8 and b80c3e9.

📒 Files selected for processing (77)
  • app/src/plugins/bar/component.tsx
  • app/src/plugins/bar/index.ts
  • app/src/plugins/bar/settings.ts
  • app/src/plugins/bar/transform.ts
  • app/src/plugins/form/component.tsx
  • app/src/plugins/form/index.ts
  • app/src/plugins/form/settings.ts
  • app/src/plugins/gauge/component.tsx
  • app/src/plugins/gauge/index.ts
  • app/src/plugins/gauge/settings.ts
  • app/src/plugins/gauge/transform.ts
  • app/src/plugins/graph/component.tsx
  • app/src/plugins/graph/index.ts
  • app/src/plugins/graph/settings.ts
  • app/src/plugins/graph/transform.ts
  • app/src/plugins/iframe/component.tsx
  • app/src/plugins/iframe/index.ts
  • app/src/plugins/iframe/settings.ts
  • app/src/plugins/index.ts
  • app/src/plugins/json/component.tsx
  • app/src/plugins/json/index.ts
  • app/src/plugins/json/settings.ts
  • app/src/plugins/json/transform.ts
  • app/src/plugins/line/component.tsx
  • app/src/plugins/line/index.ts
  • app/src/plugins/line/settings.ts
  • app/src/plugins/line/transform.ts
  • app/src/plugins/map/component.tsx
  • app/src/plugins/map/index.ts
  • app/src/plugins/map/settings.ts
  • app/src/plugins/map/transform.ts
  • app/src/plugins/markdown/component.tsx
  • app/src/plugins/markdown/index.ts
  • app/src/plugins/markdown/settings.ts
  • app/src/plugins/parameter-select/component.tsx
  • app/src/plugins/parameter-select/index.ts
  • app/src/plugins/parameter-select/settings.ts
  • app/src/plugins/parameter-select/transform.ts
  • app/src/plugins/pie/component.tsx
  • app/src/plugins/pie/index.ts
  • app/src/plugins/pie/settings.ts
  • app/src/plugins/pie/transform.ts
  • app/src/plugins/radar/component.tsx
  • app/src/plugins/radar/index.ts
  • app/src/plugins/radar/settings.ts
  • app/src/plugins/radar/transform.ts
  • app/src/plugins/sankey/component.tsx
  • app/src/plugins/sankey/index.ts
  • app/src/plugins/sankey/settings.ts
  • app/src/plugins/sankey/transform.ts
  • app/src/plugins/settings/__tests__/settings-schemas.test.ts
  • app/src/plugins/settings/index.ts
  • app/src/plugins/single-value/component.tsx
  • app/src/plugins/single-value/index.ts
  • app/src/plugins/single-value/settings.ts
  • app/src/plugins/single-value/transform.ts
  • app/src/plugins/sunburst/component.tsx
  • app/src/plugins/sunburst/index.ts
  • app/src/plugins/sunburst/settings.ts
  • app/src/plugins/sunburst/transform.ts
  • app/src/plugins/table/component.tsx
  • app/src/plugins/table/index.ts
  • app/src/plugins/table/settings.ts
  • app/src/plugins/table/transform.ts
  • app/src/plugins/transforms/__tests__/bar.test.ts
  • app/src/plugins/transforms/__tests__/graph.test.ts
  • app/src/plugins/transforms/__tests__/line.test.ts
  • app/src/plugins/transforms/__tests__/pie.test.ts
  • app/src/plugins/transforms/__tests__/remaining.test.ts
  • app/src/plugins/transforms/__tests__/shared.test.ts
  • app/src/plugins/transforms/hierarchical-utils.ts
  • app/src/plugins/transforms/index.ts
  • app/src/plugins/transforms/shared-utils.ts
  • app/src/plugins/treemap/component.tsx
  • app/src/plugins/treemap/index.ts
  • app/src/plugins/treemap/settings.ts
  • app/src/plugins/treemap/transform.ts

Walkthrough

This PR restructures the plugin module architecture by adding index.ts entrypoints to each plugin directory for consistent re-export patterns, consolidating import paths to parent directories (../registry, ../utils), reorganizing per-plugin transform and settings modules, removing the centralized settings barrel, and updating corresponding test and barrel re-export imports.

Changes

Cohort / File(s) Summary
Plugin Components - Import Path Updates
app/src/plugins/bar/component.tsx, app/src/plugins/form/component.tsx, app/src/plugins/gauge/component.tsx, app/src/plugins/graph/component.tsx, app/src/plugins/iframe/component.tsx, app/src/plugins/json/component.tsx, app/src/plugins/line/component.tsx, app/src/plugins/map/component.tsx, app/src/plugins/markdown/component.tsx, app/src/plugins/parameter-select/component.tsx, app/src/plugins/pie/component.tsx, app/src/plugins/radar/component.tsx, app/src/plugins/sankey/component.tsx, app/src/plugins/single-value/component.tsx, app/src/plugins/sunburst/component.tsx, app/src/plugins/table/component.tsx, app/src/plugins/treemap/component.tsx
Updated imports to reference parent/consolidated modules: ./registry../registry, ./utils../utils, ./transforms/<plugin>./transform, ./settings/<plugin>./settings.
Plugin Index Entrypoints - New Re-exports
app/src/plugins/bar/index.ts, app/src/plugins/form/index.ts, app/src/plugins/gauge/index.ts, app/src/plugins/graph/index.ts, app/src/plugins/iframe/index.ts, app/src/plugins/json/index.ts, app/src/plugins/line/index.ts, app/src/plugins/map/index.ts, app/src/plugins/markdown/index.ts, app/src/plugins/parameter-select/index.ts, app/src/plugins/pie/index.ts, app/src/plugins/radar/index.ts, app/src/plugins/sankey/index.ts, app/src/plugins/single-value/index.ts, app/src/plugins/sunburst/index.ts, app/src/plugins/table/index.ts, app/src/plugins/treemap/index.ts
Added index.ts files that re-export each plugin from its component module, establishing consistent entry points for plugin imports.
Plugin Transform Shared Utilities
app/src/plugins/bar/transform.ts, app/src/plugins/gauge/transform.ts, app/src/plugins/graph/transform.ts, app/src/plugins/json/transform.ts, app/src/plugins/line/transform.ts, app/src/plugins/map/transform.ts, app/src/plugins/parameter-select/transform.ts, app/src/plugins/pie/transform.ts, app/src/plugins/radar/transform.ts, app/src/plugins/sankey/transform.ts, app/src/plugins/single-value/transform.ts, app/src/plugins/table/transform.ts
Updated shared utilities imports from ./shared to ../transforms/shared-utils, consolidating transformation helpers location.
Hierarchical Transform Consolidation
app/src/plugins/sunburst/transform.ts, app/src/plugins/treemap/transform.ts, app/src/plugins/transforms/hierarchical-utils.ts
Reorganized hierarchical transform utilities: ./hierarchical../transforms/hierarchical-utils, and updated local import from ./shared./shared-utils.
Main Plugin Registry
app/src/plugins/index.ts
Updated built-in plugin imports to use /component subpaths (e.g., ./bar/component instead of ./bar), reflecting the new plugin module structure.
Transforms Barrel Re-exports
app/src/plugins/transforms/index.ts
Remapped chart-specific transform re-exports to point to ../<plugin>/transform paths, shared utilities to ./shared-utils, and hierarchical utilities to ./hierarchical-utils.
Settings Barrel Removal
app/src/plugins/settings/index.ts
Removed centralized settings barrel that previously re-exported all chart setting schemas and inferred types.
Test Import Updates - Transforms
app/src/plugins/transforms/__tests__/bar.test.ts, app/src/plugins/transforms/__tests__/graph.test.ts, app/src/plugins/transforms/__tests__/line.test.ts, app/src/plugins/transforms/__tests__/pie.test.ts, app/src/plugins/transforms/__tests__/remaining.test.ts, app/src/plugins/transforms/__tests__/shared.test.ts
Updated test imports to source transforms and shared utilities from their new module locations (../../<plugin>/transform, ../shared-utils).
Test Import Updates - Settings
app/src/plugins/settings/__tests__/settings-schemas.test.ts
Updated test imports to source all chart setting schemas from their respective plugin directories (../../<plugin>/settings).

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

Possibly related PRs

Suggested labels

app, refactor

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title accurately describes the main change: restructuring plugins into directory modules. It is concise, clear, and reflects the primary objective of the changeset.
Linked Issues check ✅ Passed All coding requirements from issue #421 are met: plugins converted to directory modules [#421], import paths updated across plugins/index.ts and component files [#421], no behavioral changes [#421], and full test suite validates no regressions [#421].
Out of Scope Changes check ✅ Passed All changes are strictly scoped to the directory module restructuring: moving files into plugin directories, updating import paths, and creating index.ts re-exports. No unrelated functionality, dependencies, or feature work introduced.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/issue-421-plugin-directories

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
app/src/plugins/index.ts (1)

19-35: Prefer plugin directory entrypoints over /component internals.

Lines 19–35 import internal component modules directly. Since this PR adds per-plugin index.ts barrels, importing ./<plugin> would better preserve module boundaries and reduce future churn if internals move again.

♻️ Suggested import cleanup
-import { markdownPlugin } from "./markdown/component";
-import { barPlugin } from "./bar/component";
-import { linePlugin } from "./line/component";
-import { piePlugin } from "./pie/component";
-import { singleValuePlugin } from "./single-value/component";
-import { graphPlugin } from "./graph/component";
-import { mapPlugin } from "./map/component";
-import { tablePlugin } from "./table/component";
-import { parameterSelectPlugin } from "./parameter-select/component";
-import { jsonPlugin } from "./json/component";
-import { formPlugin } from "./form/component";
-import { iframePlugin } from "./iframe/component";
-import { gaugePlugin } from "./gauge/component";
-import { sankeyPlugin } from "./sankey/component";
-import { sunburstPlugin } from "./sunburst/component";
-import { radarPlugin } from "./radar/component";
-import { treemapPlugin } from "./treemap/component";
+import { markdownPlugin } from "./markdown";
+import { barPlugin } from "./bar";
+import { linePlugin } from "./line";
+import { piePlugin } from "./pie";
+import { singleValuePlugin } from "./single-value";
+import { graphPlugin } from "./graph";
+import { mapPlugin } from "./map";
+import { tablePlugin } from "./table";
+import { parameterSelectPlugin } from "./parameter-select";
+import { jsonPlugin } from "./json";
+import { formPlugin } from "./form";
+import { iframePlugin } from "./iframe";
+import { gaugePlugin } from "./gauge";
+import { sankeyPlugin } from "./sankey";
+import { sunburstPlugin } from "./sunburst";
+import { radarPlugin } from "./radar";
+import { treemapPlugin } from "./treemap";
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/plugins/index.ts` around lines 19 - 35, Update the imports in
app/src/plugins/index.ts to use each plugin's public barrel entrypoint instead
of their internal component paths: replace imports like markdownPlugin from
"./markdown/component", barPlugin from "./bar/component", linePlugin from
"./line/component", etc., with imports from "./markdown", "./bar", "./line",
"./pie", "./single-value", "./graph", "./map", "./table", "./parameter-select",
"./json", "./form", "./iframe", "./gauge", "./sankey", "./sunburst", "./radar",
and "./treemap" respectively so the file imports the exported plugin symbols
(markdownPlugin, barPlugin, linePlugin, piePlugin, singleValuePlugin,
graphPlugin, mapPlugin, tablePlugin, parameterSelectPlugin, jsonPlugin,
formPlugin, iframePlugin, gaugePlugin, sankeyPlugin, sunburstPlugin,
radarPlugin, treemapPlugin) from their package-level index.ts barrel.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@app/src/plugins/transforms/__tests__/line.test.ts`:
- Line 2: The test currently importing transformToLineData and validateLineData
from "../../line/transform" should be moved so it lives next to the module under
test: relocate the file from app/src/plugins/transforms/__tests__/line.test.ts
into app/src/plugins/line/__tests__/line.test.ts, update any relative import
paths if necessary (ensure the import still points to "../../line/transform" or
adjust to "./../transform" as appropriate), and run tests to confirm imports for
transformToLineData and validateLineData resolve correctly from the new
location.

---

Nitpick comments:
In `@app/src/plugins/index.ts`:
- Around line 19-35: Update the imports in app/src/plugins/index.ts to use each
plugin's public barrel entrypoint instead of their internal component paths:
replace imports like markdownPlugin from "./markdown/component", barPlugin from
"./bar/component", linePlugin from "./line/component", etc., with imports from
"./markdown", "./bar", "./line", "./pie", "./single-value", "./graph", "./map",
"./table", "./parameter-select", "./json", "./form", "./iframe", "./gauge",
"./sankey", "./sunburst", "./radar", and "./treemap" respectively so the file
imports the exported plugin symbols (markdownPlugin, barPlugin, linePlugin,
piePlugin, singleValuePlugin, graphPlugin, mapPlugin, tablePlugin,
parameterSelectPlugin, jsonPlugin, formPlugin, iframePlugin, gaugePlugin,
sankeyPlugin, sunburstPlugin, radarPlugin, treemapPlugin) from their
package-level index.ts barrel.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 09ebe924-f87d-4e6c-97b4-ae54c1060f6e

📥 Commits

Reviewing files that changed from the base of the PR and between 7e7023d and e8258d8.

📒 Files selected for processing (77)
  • app/src/plugins/bar/component.tsx
  • app/src/plugins/bar/index.ts
  • app/src/plugins/bar/settings.ts
  • app/src/plugins/bar/transform.ts
  • app/src/plugins/form/component.tsx
  • app/src/plugins/form/index.ts
  • app/src/plugins/form/settings.ts
  • app/src/plugins/gauge/component.tsx
  • app/src/plugins/gauge/index.ts
  • app/src/plugins/gauge/settings.ts
  • app/src/plugins/gauge/transform.ts
  • app/src/plugins/graph/component.tsx
  • app/src/plugins/graph/index.ts
  • app/src/plugins/graph/settings.ts
  • app/src/plugins/graph/transform.ts
  • app/src/plugins/iframe/component.tsx
  • app/src/plugins/iframe/index.ts
  • app/src/plugins/iframe/settings.ts
  • app/src/plugins/index.ts
  • app/src/plugins/json/component.tsx
  • app/src/plugins/json/index.ts
  • app/src/plugins/json/settings.ts
  • app/src/plugins/json/transform.ts
  • app/src/plugins/line/component.tsx
  • app/src/plugins/line/index.ts
  • app/src/plugins/line/settings.ts
  • app/src/plugins/line/transform.ts
  • app/src/plugins/map/component.tsx
  • app/src/plugins/map/index.ts
  • app/src/plugins/map/settings.ts
  • app/src/plugins/map/transform.ts
  • app/src/plugins/markdown/component.tsx
  • app/src/plugins/markdown/index.ts
  • app/src/plugins/markdown/settings.ts
  • app/src/plugins/parameter-select/component.tsx
  • app/src/plugins/parameter-select/index.ts
  • app/src/plugins/parameter-select/settings.ts
  • app/src/plugins/parameter-select/transform.ts
  • app/src/plugins/pie/component.tsx
  • app/src/plugins/pie/index.ts
  • app/src/plugins/pie/settings.ts
  • app/src/plugins/pie/transform.ts
  • app/src/plugins/radar/component.tsx
  • app/src/plugins/radar/index.ts
  • app/src/plugins/radar/settings.ts
  • app/src/plugins/radar/transform.ts
  • app/src/plugins/sankey/component.tsx
  • app/src/plugins/sankey/index.ts
  • app/src/plugins/sankey/settings.ts
  • app/src/plugins/sankey/transform.ts
  • app/src/plugins/settings/__tests__/settings-schemas.test.ts
  • app/src/plugins/settings/index.ts
  • app/src/plugins/single-value/component.tsx
  • app/src/plugins/single-value/index.ts
  • app/src/plugins/single-value/settings.ts
  • app/src/plugins/single-value/transform.ts
  • app/src/plugins/sunburst/component.tsx
  • app/src/plugins/sunburst/index.ts
  • app/src/plugins/sunburst/settings.ts
  • app/src/plugins/sunburst/transform.ts
  • app/src/plugins/table/component.tsx
  • app/src/plugins/table/index.ts
  • app/src/plugins/table/settings.ts
  • app/src/plugins/table/transform.ts
  • app/src/plugins/transforms/__tests__/bar.test.ts
  • app/src/plugins/transforms/__tests__/graph.test.ts
  • app/src/plugins/transforms/__tests__/line.test.ts
  • app/src/plugins/transforms/__tests__/pie.test.ts
  • app/src/plugins/transforms/__tests__/remaining.test.ts
  • app/src/plugins/transforms/__tests__/shared.test.ts
  • app/src/plugins/transforms/hierarchical-utils.ts
  • app/src/plugins/transforms/index.ts
  • app/src/plugins/transforms/shared-utils.ts
  • app/src/plugins/treemap/component.tsx
  • app/src/plugins/treemap/index.ts
  • app/src/plugins/treemap/settings.ts
  • app/src/plugins/treemap/transform.ts
💤 Files with no reviewable changes (1)
  • app/src/plugins/settings/index.ts

@@ -1,5 +1,5 @@
import { describe, it, expect } from "vitest";
import { transformToLineData, validateLineData } from "../line";
import { transformToLineData, validateLineData } from "../../line/transform";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Move this test next to the line transform module.

This import confirms the test targets app/src/plugins/line/transform.ts, but the test currently lives under app/src/plugins/transforms/__tests__/. Please relocate it to app/src/plugins/line/__tests__/line.test.ts to follow the repo test-location rule.

As per coding guidelines, "Tests must live in __tests__/ directory next to the file under test within the same package."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/plugins/transforms/__tests__/line.test.ts` at line 2, The test
currently importing transformToLineData and validateLineData from
"../../line/transform" should be moved so it lives next to the module under
test: relocate the file from app/src/plugins/transforms/__tests__/line.test.ts
into app/src/plugins/line/__tests__/line.test.ts, update any relative import
paths if necessary (ensure the import still points to "../../line/transform" or
adjust to "./../transform" as appropriate), and run tests to confirm imports for
transformToLineData and validateLineData resolve correctly from the new
location.

Move each chart plugin from flat files into self-contained directories:

Before:
  plugins/bar.tsx, plugins/settings/bar.ts, plugins/transforms/bar.ts

After:
  plugins/bar/component.tsx, plugins/bar/settings.ts, plugins/bar/transform.ts, plugins/bar/index.ts

All 17 plugins restructured. Each directory contains:
- component.tsx — plugin definition + React component
- settings.ts — Zod settings schema
- transform.ts — data transform function
- index.ts — re-exports plugin for clean imports

Shared utilities remain in plugins/transforms/ (shared-utils.ts, hierarchical-utils.ts).
All test imports updated. Zero functional changes.

Closes #421

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@alfredo1996
alfredo1996 force-pushed the refactor/issue-421-plugin-directories branch from e8258d8 to b80c3e9 Compare April 9, 2026 00:30
@alfredo1996

Copy link
Copy Markdown
Owner Author

Recreating due to merge conflicts from concurrent PRs

@alfredo1996 alfredo1996 closed this Apr 9, 2026
@sonarqubecloud

sonarqubecloud Bot commented Apr 9, 2026

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
71.6% Coverage on New Code (required ≥ 80%)

See analysis details on SonarQube Cloud

@alfredo1996
alfredo1996 deleted the refactor/issue-421-plugin-directories branch May 16, 2026 17:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:charts Chart rendering pkg:app Next.js application package refactor Code refactoring

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants