diff --git a/scripts/post-build.js b/scripts/post-build.js index 36644f4..cc30d61 100644 --- a/scripts/post-build.js +++ b/scripts/post-build.js @@ -1,5 +1,5 @@ #!/usr/bin/env node -// Post-build class minifier - skips layout-critical + nomin-marked elements +// Post-build class minifier - updates BOTH HTML classes AND CSS const fs = require('fs'); const path = require('path'); @@ -8,36 +8,21 @@ const classMap = {}; let idx = 0; function shouldSkip(c) { - // Icon/fa - if (c.startsWith('fa-') || c.includes('icon-fa')) return true; - if (c.startsWith('not-prose')) return true; - // no- prefixes - if (c.startsWith('no-')) return true; - // Variants (dark:, md:, etc.) - if (c.includes(':')) return true; - // Arbitrary values - if (c.includes('[')) return true; - // All flexbox - if (c.startsWith('flex') || c.startsWith('items-') || c.startsWith('justify-') || c.startsWith('self-')) return true; - // Spacing - if (c.startsWith('gap-')) return true; - if (c.match(/^[mp](?:-|$|x|y|t|b|l|r)/)) return true; - // Widths/heights - if (c.startsWith('w-') || c.startsWith('h-') || c.startsWith('max-') || c.startsWith('min-')) return true; - // Border/radius + if (c.includes('fa-') || c.includes('icon-fa')) return true; + if (c.startsWith('no-') || c.startsWith('not-')) return true; + if (c.includes(':') || c.includes('[')) return true; + // if (c.startsWith('flex') || c.startsWith('items-') || c.startsWith('justify-') || c.startsWith('self-')) return true; + // if (c.startsWith('gap-') || c.startsWith('space-')) return true; + // if (c.match(/^[mp](?:-|$|x|y|t|b|l|r)/)) return true; + // if (c.startsWith('w-') || c.startsWith('h-')) return true; + // if (c.startsWith('max-') || c.startsWith('min-')) return true; if (c.startsWith('border') || c.startsWith('rounded')) return true; - // Images - if (c.startsWith('object-')) return true; - if (c.startsWith('space-')) return true; - // Font + // if (c.startsWith('object-')) return true; if (c.startsWith('font-')) return true; - // nowrap - if (c.startsWith('text-nowrap')) return true; - if (c.startsWith('inline')) return true; - if (c.startsWith('text-xs') || c.startsWith('text-sm')) return true; - if (c.startsWith('bg-transparent')) return true; - if (c.startsWith('block')) return true; - + // if (c.startsWith('text-xs') || c.startsWith('text-sm') || c.startsWith('text-')) return true; + // if (c.startsWith('inline') || c.startsWith('block')) return true; + // if (c.startsWith('bg-')) return true; + // if (c.startsWith('top-') || c.startsWith('bottom-') || c.startsWith('left-') || c.startsWith('right-')) return true; return false; } @@ -49,28 +34,41 @@ function processFile(filePath) { // First pass: collect mappings matches.forEach(m => { - const fullClassAttr = m.slice(7, -1); - if (fullClassAttr.includes('nomin')) return; - const classArr = fullClassAttr.split(' ').filter(c => c); - classArr.forEach(c => { - if (shouldSkip(c)) return; - if (!classMap[c]) classMap[c] = 'c' + idx++; + const arr = m.slice(7, -1).split(' ').filter(c => c); + // if (arr.includes('nomin')) return; + arr.forEach(c => { + if (!shouldSkip(c) && !classMap[c]) classMap[c] = 'c' + idx++; }); }); - // Second pass: replace + // Second pass: replace in HTML matches.forEach(m => { - const fullClassAttr = m.slice(7, -1); - if (fullClassAttr.includes('nomin')) return; - const classArr = fullClassAttr.split(' ').filter(c => c); - const newArr = classArr.map(c => shouldSkip(c) ? c : classMap[c]); - const newClassAttr = newArr.join(' '); - if (newClassAttr !== fullClassAttr) { - html = html.replace(m, 'class="' + newClassAttr + '"'); + const arr = m.slice(7, -1).split(' ').filter(c => c); + // if (arr.includes('nomin')) return; + const newArr = arr.map(c => shouldSkip(c) ? c : classMap[c]); + if (newArr.join(' ') !== arr.join(' ')) { + html = html.replace(m, 'class="' + newArr.join(' ') + '"'); modified = true; } }); + // Third pass: replace in CSS + const styleMatches = html.match(/