From b80c3e93aef1bd9f42a5112b66bd675cd0fd9aca Mon Sep 17 00:00:00 2001 From: alfredorubin96 Date: Thu, 9 Apr 2026 02:22:00 +0200 Subject: [PATCH] refactor(app): restructure plugins into directory modules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- .../plugins/{bar.tsx => bar/component.tsx} | 8 ++--- app/src/plugins/bar/index.ts | 1 + .../{settings/bar.ts => bar/settings.ts} | 0 .../{transforms/bar.ts => bar/transform.ts} | 2 +- .../plugins/{form.tsx => form/component.tsx} | 6 ++-- app/src/plugins/form/index.ts | 1 + .../{settings/form.ts => form/settings.ts} | 0 .../{gauge.tsx => gauge/component.tsx} | 8 ++--- app/src/plugins/gauge/index.ts | 1 + .../{settings/gauge.ts => gauge/settings.ts} | 0 .../gauge.ts => gauge/transform.ts} | 2 +- .../{graph.tsx => graph/component.tsx} | 8 ++--- app/src/plugins/graph/index.ts | 1 + .../{settings/graph.ts => graph/settings.ts} | 0 .../graph.ts => graph/transform.ts} | 2 +- .../{iframe.tsx => iframe/component.tsx} | 6 ++-- app/src/plugins/iframe/index.ts | 1 + .../iframe.ts => iframe/settings.ts} | 0 app/src/plugins/index.ts | 34 +++++++++--------- .../plugins/{json.tsx => json/component.tsx} | 8 ++--- app/src/plugins/json/index.ts | 1 + .../{settings/json.ts => json/settings.ts} | 0 .../{transforms/json.ts => json/transform.ts} | 2 +- .../plugins/{line.tsx => line/component.tsx} | 8 ++--- app/src/plugins/line/index.ts | 1 + .../{settings/line.ts => line/settings.ts} | 0 .../{transforms/line.ts => line/transform.ts} | 2 +- .../plugins/{map.tsx => map/component.tsx} | 8 ++--- app/src/plugins/map/index.ts | 1 + .../{settings/map.ts => map/settings.ts} | 0 .../{transforms/map.ts => map/transform.ts} | 2 +- .../{markdown.tsx => markdown/component.tsx} | 6 ++-- app/src/plugins/markdown/index.ts | 1 + .../markdown.ts => markdown/settings.ts} | 0 .../component.tsx} | 8 ++--- app/src/plugins/parameter-select/index.ts | 1 + .../settings.ts} | 0 .../transform.ts} | 2 +- .../plugins/{pie.tsx => pie/component.tsx} | 8 ++--- app/src/plugins/pie/index.ts | 1 + .../{settings/pie.ts => pie/settings.ts} | 0 .../{transforms/pie.ts => pie/transform.ts} | 2 +- .../{radar.tsx => radar/component.tsx} | 8 ++--- app/src/plugins/radar/index.ts | 1 + .../{settings/radar.ts => radar/settings.ts} | 0 .../radar.ts => radar/transform.ts} | 2 +- .../{sankey.tsx => sankey/component.tsx} | 8 ++--- app/src/plugins/sankey/index.ts | 1 + .../sankey.ts => sankey/settings.ts} | 0 .../sankey.ts => sankey/transform.ts} | 2 +- .../__tests__/settings-schemas.test.ts | 34 +++++++++--------- app/src/plugins/settings/index.ts | 26 -------------- .../component.tsx} | 11 +++--- app/src/plugins/single-value/index.ts | 1 + .../settings.ts} | 0 .../transform.ts} | 2 +- .../{sunburst.tsx => sunburst/component.tsx} | 8 ++--- app/src/plugins/sunburst/index.ts | 1 + .../sunburst.ts => sunburst/settings.ts} | 0 .../sunburst.ts => sunburst/transform.ts} | 2 +- .../{table.tsx => table/component.tsx} | 8 ++--- app/src/plugins/table/index.ts | 1 + .../{settings/table.ts => table/settings.ts} | 0 .../table.ts => table/transform.ts} | 2 +- .../plugins/transforms/__tests__/bar.test.ts | 2 +- .../transforms/__tests__/graph.test.ts | 2 +- .../plugins/transforms/__tests__/line.test.ts | 2 +- .../plugins/transforms/__tests__/pie.test.ts | 2 +- .../transforms/__tests__/remaining.test.ts | 21 ++++++----- .../transforms/__tests__/shared.test.ts | 2 +- ...{hierarchical.ts => hierarchical-utils.ts} | 2 +- app/src/plugins/transforms/index.ts | 35 ++++++++++--------- .../transforms/{shared.ts => shared-utils.ts} | 0 .../{treemap.tsx => treemap/component.tsx} | 8 ++--- app/src/plugins/treemap/index.ts | 1 + .../treemap.ts => treemap/settings.ts} | 0 .../treemap.ts => treemap/transform.ts} | 2 +- 77 files changed, 167 insertions(+), 173 deletions(-) rename app/src/plugins/{bar.tsx => bar/component.tsx} (93%) create mode 100644 app/src/plugins/bar/index.ts rename app/src/plugins/{settings/bar.ts => bar/settings.ts} (100%) rename app/src/plugins/{transforms/bar.ts => bar/transform.ts} (97%) rename app/src/plugins/{form.tsx => form/component.tsx} (88%) create mode 100644 app/src/plugins/form/index.ts rename app/src/plugins/{settings/form.ts => form/settings.ts} (100%) rename app/src/plugins/{gauge.tsx => gauge/component.tsx} (89%) create mode 100644 app/src/plugins/gauge/index.ts rename app/src/plugins/{settings/gauge.ts => gauge/settings.ts} (100%) rename app/src/plugins/{transforms/gauge.ts => gauge/transform.ts} (91%) rename app/src/plugins/{graph.tsx => graph/component.tsx} (94%) create mode 100644 app/src/plugins/graph/index.ts rename app/src/plugins/{settings/graph.ts => graph/settings.ts} (100%) rename app/src/plugins/{transforms/graph.ts => graph/transform.ts} (98%) rename app/src/plugins/{iframe.tsx => iframe/component.tsx} (86%) create mode 100644 app/src/plugins/iframe/index.ts rename app/src/plugins/{settings/iframe.ts => iframe/settings.ts} (100%) rename app/src/plugins/{json.tsx => json/component.tsx} (83%) create mode 100644 app/src/plugins/json/index.ts rename app/src/plugins/{settings/json.ts => json/settings.ts} (100%) rename app/src/plugins/{transforms/json.ts => json/transform.ts} (86%) rename app/src/plugins/{line.tsx => line/component.tsx} (93%) create mode 100644 app/src/plugins/line/index.ts rename app/src/plugins/{settings/line.ts => line/settings.ts} (100%) rename app/src/plugins/{transforms/line.ts => line/transform.ts} (97%) rename app/src/plugins/{map.tsx => map/component.tsx} (93%) create mode 100644 app/src/plugins/map/index.ts rename app/src/plugins/{settings/map.ts => map/settings.ts} (100%) rename app/src/plugins/{transforms/map.ts => map/transform.ts} (96%) rename app/src/plugins/{markdown.tsx => markdown/component.tsx} (88%) create mode 100644 app/src/plugins/markdown/index.ts rename app/src/plugins/{settings/markdown.ts => markdown/settings.ts} (100%) rename app/src/plugins/{parameter-select.tsx => parameter-select/component.tsx} (90%) create mode 100644 app/src/plugins/parameter-select/index.ts rename app/src/plugins/{settings/parameter-select.ts => parameter-select/settings.ts} (100%) rename app/src/plugins/{transforms/parameter-select.ts => parameter-select/transform.ts} (88%) rename app/src/plugins/{pie.tsx => pie/component.tsx} (92%) create mode 100644 app/src/plugins/pie/index.ts rename app/src/plugins/{settings/pie.ts => pie/settings.ts} (100%) rename app/src/plugins/{transforms/pie.ts => pie/transform.ts} (97%) rename app/src/plugins/{radar.tsx => radar/component.tsx} (89%) create mode 100644 app/src/plugins/radar/index.ts rename app/src/plugins/{settings/radar.ts => radar/settings.ts} (100%) rename app/src/plugins/{transforms/radar.ts => radar/transform.ts} (97%) rename app/src/plugins/{sankey.tsx => sankey/component.tsx} (89%) create mode 100644 app/src/plugins/sankey/index.ts rename app/src/plugins/{settings/sankey.ts => sankey/settings.ts} (100%) rename app/src/plugins/{transforms/sankey.ts => sankey/transform.ts} (95%) delete mode 100644 app/src/plugins/settings/index.ts rename app/src/plugins/{single-value.tsx => single-value/component.tsx} (90%) create mode 100644 app/src/plugins/single-value/index.ts rename app/src/plugins/{settings/single-value.ts => single-value/settings.ts} (100%) rename app/src/plugins/{transforms/single-value.ts => single-value/transform.ts} (93%) rename app/src/plugins/{sunburst.tsx => sunburst/component.tsx} (88%) create mode 100644 app/src/plugins/sunburst/index.ts rename app/src/plugins/{settings/sunburst.ts => sunburst/settings.ts} (100%) rename app/src/plugins/{transforms/sunburst.ts => sunburst/transform.ts} (54%) rename app/src/plugins/{table.tsx => table/component.tsx} (90%) create mode 100644 app/src/plugins/table/index.ts rename app/src/plugins/{settings/table.ts => table/settings.ts} (100%) rename app/src/plugins/{transforms/table.ts => table/transform.ts} (77%) rename app/src/plugins/transforms/{hierarchical.ts => hierarchical-utils.ts} (97%) rename app/src/plugins/transforms/{shared.ts => shared-utils.ts} (100%) rename app/src/plugins/{treemap.tsx => treemap/component.tsx} (89%) create mode 100644 app/src/plugins/treemap/index.ts rename app/src/plugins/{settings/treemap.ts => treemap/settings.ts} (100%) rename app/src/plugins/{transforms/treemap.ts => treemap/transform.ts} (54%) diff --git a/app/src/plugins/bar.tsx b/app/src/plugins/bar/component.tsx similarity index 93% rename from app/src/plugins/bar.tsx rename to app/src/plugins/bar/component.tsx index e3a990f8..e8045608 100644 --- a/app/src/plugins/bar.tsx +++ b/app/src/plugins/bar/component.tsx @@ -8,10 +8,10 @@ import dynamic from "next/dynamic"; import { Skeleton, getChartOptions } from "@neoboard/components"; import type { BarChartDataPoint, StylingRule } from "@neoboard/components"; -import { defineChartPlugin } from "./registry"; -import { transformToBarData, validateBarData } from "./transforms/bar"; -import { useEChartsClick, type PluginProps } from "./utils"; -import { barSettingsSchema } from "./settings/bar"; +import { defineChartPlugin } from "../registry"; +import { transformToBarData, validateBarData } from "./transform"; +import { useEChartsClick, type PluginProps } from "../utils"; +import { barSettingsSchema } from "./settings"; const BarChart = dynamic( () => import("@neoboard/components").then((m) => ({ default: m.BarChart })), diff --git a/app/src/plugins/bar/index.ts b/app/src/plugins/bar/index.ts new file mode 100644 index 00000000..295b3eaa --- /dev/null +++ b/app/src/plugins/bar/index.ts @@ -0,0 +1 @@ +export { barPlugin } from "./component"; diff --git a/app/src/plugins/settings/bar.ts b/app/src/plugins/bar/settings.ts similarity index 100% rename from app/src/plugins/settings/bar.ts rename to app/src/plugins/bar/settings.ts diff --git a/app/src/plugins/transforms/bar.ts b/app/src/plugins/bar/transform.ts similarity index 97% rename from app/src/plugins/transforms/bar.ts rename to app/src/plugins/bar/transform.ts index 05c29221..7ba8ed6c 100644 --- a/app/src/plugins/transforms/bar.ts +++ b/app/src/plugins/bar/transform.ts @@ -8,7 +8,7 @@ import { resolveValueKeys, normalizeValue, type ColumnMapping, -} from "./shared"; +} from "../transforms/shared-utils"; /** * Transform to bar chart format: [{ label, series1, series2 }] diff --git a/app/src/plugins/form.tsx b/app/src/plugins/form/component.tsx similarity index 88% rename from app/src/plugins/form.tsx rename to app/src/plugins/form/component.tsx index 783eb91a..7d0e6c9e 100644 --- a/app/src/plugins/form.tsx +++ b/app/src/plugins/form/component.tsx @@ -7,9 +7,9 @@ import { getChartOptions } from "@neoboard/components"; import { FormWidgetRenderer } from "@/components/form-widget-renderer"; -import { defineChartPlugin } from "./registry"; -import { type PluginProps } from "./utils"; -import { formSettingsSchema } from "./settings/form"; +import { defineChartPlugin } from "../registry"; +import { type PluginProps } from "../utils"; +import { formSettingsSchema } from "./settings"; function FormPluginComponent({ settings: raw, diff --git a/app/src/plugins/form/index.ts b/app/src/plugins/form/index.ts new file mode 100644 index 00000000..e1db4294 --- /dev/null +++ b/app/src/plugins/form/index.ts @@ -0,0 +1 @@ +export { formPlugin } from "./component"; diff --git a/app/src/plugins/settings/form.ts b/app/src/plugins/form/settings.ts similarity index 100% rename from app/src/plugins/settings/form.ts rename to app/src/plugins/form/settings.ts diff --git a/app/src/plugins/gauge.tsx b/app/src/plugins/gauge/component.tsx similarity index 89% rename from app/src/plugins/gauge.tsx rename to app/src/plugins/gauge/component.tsx index f11500c1..4f2f245a 100644 --- a/app/src/plugins/gauge.tsx +++ b/app/src/plugins/gauge/component.tsx @@ -8,10 +8,10 @@ import dynamic from "next/dynamic"; import { Skeleton, getChartOptions } from "@neoboard/components"; import type { GaugeDataPoint, StylingRule } from "@neoboard/components"; -import { defineChartPlugin } from "./registry"; -import { transformToGaugeData } from "./transforms/gauge"; -import { useEChartsClick, type PluginProps } from "./utils"; -import { gaugeSettingsSchema } from "./settings/gauge"; +import { defineChartPlugin } from "../registry"; +import { transformToGaugeData } from "./transform"; +import { useEChartsClick, type PluginProps } from "../utils"; +import { gaugeSettingsSchema } from "./settings"; const GaugeChart = dynamic( () => import("@neoboard/components").then((m) => ({ default: m.GaugeChart })), diff --git a/app/src/plugins/gauge/index.ts b/app/src/plugins/gauge/index.ts new file mode 100644 index 00000000..c9128a5d --- /dev/null +++ b/app/src/plugins/gauge/index.ts @@ -0,0 +1 @@ +export { gaugePlugin } from "./component"; diff --git a/app/src/plugins/settings/gauge.ts b/app/src/plugins/gauge/settings.ts similarity index 100% rename from app/src/plugins/settings/gauge.ts rename to app/src/plugins/gauge/settings.ts diff --git a/app/src/plugins/transforms/gauge.ts b/app/src/plugins/gauge/transform.ts similarity index 91% rename from app/src/plugins/transforms/gauge.ts rename to app/src/plugins/gauge/transform.ts index 359c2556..2094be27 100644 --- a/app/src/plugins/transforms/gauge.ts +++ b/app/src/plugins/gauge/transform.ts @@ -2,7 +2,7 @@ * Gauge chart data transform. */ -import { toRecords, normalizeValue } from "./shared"; +import { toRecords, normalizeValue } from "../transforms/shared-utils"; /** * Transform to gauge chart format: [{ value, name }] diff --git a/app/src/plugins/graph.tsx b/app/src/plugins/graph/component.tsx similarity index 94% rename from app/src/plugins/graph.tsx rename to app/src/plugins/graph/component.tsx index 8635ebb1..138a8105 100644 --- a/app/src/plugins/graph.tsx +++ b/app/src/plugins/graph/component.tsx @@ -11,10 +11,10 @@ import dynamic from "next/dynamic"; import { Skeleton, getChartOptions } from "@neoboard/components"; import type { GraphNode, GraphEdge, StylingRule } from "@neoboard/components"; import { GraphExplorationWrapper } from "@/components/graph-exploration-wrapper"; -import { defineChartPlugin } from "./registry"; -import { transformToGraphData, validateGraphData } from "./transforms/graph"; -import { type PluginProps } from "./utils"; -import { graphSettingsSchema } from "./settings/graph"; +import { defineChartPlugin } from "../registry"; +import { transformToGraphData, validateGraphData } from "./transform"; +import { type PluginProps } from "../utils"; +import { graphSettingsSchema } from "./settings"; // NVL (WebGL) is heavy — lazy load so it's only bundled when a graph widget renders. const GraphChart = dynamic( diff --git a/app/src/plugins/graph/index.ts b/app/src/plugins/graph/index.ts new file mode 100644 index 00000000..e0b39b83 --- /dev/null +++ b/app/src/plugins/graph/index.ts @@ -0,0 +1 @@ +export { graphPlugin } from "./component"; diff --git a/app/src/plugins/settings/graph.ts b/app/src/plugins/graph/settings.ts similarity index 100% rename from app/src/plugins/settings/graph.ts rename to app/src/plugins/graph/settings.ts diff --git a/app/src/plugins/transforms/graph.ts b/app/src/plugins/graph/transform.ts similarity index 98% rename from app/src/plugins/transforms/graph.ts rename to app/src/plugins/graph/transform.ts index 867538b5..f174641b 100644 --- a/app/src/plugins/transforms/graph.ts +++ b/app/src/plugins/graph/transform.ts @@ -2,7 +2,7 @@ * Graph chart data transform and validator. */ -import { toRecords, normalizeValue } from "./shared"; +import { toRecords, normalizeValue } from "../transforms/shared-utils"; /** * Normalize all properties in a record, converting non-primitives to display strings. diff --git a/app/src/plugins/iframe.tsx b/app/src/plugins/iframe/component.tsx similarity index 86% rename from app/src/plugins/iframe.tsx rename to app/src/plugins/iframe/component.tsx index c029ef3d..61219937 100644 --- a/app/src/plugins/iframe.tsx +++ b/app/src/plugins/iframe/component.tsx @@ -5,9 +5,9 @@ */ import { IframeWidget, getChartOptions } from "@neoboard/components"; -import { defineChartPlugin } from "./registry"; -import { type PluginProps } from "./utils"; -import { iframeSettingsSchema } from "./settings/iframe"; +import { defineChartPlugin } from "../registry"; +import { type PluginProps } from "../utils"; +import { iframeSettingsSchema } from "./settings"; function IframePluginComponent({ settings: raw }: PluginProps) { const settings = iframeSettingsSchema.parse(raw); diff --git a/app/src/plugins/iframe/index.ts b/app/src/plugins/iframe/index.ts new file mode 100644 index 00000000..24eec026 --- /dev/null +++ b/app/src/plugins/iframe/index.ts @@ -0,0 +1 @@ +export { iframePlugin } from "./component"; diff --git a/app/src/plugins/settings/iframe.ts b/app/src/plugins/iframe/settings.ts similarity index 100% rename from app/src/plugins/settings/iframe.ts rename to app/src/plugins/iframe/settings.ts diff --git a/app/src/plugins/index.ts b/app/src/plugins/index.ts index 798d4244..ff50c4ca 100644 --- a/app/src/plugins/index.ts +++ b/app/src/plugins/index.ts @@ -16,23 +16,23 @@ import { pluginRegistry } from "./registry"; import { CHART_TYPES } from "./chart-types"; -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"; +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"; const BUILT_IN_PLUGINS = [ markdownPlugin, diff --git a/app/src/plugins/json.tsx b/app/src/plugins/json/component.tsx similarity index 83% rename from app/src/plugins/json.tsx rename to app/src/plugins/json/component.tsx index fcd178de..ff590178 100644 --- a/app/src/plugins/json.tsx +++ b/app/src/plugins/json/component.tsx @@ -6,10 +6,10 @@ */ import { JsonViewer, getChartOptions } from "@neoboard/components"; -import { defineChartPlugin } from "./registry"; -import { transformToJsonData } from "./transforms/json"; -import { type PluginProps } from "./utils"; -import { jsonSettingsSchema } from "./settings/json"; +import { defineChartPlugin } from "../registry"; +import { transformToJsonData } from "./transform"; +import { type PluginProps } from "../utils"; +import { jsonSettingsSchema } from "./settings"; function JsonPluginComponent({ data, settings: raw }: PluginProps) { const settings = jsonSettingsSchema.parse(raw); diff --git a/app/src/plugins/json/index.ts b/app/src/plugins/json/index.ts new file mode 100644 index 00000000..cd84802f --- /dev/null +++ b/app/src/plugins/json/index.ts @@ -0,0 +1 @@ +export { jsonPlugin } from "./component"; diff --git a/app/src/plugins/settings/json.ts b/app/src/plugins/json/settings.ts similarity index 100% rename from app/src/plugins/settings/json.ts rename to app/src/plugins/json/settings.ts diff --git a/app/src/plugins/transforms/json.ts b/app/src/plugins/json/transform.ts similarity index 86% rename from app/src/plugins/transforms/json.ts rename to app/src/plugins/json/transform.ts index 58de2f3e..3ce97734 100644 --- a/app/src/plugins/transforms/json.ts +++ b/app/src/plugins/json/transform.ts @@ -2,7 +2,7 @@ * JSON viewer data transform. */ -import { toRecords } from "./shared"; +import { toRecords } from "../transforms/shared-utils"; /** * Pass data through for JSON viewer. diff --git a/app/src/plugins/line.tsx b/app/src/plugins/line/component.tsx similarity index 93% rename from app/src/plugins/line.tsx rename to app/src/plugins/line/component.tsx index 02aec0af..94c481d6 100644 --- a/app/src/plugins/line.tsx +++ b/app/src/plugins/line/component.tsx @@ -8,10 +8,10 @@ import dynamic from "next/dynamic"; import { Skeleton, getChartOptions } from "@neoboard/components"; import type { LineChartDataPoint, StylingRule } from "@neoboard/components"; -import { defineChartPlugin } from "./registry"; -import { transformToLineData, validateLineData } from "./transforms/line"; -import { useEChartsClick, type PluginProps } from "./utils"; -import { lineSettingsSchema } from "./settings/line"; +import { defineChartPlugin } from "../registry"; +import { transformToLineData, validateLineData } from "./transform"; +import { useEChartsClick, type PluginProps } from "../utils"; +import { lineSettingsSchema } from "./settings"; const LineChart = dynamic( () => import("@neoboard/components").then((m) => ({ default: m.LineChart })), diff --git a/app/src/plugins/line/index.ts b/app/src/plugins/line/index.ts new file mode 100644 index 00000000..cd940437 --- /dev/null +++ b/app/src/plugins/line/index.ts @@ -0,0 +1 @@ +export { linePlugin } from "./component"; diff --git a/app/src/plugins/settings/line.ts b/app/src/plugins/line/settings.ts similarity index 100% rename from app/src/plugins/settings/line.ts rename to app/src/plugins/line/settings.ts diff --git a/app/src/plugins/transforms/line.ts b/app/src/plugins/line/transform.ts similarity index 97% rename from app/src/plugins/transforms/line.ts rename to app/src/plugins/line/transform.ts index 9e2897e7..ae877a38 100644 --- a/app/src/plugins/transforms/line.ts +++ b/app/src/plugins/line/transform.ts @@ -8,7 +8,7 @@ import { resolveValueKeys, normalizeValue, type ColumnMapping, -} from "./shared"; +} from "../transforms/shared-utils"; /** * Transform to line chart format: [{ x, series1, series2 }] diff --git a/app/src/plugins/map.tsx b/app/src/plugins/map/component.tsx similarity index 93% rename from app/src/plugins/map.tsx rename to app/src/plugins/map/component.tsx index b86e3319..f1f157f7 100644 --- a/app/src/plugins/map.tsx +++ b/app/src/plugins/map/component.tsx @@ -8,10 +8,10 @@ import dynamic from "next/dynamic"; import { getChartOptions } from "@neoboard/components"; import type { MapMarker, StylingRule } from "@neoboard/components"; -import { defineChartPlugin } from "./registry"; -import { transformToMapData, validateMapData } from "./transforms/map"; -import { type PluginProps } from "./utils"; -import { mapSettingsSchema } from "./settings/map"; +import { defineChartPlugin } from "../registry"; +import { transformToMapData, validateMapData } from "./transform"; +import { type PluginProps } from "../utils"; +import { mapSettingsSchema } from "./settings"; // Leaflet relies on window/document — must be loaded client-side only. const MapChart = dynamic( diff --git a/app/src/plugins/map/index.ts b/app/src/plugins/map/index.ts new file mode 100644 index 00000000..e42e016f --- /dev/null +++ b/app/src/plugins/map/index.ts @@ -0,0 +1 @@ +export { mapPlugin } from "./component"; diff --git a/app/src/plugins/settings/map.ts b/app/src/plugins/map/settings.ts similarity index 100% rename from app/src/plugins/settings/map.ts rename to app/src/plugins/map/settings.ts diff --git a/app/src/plugins/transforms/map.ts b/app/src/plugins/map/transform.ts similarity index 96% rename from app/src/plugins/transforms/map.ts rename to app/src/plugins/map/transform.ts index 01ca4da5..17afc068 100644 --- a/app/src/plugins/transforms/map.ts +++ b/app/src/plugins/map/transform.ts @@ -2,7 +2,7 @@ * Map chart data transform and validator. */ -import { toRecords } from "./shared"; +import { toRecords } from "../transforms/shared-utils"; /** * Transform to map format: extract lat/lon/label from records. diff --git a/app/src/plugins/markdown.tsx b/app/src/plugins/markdown/component.tsx similarity index 88% rename from app/src/plugins/markdown.tsx rename to app/src/plugins/markdown/component.tsx index ff064dae..f36e8ee0 100644 --- a/app/src/plugins/markdown.tsx +++ b/app/src/plugins/markdown/component.tsx @@ -7,9 +7,9 @@ */ import { MarkdownWidget, getChartOptions } from "@neoboard/components"; -import { defineChartPlugin } from "./registry"; -import { type PluginProps } from "./utils"; -import { markdownSettingsSchema } from "./settings/markdown"; +import { defineChartPlugin } from "../registry"; +import { type PluginProps } from "../utils"; +import { markdownSettingsSchema } from "./settings"; /** * Component adapter — extracts the `content` field from settings and diff --git a/app/src/plugins/markdown/index.ts b/app/src/plugins/markdown/index.ts new file mode 100644 index 00000000..92ad80e3 --- /dev/null +++ b/app/src/plugins/markdown/index.ts @@ -0,0 +1 @@ +export { markdownPlugin } from "./component"; diff --git a/app/src/plugins/settings/markdown.ts b/app/src/plugins/markdown/settings.ts similarity index 100% rename from app/src/plugins/settings/markdown.ts rename to app/src/plugins/markdown/settings.ts diff --git a/app/src/plugins/parameter-select.tsx b/app/src/plugins/parameter-select/component.tsx similarity index 90% rename from app/src/plugins/parameter-select.tsx rename to app/src/plugins/parameter-select/component.tsx index e46c8970..f4bc9121 100644 --- a/app/src/plugins/parameter-select.tsx +++ b/app/src/plugins/parameter-select/component.tsx @@ -10,10 +10,10 @@ import { EmptyState, getChartOptions } from "@neoboard/components"; import { ParameterWidgetRenderer } from "@/components/parameter-widget-renderer"; import type { ParameterType } from "@/stores/parameter-store"; -import { defineChartPlugin } from "./registry"; -import { transformToSelectData } from "./transforms/parameter-select"; -import { type PluginProps } from "./utils"; -import { parameterSelectSettingsSchema } from "./settings/parameter-select"; +import { defineChartPlugin } from "../registry"; +import { transformToSelectData } from "./transform"; +import { type PluginProps } from "../utils"; +import { parameterSelectSettingsSchema } from "./settings"; function ParameterSelectPluginComponent({ settings: raw, diff --git a/app/src/plugins/parameter-select/index.ts b/app/src/plugins/parameter-select/index.ts new file mode 100644 index 00000000..f0af2cf1 --- /dev/null +++ b/app/src/plugins/parameter-select/index.ts @@ -0,0 +1 @@ +export { parameterSelectPlugin } from "./component"; diff --git a/app/src/plugins/settings/parameter-select.ts b/app/src/plugins/parameter-select/settings.ts similarity index 100% rename from app/src/plugins/settings/parameter-select.ts rename to app/src/plugins/parameter-select/settings.ts diff --git a/app/src/plugins/transforms/parameter-select.ts b/app/src/plugins/parameter-select/transform.ts similarity index 88% rename from app/src/plugins/transforms/parameter-select.ts rename to app/src/plugins/parameter-select/transform.ts index 41398d7a..6c355c10 100644 --- a/app/src/plugins/transforms/parameter-select.ts +++ b/app/src/plugins/parameter-select/transform.ts @@ -2,7 +2,7 @@ * Parameter-select widget data transform. */ -import { toRecords } from "./shared"; +import { toRecords } from "../transforms/shared-utils"; /** * Transform to select data: extract first column values as options array. diff --git a/app/src/plugins/pie.tsx b/app/src/plugins/pie/component.tsx similarity index 92% rename from app/src/plugins/pie.tsx rename to app/src/plugins/pie/component.tsx index 52aa964b..0f0ad073 100644 --- a/app/src/plugins/pie.tsx +++ b/app/src/plugins/pie/component.tsx @@ -8,10 +8,10 @@ import dynamic from "next/dynamic"; import { Skeleton, getChartOptions } from "@neoboard/components"; import type { PieChartDataPoint, StylingRule } from "@neoboard/components"; -import { defineChartPlugin } from "./registry"; -import { transformToPieData, validatePieData } from "./transforms/pie"; -import { useEChartsClick, type PluginProps } from "./utils"; -import { pieSettingsSchema } from "./settings/pie"; +import { defineChartPlugin } from "../registry"; +import { transformToPieData, validatePieData } from "./transform"; +import { useEChartsClick, type PluginProps } from "../utils"; +import { pieSettingsSchema } from "./settings"; const PieChart = dynamic( () => import("@neoboard/components").then((m) => ({ default: m.PieChart })), diff --git a/app/src/plugins/pie/index.ts b/app/src/plugins/pie/index.ts new file mode 100644 index 00000000..a0d8981b --- /dev/null +++ b/app/src/plugins/pie/index.ts @@ -0,0 +1 @@ +export { piePlugin } from "./component"; diff --git a/app/src/plugins/settings/pie.ts b/app/src/plugins/pie/settings.ts similarity index 100% rename from app/src/plugins/settings/pie.ts rename to app/src/plugins/pie/settings.ts diff --git a/app/src/plugins/transforms/pie.ts b/app/src/plugins/pie/transform.ts similarity index 97% rename from app/src/plugins/transforms/pie.ts rename to app/src/plugins/pie/transform.ts index 02575e28..d485ee3a 100644 --- a/app/src/plugins/transforms/pie.ts +++ b/app/src/plugins/pie/transform.ts @@ -7,7 +7,7 @@ import { resolveLabelKey, normalizeValue, type ColumnMapping, -} from "./shared"; +} from "../transforms/shared-utils"; /** * Transform to pie chart format: [{ name, value }] diff --git a/app/src/plugins/radar.tsx b/app/src/plugins/radar/component.tsx similarity index 89% rename from app/src/plugins/radar.tsx rename to app/src/plugins/radar/component.tsx index 323cf8ac..a2263dae 100644 --- a/app/src/plugins/radar.tsx +++ b/app/src/plugins/radar/component.tsx @@ -8,10 +8,10 @@ import dynamic from "next/dynamic"; import { Skeleton, getChartOptions } from "@neoboard/components"; import type { RadarChartData, StylingRule } from "@neoboard/components"; -import { defineChartPlugin } from "./registry"; -import { transformToRadarData } from "./transforms/radar"; -import { type PluginProps } from "./utils"; -import { radarSettingsSchema } from "./settings/radar"; +import { defineChartPlugin } from "../registry"; +import { transformToRadarData } from "./transform"; +import { type PluginProps } from "../utils"; +import { radarSettingsSchema } from "./settings"; const RadarChart = dynamic( () => import("@neoboard/components").then((m) => ({ default: m.RadarChart })), diff --git a/app/src/plugins/radar/index.ts b/app/src/plugins/radar/index.ts new file mode 100644 index 00000000..66211843 --- /dev/null +++ b/app/src/plugins/radar/index.ts @@ -0,0 +1 @@ +export { radarPlugin } from "./component"; diff --git a/app/src/plugins/settings/radar.ts b/app/src/plugins/radar/settings.ts similarity index 100% rename from app/src/plugins/settings/radar.ts rename to app/src/plugins/radar/settings.ts diff --git a/app/src/plugins/transforms/radar.ts b/app/src/plugins/radar/transform.ts similarity index 97% rename from app/src/plugins/transforms/radar.ts rename to app/src/plugins/radar/transform.ts index 300e21de..1902d420 100644 --- a/app/src/plugins/transforms/radar.ts +++ b/app/src/plugins/radar/transform.ts @@ -2,7 +2,7 @@ * Radar chart data transform. */ -import { toRecords, normalizeValue } from "./shared"; +import { toRecords, normalizeValue } from "../transforms/shared-utils"; /** * Transform to Radar chart format: { indicators: [{ name, max }], series: [{ name, values }] } diff --git a/app/src/plugins/sankey.tsx b/app/src/plugins/sankey/component.tsx similarity index 89% rename from app/src/plugins/sankey.tsx rename to app/src/plugins/sankey/component.tsx index 61b44230..998e7abc 100644 --- a/app/src/plugins/sankey.tsx +++ b/app/src/plugins/sankey/component.tsx @@ -8,10 +8,10 @@ import dynamic from "next/dynamic"; import { Skeleton, getChartOptions } from "@neoboard/components"; import type { SankeyChartData, StylingRule } from "@neoboard/components"; -import { defineChartPlugin } from "./registry"; -import { transformToSankeyData } from "./transforms/sankey"; -import { useEChartsClick, type PluginProps } from "./utils"; -import { sankeySettingsSchema } from "./settings/sankey"; +import { defineChartPlugin } from "../registry"; +import { transformToSankeyData } from "./transform"; +import { useEChartsClick, type PluginProps } from "../utils"; +import { sankeySettingsSchema } from "./settings"; const SankeyChart = dynamic( () => diff --git a/app/src/plugins/sankey/index.ts b/app/src/plugins/sankey/index.ts new file mode 100644 index 00000000..0e58dec6 --- /dev/null +++ b/app/src/plugins/sankey/index.ts @@ -0,0 +1 @@ +export { sankeyPlugin } from "./component"; diff --git a/app/src/plugins/settings/sankey.ts b/app/src/plugins/sankey/settings.ts similarity index 100% rename from app/src/plugins/settings/sankey.ts rename to app/src/plugins/sankey/settings.ts diff --git a/app/src/plugins/transforms/sankey.ts b/app/src/plugins/sankey/transform.ts similarity index 95% rename from app/src/plugins/transforms/sankey.ts rename to app/src/plugins/sankey/transform.ts index 070d4049..400f5b5c 100644 --- a/app/src/plugins/transforms/sankey.ts +++ b/app/src/plugins/sankey/transform.ts @@ -2,7 +2,7 @@ * Sankey chart data transform. */ -import { toRecords, normalizeValue } from "./shared"; +import { toRecords, normalizeValue } from "../transforms/shared-utils"; /** * Transform to Sankey chart format: { nodes: [{ name }], links: [{ source, target, value }] } diff --git a/app/src/plugins/settings/__tests__/settings-schemas.test.ts b/app/src/plugins/settings/__tests__/settings-schemas.test.ts index 0f45e52c..0cf05729 100644 --- a/app/src/plugins/settings/__tests__/settings-schemas.test.ts +++ b/app/src/plugins/settings/__tests__/settings-schemas.test.ts @@ -10,23 +10,23 @@ import { describe, it, expect } from "vitest"; import { ZodError } from "zod"; -import { barSettingsSchema } from "../bar"; -import { lineSettingsSchema } from "../line"; -import { pieSettingsSchema } from "../pie"; -import { gaugeSettingsSchema } from "../gauge"; -import { radarSettingsSchema } from "../radar"; -import { sankeySettingsSchema } from "../sankey"; -import { sunburstSettingsSchema } from "../sunburst"; -import { treemapSettingsSchema } from "../treemap"; -import { singleValueSettingsSchema } from "../single-value"; -import { tableSettingsSchema } from "../table"; -import { jsonSettingsSchema } from "../json"; -import { graphSettingsSchema } from "../graph"; -import { mapSettingsSchema } from "../map"; -import { markdownSettingsSchema } from "../markdown"; -import { iframeSettingsSchema } from "../iframe"; -import { formSettingsSchema } from "../form"; -import { parameterSelectSettingsSchema } from "../parameter-select"; +import { barSettingsSchema } from "../../bar/settings"; +import { lineSettingsSchema } from "../../line/settings"; +import { pieSettingsSchema } from "../../pie/settings"; +import { gaugeSettingsSchema } from "../../gauge/settings"; +import { radarSettingsSchema } from "../../radar/settings"; +import { sankeySettingsSchema } from "../../sankey/settings"; +import { sunburstSettingsSchema } from "../../sunburst/settings"; +import { treemapSettingsSchema } from "../../treemap/settings"; +import { singleValueSettingsSchema } from "../../single-value/settings"; +import { tableSettingsSchema } from "../../table/settings"; +import { jsonSettingsSchema } from "../../json/settings"; +import { graphSettingsSchema } from "../../graph/settings"; +import { mapSettingsSchema } from "../../map/settings"; +import { markdownSettingsSchema } from "../../markdown/settings"; +import { iframeSettingsSchema } from "../../iframe/settings"; +import { formSettingsSchema } from "../../form/settings"; +import { parameterSelectSettingsSchema } from "../../parameter-select/settings"; // --------------------------------------------------------------------------- // Helper: all schemas in one place for shared tests diff --git a/app/src/plugins/settings/index.ts b/app/src/plugins/settings/index.ts deleted file mode 100644 index 7753bfe2..00000000 --- a/app/src/plugins/settings/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Re-exports all chart plugin settings schemas and their inferred types. - */ -export { barSettingsSchema, type BarSettings } from "./bar"; -export { lineSettingsSchema, type LineSettings } from "./line"; -export { pieSettingsSchema, type PieSettings } from "./pie"; -export { gaugeSettingsSchema, type GaugeSettings } from "./gauge"; -export { radarSettingsSchema, type RadarSettings } from "./radar"; -export { sankeySettingsSchema, type SankeySettings } from "./sankey"; -export { sunburstSettingsSchema, type SunburstSettings } from "./sunburst"; -export { treemapSettingsSchema, type TreemapSettings } from "./treemap"; -export { - singleValueSettingsSchema, - type SingleValueSettings, -} from "./single-value"; -export { tableSettingsSchema, type TableSettings } from "./table"; -export { jsonSettingsSchema, type JsonSettings } from "./json"; -export { graphSettingsSchema, type GraphSettings } from "./graph"; -export { mapSettingsSchema, type MapSettings } from "./map"; -export { markdownSettingsSchema, type MarkdownSettings } from "./markdown"; -export { iframeSettingsSchema, type IframeSettings } from "./iframe"; -export { formSettingsSchema, type FormSettings } from "./form"; -export { - parameterSelectSettingsSchema, - type ParameterSelectSettings, -} from "./parameter-select"; diff --git a/app/src/plugins/single-value.tsx b/app/src/plugins/single-value/component.tsx similarity index 90% rename from app/src/plugins/single-value.tsx rename to app/src/plugins/single-value/component.tsx index 477e9dd8..f04e9ee9 100644 --- a/app/src/plugins/single-value.tsx +++ b/app/src/plugins/single-value/component.tsx @@ -10,13 +10,10 @@ import dynamic from "next/dynamic"; import { Skeleton, getChartOptions } from "@neoboard/components"; import type { StylingRule } from "@neoboard/components"; import { normalizeValue } from "@/lib/shared/normalize-value"; -import { defineChartPlugin } from "./registry"; -import { - transformToValueData, - validateValueData, -} from "./transforms/single-value"; -import { type PluginProps } from "./utils"; -import { singleValueSettingsSchema } from "./settings/single-value"; +import { defineChartPlugin } from "../registry"; +import { transformToValueData, validateValueData } from "./transform"; +import { type PluginProps } from "../utils"; +import { singleValueSettingsSchema } from "./settings"; const SingleValueChart = dynamic( () => diff --git a/app/src/plugins/single-value/index.ts b/app/src/plugins/single-value/index.ts new file mode 100644 index 00000000..b6139d6b --- /dev/null +++ b/app/src/plugins/single-value/index.ts @@ -0,0 +1 @@ +export { singleValuePlugin } from "./component"; diff --git a/app/src/plugins/settings/single-value.ts b/app/src/plugins/single-value/settings.ts similarity index 100% rename from app/src/plugins/settings/single-value.ts rename to app/src/plugins/single-value/settings.ts diff --git a/app/src/plugins/transforms/single-value.ts b/app/src/plugins/single-value/transform.ts similarity index 93% rename from app/src/plugins/transforms/single-value.ts rename to app/src/plugins/single-value/transform.ts index 93ba3120..098e8704 100644 --- a/app/src/plugins/transforms/single-value.ts +++ b/app/src/plugins/single-value/transform.ts @@ -2,7 +2,7 @@ * Single-value chart data transform and validator. */ -import { toRecords, normalizeValue } from "./shared"; +import { toRecords, normalizeValue } from "../transforms/shared-utils"; /** * Transform to a single value for SingleValueChart. diff --git a/app/src/plugins/sunburst.tsx b/app/src/plugins/sunburst/component.tsx similarity index 88% rename from app/src/plugins/sunburst.tsx rename to app/src/plugins/sunburst/component.tsx index 9036c411..6b40af18 100644 --- a/app/src/plugins/sunburst.tsx +++ b/app/src/plugins/sunburst/component.tsx @@ -8,10 +8,10 @@ import dynamic from "next/dynamic"; import { Skeleton, getChartOptions } from "@neoboard/components"; import type { SunburstDataItem, StylingRule } from "@neoboard/components"; -import { defineChartPlugin } from "./registry"; -import { transformToHierarchicalData } from "./transforms/sunburst"; -import { useEChartsClick, type PluginProps } from "./utils"; -import { sunburstSettingsSchema } from "./settings/sunburst"; +import { defineChartPlugin } from "../registry"; +import { transformToHierarchicalData } from "./transform"; +import { useEChartsClick, type PluginProps } from "../utils"; +import { sunburstSettingsSchema } from "./settings"; const SunburstChart = dynamic( () => diff --git a/app/src/plugins/sunburst/index.ts b/app/src/plugins/sunburst/index.ts new file mode 100644 index 00000000..219f89d6 --- /dev/null +++ b/app/src/plugins/sunburst/index.ts @@ -0,0 +1 @@ +export { sunburstPlugin } from "./component"; diff --git a/app/src/plugins/settings/sunburst.ts b/app/src/plugins/sunburst/settings.ts similarity index 100% rename from app/src/plugins/settings/sunburst.ts rename to app/src/plugins/sunburst/settings.ts diff --git a/app/src/plugins/transforms/sunburst.ts b/app/src/plugins/sunburst/transform.ts similarity index 54% rename from app/src/plugins/transforms/sunburst.ts rename to app/src/plugins/sunburst/transform.ts index 3dc3b825..f94551a8 100644 --- a/app/src/plugins/transforms/sunburst.ts +++ b/app/src/plugins/sunburst/transform.ts @@ -4,4 +4,4 @@ * Shares the hierarchical transform with Treemap. */ -export { transformToHierarchicalData } from "./hierarchical"; +export { transformToHierarchicalData } from "../transforms/hierarchical-utils"; diff --git a/app/src/plugins/table.tsx b/app/src/plugins/table/component.tsx similarity index 90% rename from app/src/plugins/table.tsx rename to app/src/plugins/table/component.tsx index 9a7df2df..76d7c6b4 100644 --- a/app/src/plugins/table.tsx +++ b/app/src/plugins/table/component.tsx @@ -9,10 +9,10 @@ import { getChartOptions } from "@neoboard/components"; import type { StylingRule, ColorScaleConfig } from "@neoboard/components"; import { TableRenderer } from "@/components/table-renderer"; -import { defineChartPlugin } from "./registry"; -import { transformToTableData } from "./transforms/table"; -import { type PluginProps } from "./utils"; -import { tableSettingsSchema } from "./settings/table"; +import { defineChartPlugin } from "../registry"; +import { transformToTableData } from "./transform"; +import { type PluginProps } from "../utils"; +import { tableSettingsSchema } from "./settings"; function TablePluginComponent({ data, diff --git a/app/src/plugins/table/index.ts b/app/src/plugins/table/index.ts new file mode 100644 index 00000000..42d411d5 --- /dev/null +++ b/app/src/plugins/table/index.ts @@ -0,0 +1 @@ +export { tablePlugin } from "./component"; diff --git a/app/src/plugins/settings/table.ts b/app/src/plugins/table/settings.ts similarity index 100% rename from app/src/plugins/settings/table.ts rename to app/src/plugins/table/settings.ts diff --git a/app/src/plugins/transforms/table.ts b/app/src/plugins/table/transform.ts similarity index 77% rename from app/src/plugins/transforms/table.ts rename to app/src/plugins/table/transform.ts index 29c4aa9a..5e6ba44e 100644 --- a/app/src/plugins/transforms/table.ts +++ b/app/src/plugins/table/transform.ts @@ -2,7 +2,7 @@ * Table (DataGrid) data transform. */ -import { toRecords } from "./shared"; +import { toRecords } from "../transforms/shared-utils"; /** * Transform to flat array of records for DataGrid. diff --git a/app/src/plugins/transforms/__tests__/bar.test.ts b/app/src/plugins/transforms/__tests__/bar.test.ts index e2889a70..7fccf8b1 100644 --- a/app/src/plugins/transforms/__tests__/bar.test.ts +++ b/app/src/plugins/transforms/__tests__/bar.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "vitest"; -import { transformToBarData, validateBarData } from "../bar"; +import { transformToBarData, validateBarData } from "../../bar/transform"; describe("transformToBarData", () => { it("converts array of records to bar data", () => { diff --git a/app/src/plugins/transforms/__tests__/graph.test.ts b/app/src/plugins/transforms/__tests__/graph.test.ts index d4fb80aa..b47f2878 100644 --- a/app/src/plugins/transforms/__tests__/graph.test.ts +++ b/app/src/plugins/transforms/__tests__/graph.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "vitest"; -import { transformToGraphData, validateGraphData } from "../graph"; +import { transformToGraphData, validateGraphData } from "../../graph/transform"; describe("transformToGraphData", () => { it("returns empty nodes and edges for empty input", () => { diff --git a/app/src/plugins/transforms/__tests__/line.test.ts b/app/src/plugins/transforms/__tests__/line.test.ts index b06bcb9b..76f32506 100644 --- a/app/src/plugins/transforms/__tests__/line.test.ts +++ b/app/src/plugins/transforms/__tests__/line.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "vitest"; -import { transformToLineData, validateLineData } from "../line"; +import { transformToLineData, validateLineData } from "../../line/transform"; describe("transformToLineData", () => { it("converts records to line data with x axis", () => { diff --git a/app/src/plugins/transforms/__tests__/pie.test.ts b/app/src/plugins/transforms/__tests__/pie.test.ts index 2c197937..4b2d9f2b 100644 --- a/app/src/plugins/transforms/__tests__/pie.test.ts +++ b/app/src/plugins/transforms/__tests__/pie.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "vitest"; -import { transformToPieData, validatePieData } from "../pie"; +import { transformToPieData, validatePieData } from "../../pie/transform"; describe("transformToPieData", () => { it("converts records to {name, value} pairs", () => { diff --git a/app/src/plugins/transforms/__tests__/remaining.test.ts b/app/src/plugins/transforms/__tests__/remaining.test.ts index 93566d36..9bb43137 100644 --- a/app/src/plugins/transforms/__tests__/remaining.test.ts +++ b/app/src/plugins/transforms/__tests__/remaining.test.ts @@ -3,15 +3,18 @@ * radar, and parameter-select transforms. */ import { describe, it, expect } from "vitest"; -import { transformToTableData } from "../table"; -import { transformToValueData, validateValueData } from "../single-value"; -import { transformToMapData, validateMapData } from "../map"; -import { transformToJsonData } from "../json"; -import { transformToGaugeData } from "../gauge"; -import { transformToSankeyData } from "../sankey"; -import { transformToHierarchicalData } from "../hierarchical"; -import { transformToRadarData } from "../radar"; -import { transformToSelectData } from "../parameter-select"; +import { transformToTableData } from "../../table/transform"; +import { + transformToValueData, + validateValueData, +} from "../../single-value/transform"; +import { transformToMapData, validateMapData } from "../../map/transform"; +import { transformToJsonData } from "../../json/transform"; +import { transformToGaugeData } from "../../gauge/transform"; +import { transformToSankeyData } from "../../sankey/transform"; +import { transformToHierarchicalData } from "../hierarchical-utils"; +import { transformToRadarData } from "../../radar/transform"; +import { transformToSelectData } from "../../parameter-select/transform"; // ── table ────────────────────────────────────────────────────────────────── diff --git a/app/src/plugins/transforms/__tests__/shared.test.ts b/app/src/plugins/transforms/__tests__/shared.test.ts index 049b6a05..df10a8fa 100644 --- a/app/src/plugins/transforms/__tests__/shared.test.ts +++ b/app/src/plugins/transforms/__tests__/shared.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "vitest"; -import { toRecords, resolveLabelKey, resolveValueKeys } from "../shared"; +import { toRecords, resolveLabelKey, resolveValueKeys } from "../shared-utils"; describe("toRecords", () => { it("returns array data unchanged", () => { diff --git a/app/src/plugins/transforms/hierarchical.ts b/app/src/plugins/transforms/hierarchical-utils.ts similarity index 97% rename from app/src/plugins/transforms/hierarchical.ts rename to app/src/plugins/transforms/hierarchical-utils.ts index d6d04134..2ff4d46b 100644 --- a/app/src/plugins/transforms/hierarchical.ts +++ b/app/src/plugins/transforms/hierarchical-utils.ts @@ -2,7 +2,7 @@ * Hierarchical data transform shared by Sunburst and Treemap charts. */ -import { toRecords, normalizeValue } from "./shared"; +import { toRecords, normalizeValue } from "./shared-utils"; /** * Transform to Sunburst/Treemap hierarchical format. diff --git a/app/src/plugins/transforms/index.ts b/app/src/plugins/transforms/index.ts index 6383157d..7778f242 100644 --- a/app/src/plugins/transforms/index.ts +++ b/app/src/plugins/transforms/index.ts @@ -3,7 +3,7 @@ * * Re-exports all chart-specific transforms so consumers can import * from a single location. Each transform module is also importable - * directly for tree-shaking. + * directly from its plugin directory. */ export { @@ -11,19 +11,22 @@ export { resolveLabelKey, resolveValueKeys, normalizeValue, -} from "./shared"; -export type { ColumnMapping } from "./shared"; +} from "./shared-utils"; +export type { ColumnMapping } from "./shared-utils"; -export { transformToBarData, validateBarData } from "./bar"; -export { transformToLineData, validateLineData } from "./line"; -export { transformToPieData, validatePieData } from "./pie"; -export { transformToTableData } from "./table"; -export { transformToValueData, validateValueData } from "./single-value"; -export { transformToGraphData, validateGraphData } from "./graph"; -export { transformToMapData, validateMapData } from "./map"; -export { transformToJsonData } from "./json"; -export { transformToGaugeData } from "./gauge"; -export { transformToSankeyData } from "./sankey"; -export { transformToHierarchicalData } from "./hierarchical"; -export { transformToRadarData } from "./radar"; -export { transformToSelectData } from "./parameter-select"; +export { transformToBarData, validateBarData } from "../bar/transform"; +export { transformToLineData, validateLineData } from "../line/transform"; +export { transformToPieData, validatePieData } from "../pie/transform"; +export { transformToTableData } from "../table/transform"; +export { + transformToValueData, + validateValueData, +} from "../single-value/transform"; +export { transformToGraphData, validateGraphData } from "../graph/transform"; +export { transformToMapData, validateMapData } from "../map/transform"; +export { transformToJsonData } from "../json/transform"; +export { transformToGaugeData } from "../gauge/transform"; +export { transformToSankeyData } from "../sankey/transform"; +export { transformToHierarchicalData } from "./hierarchical-utils"; +export { transformToRadarData } from "../radar/transform"; +export { transformToSelectData } from "../parameter-select/transform"; diff --git a/app/src/plugins/transforms/shared.ts b/app/src/plugins/transforms/shared-utils.ts similarity index 100% rename from app/src/plugins/transforms/shared.ts rename to app/src/plugins/transforms/shared-utils.ts diff --git a/app/src/plugins/treemap.tsx b/app/src/plugins/treemap/component.tsx similarity index 89% rename from app/src/plugins/treemap.tsx rename to app/src/plugins/treemap/component.tsx index 3012587b..12cbd369 100644 --- a/app/src/plugins/treemap.tsx +++ b/app/src/plugins/treemap/component.tsx @@ -8,10 +8,10 @@ import dynamic from "next/dynamic"; import { Skeleton, getChartOptions } from "@neoboard/components"; import type { TreemapDataItem, StylingRule } from "@neoboard/components"; -import { defineChartPlugin } from "./registry"; -import { transformToHierarchicalData } from "./transforms/treemap"; -import { useEChartsClick, type PluginProps } from "./utils"; -import { treemapSettingsSchema } from "./settings/treemap"; +import { defineChartPlugin } from "../registry"; +import { transformToHierarchicalData } from "./transform"; +import { useEChartsClick, type PluginProps } from "../utils"; +import { treemapSettingsSchema } from "./settings"; const TreemapChart = dynamic( () => diff --git a/app/src/plugins/treemap/index.ts b/app/src/plugins/treemap/index.ts new file mode 100644 index 00000000..3fab0fa0 --- /dev/null +++ b/app/src/plugins/treemap/index.ts @@ -0,0 +1 @@ +export { treemapPlugin } from "./component"; diff --git a/app/src/plugins/settings/treemap.ts b/app/src/plugins/treemap/settings.ts similarity index 100% rename from app/src/plugins/settings/treemap.ts rename to app/src/plugins/treemap/settings.ts diff --git a/app/src/plugins/transforms/treemap.ts b/app/src/plugins/treemap/transform.ts similarity index 54% rename from app/src/plugins/transforms/treemap.ts rename to app/src/plugins/treemap/transform.ts index ecad4602..bd872e37 100644 --- a/app/src/plugins/transforms/treemap.ts +++ b/app/src/plugins/treemap/transform.ts @@ -4,4 +4,4 @@ * Shares the hierarchical transform with Sunburst. */ -export { transformToHierarchicalData } from "./hierarchical"; +export { transformToHierarchicalData } from "../transforms/hierarchical-utils";