diff --git a/apps/dashboard/src/components/vite/BuildTimeChart.tsx b/apps/dashboard/src/components/vite/BuildTimeChart.tsx index 4e19e71..8b5e804 100644 --- a/apps/dashboard/src/components/vite/BuildTimeChart.tsx +++ b/apps/dashboard/src/components/vite/BuildTimeChart.tsx @@ -11,7 +11,7 @@ import { YAxis, } from "recharts"; import * as semver from "semver"; -import viteStats from "../../../../../data/vite-version-stats.json"; +import { viteStats } from "../../data/viteStats"; const buildTimeData = viteStats .map((stat) => ({ diff --git a/apps/dashboard/src/components/vite/BundleSizeChart.tsx b/apps/dashboard/src/components/vite/BundleSizeChart.tsx index 4601b0c..a053b7a 100644 --- a/apps/dashboard/src/components/vite/BundleSizeChart.tsx +++ b/apps/dashboard/src/components/vite/BundleSizeChart.tsx @@ -12,7 +12,7 @@ import { YAxis, } from "recharts"; import * as semver from "semver"; -import viteStats from "../../../../../data/vite-version-stats.json"; +import { viteStats } from "../../data/viteStats"; const sortedViteStats = [...viteStats].toSorted((a, b) => semver.compare(a.version, b.version)); diff --git a/apps/dashboard/src/components/vite/StatsCards.tsx b/apps/dashboard/src/components/vite/StatsCards.tsx index 4091a63..c19aa34 100644 --- a/apps/dashboard/src/components/vite/StatsCards.tsx +++ b/apps/dashboard/src/components/vite/StatsCards.tsx @@ -1,6 +1,6 @@ import { useMemo } from "react"; import { formatNumberWithCommas } from "@vibe/utils"; -import viteStats from "../../../../../data/vite-version-stats.json"; +import { viteStats } from "../../data/viteStats"; export function StatsCards() { const stats = useMemo(() => { diff --git a/apps/dashboard/src/data/viteStats.ts b/apps/dashboard/src/data/viteStats.ts new file mode 100644 index 0000000..4ee10fe --- /dev/null +++ b/apps/dashboard/src/data/viteStats.ts @@ -0,0 +1,21 @@ +import rawViteStats from "../../../../data/vite-version-stats.json"; + +export interface ViteStatFile { + path: string; + size: number; + type: string; +} + +export interface ViteStat { + version: string; + timestamp: string; + publicationDate: string; + files: ViteStatFile[]; + totalSize: number; + buildTime: number; +} + +// Typed view of the generated stats. The underlying JSON can be an empty array +// (e.g. before any stable Vite 8 release exists), which would otherwise be +// inferred as `never[]` and break every property access downstream. +export const viteStats = rawViteStats as ViteStat[]; diff --git a/apps/dashboard/src/pages/ViteStatsPage.tsx b/apps/dashboard/src/pages/ViteStatsPage.tsx index b19243d..9dda041 100644 --- a/apps/dashboard/src/pages/ViteStatsPage.tsx +++ b/apps/dashboard/src/pages/ViteStatsPage.tsx @@ -2,7 +2,7 @@ import { PageHeader } from "@vibe/shared"; import { Badge } from "@vibe/ui"; import { BarChart3, Clock, Package, TrendingUp } from "lucide-react"; import { useState } from "react"; -import viteStatsData from "../../../../data/vite-version-stats.json"; +import { viteStats as viteStatsData } from "../data/viteStats"; import { PageContainer } from "../components/layout/PageContainer"; import ViteStats from "../ViteStats"; diff --git a/tools/override-vite.mjs b/tools/override-vite.mjs index d6c18d1..c8b9d49 100755 --- a/tools/override-vite.mjs +++ b/tools/override-vite.mjs @@ -345,9 +345,15 @@ async function collectAllVersionStats() { console.log("\nšŸ”„ Restoring original package.json..."); writeFileSync(DASHBOARD_PACKAGE_PATH, originalPackageJson); - // Save results - console.log(`\nšŸ’¾ Saving results to ${STATS_OUTPUT_PATH}...`); - writeFileSync(STATS_OUTPUT_PATH, JSON.stringify(allStats, null, 2)); + // Save results. Skip writing an empty dataset (e.g. when no stable Vite 8 + // release exists yet) so we don't clobber the existing tracked stats and + // break the type-checked dashboard build. + if (allStats.length === 0) { + console.log(`\nā­ļø No stats collected — leaving ${STATS_OUTPUT_PATH} unchanged.`); + } else { + console.log(`\nšŸ’¾ Saving results to ${STATS_OUTPUT_PATH}...`); + writeFileSync(STATS_OUTPUT_PATH, JSON.stringify(allStats, null, 2)); + } console.log("\n==================== ANALYSIS COMPLETE ===================="); console.log(`šŸ“Š Analysis Summary:`);