You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.4 KiB
87 lines
2.4 KiB
#!/usr/bin/env node
|
|
|
|
/**
|
|
* Bundle Size Check Script
|
|
*
|
|
* Checks if the plugin bundle size is within the 50KB gzip budget
|
|
* and blocks release if exceeded.
|
|
*
|
|
* @author Matthew Raymer
|
|
* @version 1.0.0
|
|
*/
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const { execSync } = require('child_process');
|
|
|
|
const BUNDLE_SIZE_BUDGET_KB = 50; // 50KB gzip budget (increased for TimeSafari integration)
|
|
const DIST_DIR = path.join(__dirname, '..', 'dist');
|
|
|
|
/**
|
|
* Get gzipped size of a file in KB
|
|
* @param {string} filePath - Path to the file
|
|
* @returns {number} Size in KB
|
|
*/
|
|
function getGzippedSize(filePath) {
|
|
try {
|
|
const gzipOutput = execSync(`gzip -c "${filePath}" | wc -c`, { encoding: 'utf8' });
|
|
const sizeBytes = parseInt(gzipOutput.trim(), 10);
|
|
return Math.round(sizeBytes / 1024 * 100) / 100; // Round to 2 decimal places
|
|
} catch (error) {
|
|
console.error(`Error getting gzipped size for ${filePath}:`, error.message);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check bundle sizes and enforce budget
|
|
*/
|
|
function checkBundleSizes() {
|
|
console.log('🔍 Checking bundle sizes...');
|
|
|
|
if (!fs.existsSync(DIST_DIR)) {
|
|
console.error('❌ Dist directory not found. Run "npm run build" first.');
|
|
process.exit(1);
|
|
}
|
|
|
|
const filesToCheck = [
|
|
'dist/plugin.js',
|
|
'dist/esm/index.js',
|
|
'dist/web/index.js'
|
|
];
|
|
|
|
let totalSize = 0;
|
|
let budgetExceeded = false;
|
|
|
|
for (const file of filesToCheck) {
|
|
const filePath = path.join(__dirname, '..', file);
|
|
|
|
if (fs.existsSync(filePath)) {
|
|
const size = getGzippedSize(filePath);
|
|
totalSize += size;
|
|
|
|
console.log(`📦 ${file}: ${size}KB gzipped`);
|
|
|
|
if (size > BUNDLE_SIZE_BUDGET_KB) {
|
|
console.error(`❌ ${file} exceeds budget: ${size}KB > ${BUNDLE_SIZE_BUDGET_KB}KB`);
|
|
budgetExceeded = true;
|
|
}
|
|
} else {
|
|
console.warn(`⚠️ ${file} not found`);
|
|
}
|
|
}
|
|
|
|
console.log(`\n📊 Total bundle size: ${totalSize}KB gzipped`);
|
|
console.log(`🎯 Budget: ${BUNDLE_SIZE_BUDGET_KB}KB gzipped`);
|
|
|
|
if (budgetExceeded || totalSize > BUNDLE_SIZE_BUDGET_KB) {
|
|
console.error(`\n❌ Bundle size budget exceeded! Total: ${totalSize}KB > ${BUNDLE_SIZE_BUDGET_KB}KB`);
|
|
console.error('🚫 Release blocked. Please optimize bundle size before releasing.');
|
|
process.exit(1);
|
|
}
|
|
|
|
console.log('✅ Bundle size within budget!');
|
|
}
|
|
|
|
// Run the check
|
|
checkBundleSizes();
|
|
|