From 2535dccff2650d4c31ecb33579b4d0f5f95f2861 Mon Sep 17 00:00:00 2001 From: vince Date: Sat, 20 Jun 2026 07:37:15 +0200 Subject: [PATCH 1/2] feat(ui): export component prop types --- .../ui/src/components/foundation/index.ts | 16 +++++++------- packages/ui/src/components/frames/index.ts | 20 ++++++++--------- .../ui/src/components/operations/index.ts | 12 +++++----- packages/ui/src/components/telemetry/index.ts | 12 +++++----- packages/ui/src/storybook.test.ts | 22 ++++++++++++++++++- 5 files changed, 51 insertions(+), 31 deletions(-) diff --git a/packages/ui/src/components/foundation/index.ts b/packages/ui/src/components/foundation/index.ts index 36ed868..b82cd47 100644 --- a/packages/ui/src/components/foundation/index.ts +++ b/packages/ui/src/components/foundation/index.ts @@ -1,8 +1,8 @@ -export { Badge } from "./Badge"; -export { Button } from "./Button"; -export { IconButton } from "./IconButton"; -export { IconGlyph } from "./IconGlyph"; -export { ProgressMeter } from "./ProgressMeter"; -export { Separator } from "./Separator"; -export { StatusBadge } from "./StatusBadge"; -export { ThemeToggle } from "./ThemeToggle"; +export * from "./Badge"; +export * from "./Button"; +export * from "./IconButton"; +export * from "./IconGlyph"; +export * from "./ProgressMeter"; +export * from "./Separator"; +export * from "./StatusBadge"; +export * from "./ThemeToggle"; diff --git a/packages/ui/src/components/frames/index.ts b/packages/ui/src/components/frames/index.ts index 66a48c9..80b093d 100644 --- a/packages/ui/src/components/frames/index.ts +++ b/packages/ui/src/components/frames/index.ts @@ -1,10 +1,10 @@ -export { CornerBracketFrame } from "./CornerBracketFrame"; -export { DashboardFrame } from "./DashboardFrame"; -export { DashboardHeader } from "./DashboardHeader"; -export { DiagonalStripeField } from "./DiagonalStripeField"; -export { FooterCell } from "./FooterCell"; -export { FooterStatusCell } from "./FooterStatusCell"; -export { GridFrame } from "./GridFrame"; -export { ModuleCard } from "./ModuleCard"; -export { Panel } from "./Panel"; -export { ScanlineField } from "./ScanlineField"; +export * from "./CornerBracketFrame"; +export * from "./DashboardFrame"; +export * from "./DashboardHeader"; +export * from "./DiagonalStripeField"; +export * from "./FooterCell"; +export * from "./FooterStatusCell"; +export * from "./GridFrame"; +export * from "./ModuleCard"; +export * from "./Panel"; +export * from "./ScanlineField"; diff --git a/packages/ui/src/components/operations/index.ts b/packages/ui/src/components/operations/index.ts index 27ab623..127a1e0 100644 --- a/packages/ui/src/components/operations/index.ts +++ b/packages/ui/src/components/operations/index.ts @@ -1,6 +1,6 @@ -export { ServiceGroupPanel } from "./ServiceGroupPanel"; -export { ServicePanel } from "./ServicePanel"; -export { ServiceRow } from "./ServiceRow"; -export { StatusStrip } from "./StatusStrip"; -export { SystemState } from "./SystemState"; -export { WeatherModule } from "./WeatherModule"; +export * from "./ServiceGroupPanel"; +export * from "./ServicePanel"; +export * from "./ServiceRow"; +export * from "./StatusStrip"; +export * from "./SystemState"; +export * from "./WeatherModule"; diff --git a/packages/ui/src/components/telemetry/index.ts b/packages/ui/src/components/telemetry/index.ts index 4ba32fa..a77693e 100644 --- a/packages/ui/src/components/telemetry/index.ts +++ b/packages/ui/src/components/telemetry/index.ts @@ -1,6 +1,6 @@ -export { LineChart } from "./LineChart"; -export { SignalTrace } from "./SignalTrace"; -export { Sparkline } from "./Sparkline"; -export { TelemetryCard } from "./TelemetryCard"; -export { TelemetryGrid } from "./TelemetryGrid"; -export { TelemetryStrip } from "./TelemetryStrip"; +export * from "./LineChart"; +export * from "./SignalTrace"; +export * from "./Sparkline"; +export * from "./TelemetryCard"; +export * from "./TelemetryGrid"; +export * from "./TelemetryStrip"; diff --git a/packages/ui/src/storybook.test.ts b/packages/ui/src/storybook.test.ts index 050170b..9b73c69 100644 --- a/packages/ui/src/storybook.test.ts +++ b/packages/ui/src/storybook.test.ts @@ -131,12 +131,32 @@ describe("Storybook inventory", () => { for (const componentName of componentsByDomain.get(domain) ?? []) { expect(domainIndexSource).toContain( - `export { ${componentName} } from "./${componentName}";`, + `export * from "./${componentName}";`, ); } } }); + test("exports component prop interfaces through grouped package entrypoints", () => { + for (const component of componentInventory()) { + const source = readFileSync(component.path, "utf8"); + const propTypeName = `${component.name}Props`; + + if (!source.match(new RegExp(`export\\\\s+(interface|type)\\\\s+${propTypeName}\\\\b`))) { + continue; + } + + const domainIndexSource = readFileSync( + join(componentsDir, component.domain, "index.ts"), + "utf8", + ); + + expect(domainIndexSource).toContain( + `export * from "./${component.name}";`, + ); + } + }); + test("keeps Storybook fixtures generic and content-free", () => { const storyText = readdirSync(storiesDir) .filter((filename) => filename.endsWith(".tsx") || filename.endsWith(".ts")) -- 2.49.1 From 5dccd70e0b3527fd827ee9b14f6cd9fd4a854f80 Mon Sep 17 00:00:00 2001 From: vince Date: Sat, 20 Jun 2026 07:40:52 +0200 Subject: [PATCH 2/2] test(ui): assert public prop exports are detected --- packages/ui/src/storybook.test.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/storybook.test.ts b/packages/ui/src/storybook.test.ts index 9b73c69..9a18ecd 100644 --- a/packages/ui/src/storybook.test.ts +++ b/packages/ui/src/storybook.test.ts @@ -138,14 +138,20 @@ describe("Storybook inventory", () => { }); test("exports component prop interfaces through grouped package entrypoints", () => { + let propInterfaceCount = 0; + for (const component of componentInventory()) { const source = readFileSync(component.path, "utf8"); const propTypeName = `${component.name}Props`; + const propExportPattern = new RegExp( + `export\\s+(interface|type)\\s+${propTypeName}\\b`, + ); - if (!source.match(new RegExp(`export\\\\s+(interface|type)\\\\s+${propTypeName}\\\\b`))) { + if (!propExportPattern.test(source)) { continue; } + propInterfaceCount += 1; const domainIndexSource = readFileSync( join(componentsDir, component.domain, "index.ts"), "utf8", @@ -155,6 +161,8 @@ describe("Storybook inventory", () => { `export * from "./${component.name}";`, ); } + + expect(propInterfaceCount).toBeGreaterThan(0); }); test("keeps Storybook fixtures generic and content-free", () => { -- 2.49.1