Skip to content

Commit 0d76373

Browse files
author
Dev Optimizer Bot
committed
feat: Add large dependency check (deps-012)
- Warns about large packages (>2MB) - Suggests lighter alternatives (lodash-es, vitest, etc.) - Severity based on size: high (>10MB), medium (>2MB), low - Packages checked: puppeteer, electron, webpack, jest, moment, etc.
1 parent 2f13ec3 commit 0d76373

1 file changed

Lines changed: 70 additions & 0 deletions

File tree

src/analyzers/DepsAnalyzer.ts

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)