@exabytellc/utils
Version:
EB react utils to make everything a little easier!
81 lines (70 loc) • 2.84 kB
JavaScript
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;
},
});
}