codebase-asset-optimizer
Version:
Professional CLI development tool for optimizing and managing assets in codebases. Detects unused assets, optimizes images to WebP, optimizes videos, and automatically replaces asset references. GIFs are preserved unchanged to maintain animation functiona
109 lines • 3.4 kB
JavaScript
import path from "path";
import fs from "fs";
/**
* Default configuration for the asset optimizer
*/
export function createDefaultConfig(projectRoot) {
return {
projectRoot,
publicDir: path.join(projectRoot, "public"),
sourceDir: projectRoot,
imageExtensions: [
".png",
".jpg",
".jpeg",
".webp",
".ico",
".bmp",
".tiff",
".svg",
".gif",
],
videoExtensions: [".mp4", ".webm", ".mov", ".avi", ".mkv", ".m4v"],
excludePatterns: [
"node_modules",
".git",
".next",
"dist",
"build",
".DS_Store",
"Thumbs.db",
"*.log",
".env*",
"coverage",
".nyc_output",
],
largeFileThreshold: 500 * 1024, // 500KB
reportFile: path.join(projectRoot, "asset-audit-report.json"),
backupDir: path.join(projectRoot, ".asset-backup"),
optimization: {
images: {
targetFormat: "webp",
quality: 90, // Higher quality to preserve image fidelity
maxWidth: 2048,
maxHeight: 2048,
onlyIfSmaller: true, // Critical: only optimize if it reduces size
},
videos: {
targetFormats: ["mp4", "webm"], // MP4 first for better browser compatibility
quality: "medium",
maxWidth: 1920,
maxHeight: 1080,
onlyIfSmaller: true, // Critical: only optimize if it reduces size
},
},
};
}
/**
* Load configuration from file or use defaults
*/
export function loadConfig(projectRoot, configPath) {
const defaultConfig = createDefaultConfig(projectRoot);
if (configPath) {
try {
// TODO: Implement config file loading
// const userConfig = require(configPath);
// return { ...defaultConfig, ...userConfig };
}
catch (error) {
console.warn(`Could not load config from ${configPath}, using defaults`);
}
}
return defaultConfig;
}
/**
* Detect project structure and adjust config accordingly
*/
export function detectProjectStructure(projectRoot) {
const adjustments = {};
// Check for common public directory names
const publicDirCandidates = [
"public",
"assets",
"static",
"dist/public",
"build/public",
"src/assets",
"public/assets",
];
for (const candidate of publicDirCandidates) {
const candidatePath = path.join(projectRoot, candidate);
if (fs.existsSync(candidatePath) &&
fs.statSync(candidatePath).isDirectory()) {
adjustments.publicDir = candidatePath;
break;
}
}
// Check for common source directory structures
const sourceDirCandidates = ["src", "source", "app", "lib"];
for (const candidate of sourceDirCandidates) {
const candidatePath = path.join(projectRoot, candidate);
if (fs.existsSync(candidatePath) &&
fs.statSync(candidatePath).isDirectory()) {
adjustments.sourceDir = candidatePath;
break;
}
}
return adjustments;
}
//# sourceMappingURL=config.js.map