const fs = require('fs'); const path = require('path'); const archiver = require('archiver'); // Path to the theme's style.css const styleCssPath = path.join(__dirname, 'style.css'); // Directories to exclude const excludedDirs = [ 'node_modules', 'src', '.gitignore', 'package.json', 'package-lock.json', 'theme.zip', '.git', 'react', 'zip-theme.js' ]; // Helper function to check if a file or directory should be excluded const shouldExclude = (filePath) => { return excludedDirs.some(exclude => filePath.includes(exclude)); }; // Read the style.css file and extract the theme name fs.readFile(styleCssPath, 'utf8', (err, data) => { if (err) { console.error('Error reading style.css:', err); return; } // Regex to match the theme name in the header const themeNameMatch = data.match(/\/\*[\s\S]*?Theme Name:\s*(.*?)\s*\*\//); // Fallback to 'theme' if no theme name is found const themeName = themeNameMatch && themeNameMatch[1] ? themeNameMatch[1].trim() : 'theme'; // Sanitize the theme name (remove spaces and convert to lowercase) const sanitizedThemeName = themeName.replace(/\s+/g, '').toLowerCase(); // Define the output zip file path using the sanitized theme name const output = fs.createWriteStream(path.join(__dirname, `${sanitizedThemeName}.zip`)); // Create an archiver instance const archive = archiver('zip', { zlib: { level: 9 } // Compression level }); // Pipe the archive to the output file archive.pipe(output); // Recursively append all files in the theme directory except excluded ones const addFilesRecursively = (directory) => { const files = fs.readdirSync(directory); files.forEach((file) => { const filePath = path.join(directory, file); // Exclude the file or directory if it matches the exclusion criteria if (shouldExclude(filePath)) { console.log(`Excluding: ${filePath}`); return; // Skip this file/directory } const stat = fs.statSync(filePath); if (stat.isDirectory()) { // If it's a directory, recurse into it addFilesRecursively(filePath); } else { // If it's a file, add it to the archive archive.file(filePath, { name: path.relative(__dirname, filePath) }); } }); }; // Start adding files from the theme directory addFilesRecursively(__dirname); // Finalize the archive archive.finalize(); output.on('close', () => { console.log(`Theme has been zipped into ${sanitizedThemeName}.zip`); }); output.on('error', (err) => { console.error('Error creating zip file:', err); }); });