Skip to content

Instantly share code, notes, and snippets.

@WomB0ComB0
Created January 11, 2025 16:18
Show Gist options
  • Save WomB0ComB0/1a228bd0ddba62820ea69b0e4fd57631 to your computer and use it in GitHub Desktop.
Save WomB0ComB0/1a228bd0ddba62820ea69b0e4fd57631 to your computer and use it in GitHub Desktop.
Calculate dependency cost, returns array of objects which have the name and size (in bytes) of their respective package
import { execSync } from 'child_process';
import fs from 'fs';
import path from 'path';
import type { PackageJson } from 'type-fest';
const packageJsonPath = path.join(process.cwd(), 'package.json');
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')) as PackageJson;
const dependencies = Object.keys(packageJson.dependencies || {});
const devDependencies = Object.keys(packageJson.devDependencies || {});
const allDependencies = [...dependencies, ...devDependencies];
const OUTPUT_DIR = './scripts/out';
const getPackageSize = (packageName: string): { name: string; size: number } | null => {
try {
const result = execSync(`npm view ${packageName} dist.unpackedSize --json`, {
encoding: 'utf-8',
});
const size = JSON.parse(result) as number;
return {
name: packageName,
size: size,
};
} catch (error) {
console.error(
`Failed to get size for ${packageName}:`,
error instanceof Error ? error.message : error,
);
return null;
}
};
const packageSizes = allDependencies
.map((packageName) => getPackageSize(packageName))
.filter(Boolean);
const sortedPackageSizes = packageSizes.sort((a, b) => b.size - a.size);
fs.writeFileSync(
`${OUTPUT_DIR}/package-sizes.json`,
JSON.stringify(sortedPackageSizes, null, 2),
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment