@@ -304,6 +304,10 @@ export class DepsAnalyzer implements Analyzer {
304304 const deprecated = await this . checkDeprecated ( packageJson ) ;
305305 findings . push ( ...deprecated ) ;
306306
307+ // Finding: Large dependencies (quick mode)
308+ const largePackages = this . checkLargeDependencies ( packageJson ) ;
309+ findings . push ( ...largePackages ) ;
310+
307311 // Finding: Duplicate versions in dependency tree (full mode)
308312 if ( this . options . mode !== 'quick' ) {
309313 const duplicates = await this . findDuplicateVersions ( projectPath ) ;
@@ -1147,4 +1151,70 @@ export class DepsAnalyzer implements Analyzer {
11471151
11481152 return null ;
11491153 }
1154+
1155+ /**
1156+ * Check for large npm packages
1157+ * Warn about dependencies that significantly increase install time and bundle size
1158+ */
1159+ private checkLargeDependencies ( packageJson : any ) : Finding [ ] {
1160+ const findings : Finding [ ] = [ ] ;
1161+ const deps = { ...packageJson . dependencies , ...packageJson . devDependencies } ;
1162+
1163+ // Known large packages (approximate unpacked size in KB)
1164+ const largePackages : Record < string , { size : number ; category : string ; alternative ?: string } > = {
1165+ 'puppeteer' : { size : 30000 , category : 'browser' , alternative : 'playwright-core' } ,
1166+ 'electron' : { size : 50000 , category : 'framework' } ,
1167+ 'typescript' : { size : 5000 , category : 'tooling' } ,
1168+ 'webpack' : { size : 2000 , category : 'bundler' , alternative : 'esbuild' } ,
1169+ 'jest' : { size : 5000 , category : 'testing' , alternative : 'vitest' } ,
1170+ '@angular/core' : { size : 3000 , category : 'framework' } ,
1171+ 'next' : { size : 5000 , category : 'framework' } ,
1172+ 'babel-core' : { size : 3000 , category : 'tooling' , alternative : '@babel/core' } ,
1173+ 'moment' : { size : 300 , category : 'utility' , alternative : 'date-fns' } ,
1174+ 'lodash' : { size : 70 , category : 'utility' , alternative : 'lodash-es' } ,
1175+ 'aws-sdk' : { size : 5000 , category : 'cloud' , alternative : '@aws-sdk/client-*' } ,
1176+ 'googleapis' : { size : 3000 , category : 'api' } ,
1177+ 'rxjs' : { size : 200 , category : 'utility' } ,
1178+ '@vue/cli' : { size : 3000 , category : 'tooling' } ,
1179+ 'create-react-app' : { size : 2000 , category : 'tooling' } ,
1180+ } ;
1181+
1182+ for ( const [ name ] of Object . entries ( deps ) ) {
1183+ if ( largePackages [ name ] ) {
1184+ const info = largePackages [ name ] ;
1185+ const severity = info . size > 10000 ? 'high' : info . size > 2000 ? 'medium' : 'low' ;
1186+
1187+ findings . push ( {
1188+ id : `deps-012-large-${ name } ` ,
1189+ domain : 'deps' ,
1190+ title : `Large dependency: ${ name } (~${ Math . round ( info . size / 1000 ) } MB)` ,
1191+ description : `Package '${ name } ' is a large dependency (~${ Math . round ( info . size / 1000 ) } MB unpacked). Large dependencies increase install time and may impact bundle size.` ,
1192+ evidence : {
1193+ file : 'package.json' ,
1194+ snippet : `"${ name } "` ,
1195+ metrics : {
1196+ sizeKB : info . size ,
1197+ category : info . category
1198+ }
1199+ } ,
1200+ severity : severity as 'high' | 'medium' | 'low' ,
1201+ confidence : 'high' ,
1202+ impact : {
1203+ type : 'size' ,
1204+ estimate : `~${ Math . round ( info . size / 1000 ) } MB unpacked size` ,
1205+ confidence : 'medium'
1206+ } ,
1207+ suggestedFix : info . alternative ? {
1208+ type : 'modify' as const ,
1209+ file : 'package.json' ,
1210+ description : `Consider lighter alternative: ${ info . alternative } ` ,
1211+ autoFixable : false
1212+ } : undefined ,
1213+ autoFixSafe : false
1214+ } as Finding ) ;
1215+ }
1216+ }
1217+
1218+ return findings ;
1219+ }
11501220}
0 commit comments