11import { clsx , type ClassValue } from "clsx"
22import { twMerge } from "tailwind-merge"
3- import type { Variation , Fixture , PackageManager , PackageManagerVersions , BenchmarkChartData , FixtureResult } from "@/types/chart-data"
3+ import type { Variation , Fixture , PackageManager , PackageManagerVersions , BenchmarkChartData , FixtureResult , PackageCountData } from "@/types/chart-data"
44
55interface VariationCategory {
66 title : string ;
@@ -14,7 +14,7 @@ export const isTaskExecutionVariation = (variation: string): boolean => {
1414} ;
1515
1616export const getVariationCategories = ( variations : Variation [ ] ) : VariationCategory [ ] => {
17- const packageManagementVariations : Variation [ ] = [
17+ const packageManagementVariations = [
1818 "clean" ,
1919 "node_modules" ,
2020 "cache" ,
@@ -23,11 +23,11 @@ export const getVariationCategories = (variations: Variation[]): VariationCatego
2323 "cache+lockfile+node_modules" ,
2424 "lockfile" ,
2525 "lockfile+node_modules"
26- ] . filter ( v => variations . includes ( v as Variation ) ) ;
26+ ] . filter ( v => variations . includes ( v as Variation ) ) as Variation [ ] ;
2727
28- const taskExecutionVariations : Variation [ ] = [
28+ const taskExecutionVariations = [
2929 "run"
30- ] . filter ( v => variations . includes ( v as Variation ) ) ;
30+ ] . filter ( v => variations . includes ( v as Variation ) ) as Variation [ ] ;
3131
3232 const categories : VariationCategory [ ] = [ ] ;
3333
@@ -89,8 +89,11 @@ export const calculateLeaderboard = (chartData: BenchmarkChartData): RankingData
8989 if ( typeof time === 'number' && time > 0 ) {
9090 times . push ( { pm, time } ) ;
9191 // Add to total time and count
92- packageManagerStats [ pm ] . totalTime += time ;
93- packageManagerStats [ pm ] . testCount ++ ;
92+ const stats = packageManagerStats [ pm ] ;
93+ if ( stats ) {
94+ stats . totalTime += time ;
95+ stats . testCount ++ ;
96+ }
9497 }
9598 } ) ;
9699
@@ -99,14 +102,25 @@ export const calculateLeaderboard = (chartData: BenchmarkChartData): RankingData
99102
100103 // Award win to fastest
101104 if ( times . length > 0 ) {
102- packageManagerStats [ times [ 0 ] . pm ] . wins ++ ;
105+ const winnerStats = packageManagerStats [ times [ 0 ] . pm ] ;
106+ if ( winnerStats ) {
107+ winnerStats . wins ++ ;
108+ }
103109 }
104110 } ) ;
105111 } ) ;
106112
107113 // Calculate final rankings based on average performance
108114 const leaderboard : RankingData [ ] = availablePackageManagers . map ( pm => {
109115 const stats = packageManagerStats [ pm ] ;
116+ if ( ! stats ) {
117+ return {
118+ packageManager : pm ,
119+ wins : 0 ,
120+ averageTime : Number . MAX_SAFE_INTEGER ,
121+ totalTests : 0
122+ } ;
123+ }
110124 const averageTime = stats . testCount > 0 ? stats . totalTime / stats . testCount : Number . MAX_SAFE_INTEGER ;
111125
112126 return {
@@ -354,15 +368,15 @@ export const getAvailablePackageManagers = (
354368} ;
355369
356370export const getAvailablePackageManagersFromPackageCount = (
357- packageCountData : Array < { packageCounts ?: Record < string , { count : number } > } > ,
371+ packageCountData : Array < { packageCounts ?: PackageCountData } > ,
358372 allPackageManagers : PackageManager [ ]
359373) : PackageManager [ ] => {
360374 const availablePackageManagers = new Set < PackageManager > ( ) ;
361375
362376 packageCountData . forEach ( item => {
363377 if ( item . packageCounts ) {
364378 allPackageManagers . forEach ( pm => {
365- const entry = item . packageCounts [ pm ] ;
379+ const entry = item . packageCounts ?. [ pm as keyof PackageCountData ] ;
366380 // Check if the package manager has valid data (entry exists and has count > 0)
367381 if ( entry && typeof entry === 'object' && entry . count && entry . count > 0 ) {
368382 availablePackageManagers . add ( pm ) ;
0 commit comments