UNPKG

@exabytellc/utils

Version:

EB react utils to make everything a little easier!

81 lines (70 loc) 2.84 kB
import buildFilePlugin from "./buildFilePlugin.js"; /** * Vite Plugin to generate an `.htaccess` file for Apache configurations. * * @param {Object} options - Configuration options for the `.htaccess` file. * @param {string[]} [options.exclude=[]] - List of directories to exclude from rewriting. * @param {boolean} [options.gzip=false] - Enable Gzip compression rules. * @param {string|null} [options.extra=null] - Additional custom `.htaccess` rules. * @returns {Object} Vite plugin configuration for generating `.htaccess`. */ export default function generateHtaccessPlugin({ exclude = [], gzip = false, extra = null } = {}) { return buildFilePlugin("vite-generate-htaccess-plugin", { filename: ".htaccess", content: () => { let htaccess = `<IfModule mod_rewrite.c> RewriteEngine On\n`; // Add exclusion rules if provided if (exclude.length > 0) { htaccess += `\n\t# Exclude the ${exclude.join(", ")} directories from being rewritten RewriteCond %{REQUEST_URI} ^(${exclude.join("|")})(/|$) [NC] RewriteRule ^ - [L]\n`; } // Default rules for existing files and directories htaccess += `\t# Exclude existing files and directories RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # Handle Front Controller Pattern (redirect to index.html) RewriteRule ^ index.html [QSA,L] </IfModule>\n`; // Add Gzip compression rules if enabled if (gzip) { htaccess += `\n<IfModule mod_deflate.c> # Compress text, HTML, JavaScript, CSS, JSON, and XML AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/json AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE font/woff AddOutputFilterByType DEFLATE font/woff2 AddOutputFilterByType DEFLATE image/svg+xml # Ensure proxies don’t deliver the wrong content Header append Vary Accept-Encoding </IfModule> # Serve pre-compressed .gz files if they exist <IfModule mod_rewrite.c> RewriteCond %{HTTP:Accept-Encoding} gzip RewriteCond %{REQUEST_FILENAME} !\\.gz$ RewriteCond %{REQUEST_FILENAME}\\.gz -s RewriteRule ^(.+)\\.(js|css|html)$ $1.$2.gz [QSA,L] <FilesMatch "\\.gz$"> Header set Content-Encoding gzip Header set Cache-Control "public, max-age=31536000" Header append Vary Accept-Encoding </FilesMatch> </IfModule>\n`; } // Append extra custom rules if provided if (extra) htaccess += extra; return htaccess; }, }); }