{"version":3,"sources":["../src/utils/files.ts","../src/core/scanner.ts","../src/utils/regex.ts","../src/utils/hash.ts","../src/core/metrics.ts","../src/core/pattern-detector.ts","../src/core/consolidator.ts","../src/core/css-generator.ts","../src/core/transformer.ts","../src/core/rehasher.ts","../src/config.ts","../src/index.ts"],"names":["DEFAULT_PATTERNS","path","glob","readFile","writeFile","stat","copyFile","crypto","readFileContent","postcss","rename","existsSync"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * File utilities for Classpresso\n */\n\nimport { readFile, writeFile, stat, copyFile } from 'fs/promises';\nimport { glob } from 'glob';\nimport path from 'path';\nimport type { FileStats } from '../types/index.js';\n\n/**\n * Default file patterns to scan in build output\n *\n * These patterns support all major frameworks when pointing to their build directories:\n * - Next.js: --dir .next\n * - Astro: --dir dist\n * - Nuxt: --dir .output\n * - SvelteKit: --dir build (or .svelte-kit)\n * - Remix: --dir build\n * - Solid Start: --dir .output (or dist)\n * - Qwik: --dir dist\n * - Angular: --dir dist/[project-name]\n * - Gatsby: --dir public\n * - Vite/Vue/React: --dir dist\n * - Ember: --dir dist\n * - VitePress: --dir .vitepress/dist\n * - Docusaurus: --dir build\n * - Eleventy (11ty): --dir _site\n * - Hugo: --dir public\n * - Parcel: --dir dist\n * - Preact: --dir build (or dist)\n * - Gridsome: --dir dist\n * - RedwoodJS: --dir web/dist\n * - Webpack: --dir dist\n */\nexport const DEFAULT_PATTERNS = [\n  // === Next.js (.next directory) ===\n  // Client-side chunks\n  'static/chunks/**/*.js',\n  'static/css/**/*.css',\n  // Server components (Next.js App Router)\n  'server/app/**/*.js',\n  'server/app/**/*.html',\n  'server/app/**/*.rsc',\n  // Server chunks (contains Client Component code used for hydration)\n  'server/chunks/**/*.js',\n  // Standalone build (Next.js output: 'standalone')\n  'standalone/.next/static/chunks/**/*.js',\n  'standalone/.next/static/css/**/*.css',\n  'standalone/.next/server/app/**/*.js',\n  'standalone/.next/server/app/**/*.html',\n  'standalone/.next/server/app/**/*.rsc',\n  'standalone/.next/server/chunks/**/*.js',\n\n  // === Nuxt (.output directory) ===\n  'public/**/*.html',\n  'public/**/*.js',\n  'public/**/*.css',\n  'public/_nuxt/**/*.js',\n  'public/_nuxt/**/*.css',\n  'server/**/*.mjs',\n  'server/chunks/**/*.mjs',\n\n  // === SvelteKit (build directory) ===\n  // Static adapter output\n  '**/*.html',\n  '_app/**/*.js',\n  '_app/**/*.css',\n  // Node adapter output\n  'client/**/*.js',\n  'client/**/*.css',\n  'server/**/*.js',\n\n  // === Astro (dist directory) ===\n  '_astro/**/*.js',\n  '_astro/**/*.css',\n  // SSR/Hybrid build - Client assets\n  'client/_astro/**/*.js',\n  'client/_astro/**/*.css',\n\n  // === Remix (build directory) ===\n  'client/**/*.js',\n  'client/**/*.css',\n  'server/**/*.js',\n\n  // === Solid Start (.output or dist directory) ===\n  'public/**/*.html',\n  'public/**/*.js',\n  'public/**/*.css',\n  '_build/**/*.js',\n  '_build/**/*.css',\n\n  // === Qwik (dist directory) ===\n  'build/**/*.js',\n  'build/**/*.css',\n  'q-*.js',\n\n  // === Angular (dist/[project] directory) ===\n  // Angular 17+ uses browser subdirectory\n  'browser/**/*.js',\n  'browser/**/*.css',\n  'browser/**/*.html',\n  // Legacy Angular output\n  '*.js',\n  '*.css',\n  '*.html',\n\n  // === Gatsby (public directory) ===\n  'page-data/**/*.json',\n  '*.js',\n  '*.css',\n  '*.html',\n\n  // === Vite/Vue/React generic (dist directory) ===\n  'assets/**/*.js',\n  'assets/**/*.css',\n  'index.html',\n\n  // === Ember (dist directory) ===\n  'assets/**/*.js',\n  'assets/**/*.css',\n  '*.html',\n\n  // === VitePress (.vitepress/dist directory) ===\n  'assets/**/*.js',\n  'assets/**/*.css',\n  '**/*.html',\n\n  // === Docusaurus (build directory) ===\n  'assets/**/*.js',\n  'assets/**/*.css',\n  '**/*.html',\n\n  // === Eleventy/11ty (_site directory) ===\n  '**/*.html',\n  '**/*.js',\n  '**/*.css',\n\n  // === Hugo (public directory) ===\n  '**/*.html',\n  '**/*.js',\n  '**/*.css',\n\n  // === Parcel (dist directory) ===\n  '*.html',\n  '*.js',\n  '*.css',\n\n  // === Preact (build directory) ===\n  'bundle.js',\n  'bundle.*.js',\n  '*.css',\n  '*.html',\n\n  // === Gridsome (dist directory) ===\n  'assets/**/*.js',\n  'assets/**/*.css',\n  '**/*.html',\n\n  // === RedwoodJS (web/dist directory) ===\n  'static/**/*.js',\n  'static/**/*.css',\n  '*.html',\n\n  // === Webpack generic (dist directory) ===\n  '*.js',\n  '*.css',\n  '*.html',\n  'js/**/*.js',\n  'css/**/*.css',\n];\n\n/**\n * Find files matching patterns in a build directory\n */\nexport async function findFiles(\n  buildDir: string,\n  patterns: string[]\n): Promise<string[]> {\n  // Create full patterns and deduplicate\n  const globPatterns = [...new Set(patterns.map(p => path.join(buildDir, p)))];\n\n  // Use windowsPathsNoEscape for Windows compatibility\n  const allFiles = await glob(globPatterns, {\n    nodir: true,\n    windowsPathsNoEscape: true\n  });\n\n  // Remove duplicates (in case patterns overlap)\n  return [...new Set(allFiles)];\n}\n\n/**\n * Read file content as string\n */\nexport async function readFileContent(filePath: string): Promise<string> {\n  return readFile(filePath, 'utf-8');\n}\n\n/**\n * Write content to file\n */\nexport async function writeFileContent(\n  filePath: string,\n  content: string\n): Promise<void> {\n  await writeFile(filePath, content, 'utf-8');\n}\n\n/**\n * Get file size in bytes\n */\nexport async function getFileSize(filePath: string): Promise<number> {\n  const stats = await stat(filePath);\n  return stats.size;\n}\n\n/**\n * Create a backup of a file\n */\nexport async function backupFile(filePath: string): Promise<string> {\n  const backupPath = `${filePath}.classpresso-backup`;\n  await copyFile(filePath, backupPath);\n  return backupPath;\n}\n\n/**\n * Get file stats for a list of files\n */\nexport async function getFileStats(filePaths: string[]): Promise<FileStats[]> {\n  const stats: FileStats[] = [];\n\n  for (const filePath of filePaths) {\n    try {\n      const size = await getFileSize(filePath);\n      stats.push({\n        path: filePath,\n        originalSize: size,\n        modified: false,\n      });\n    } catch {\n      // Skip files that can't be read\n    }\n  }\n\n  return stats;\n}\n\n/**\n * Check if a file is a JavaScript file\n */\nexport function isJSFile(filePath: string): boolean {\n  return /\\.(js|mjs|cjs)$/.test(filePath);\n}\n\n/**\n * Check if a file is a CSS file\n */\nexport function isCSSFile(filePath: string): boolean {\n  return /\\.css$/.test(filePath);\n}\n\n/**\n * Check if a file is an HTML file\n */\nexport function isHTMLFile(filePath: string): boolean {\n  return /\\.(html|htm)$/.test(filePath);\n}\n\n/**\n * Check if a file is an RSC payload\n */\nexport function isRSCFile(filePath: string): boolean {\n  return /\\.rsc$/.test(filePath);\n}\n\n/**\n * Check if a file matches any exclusion pattern\n * Patterns can be glob-style (e.g., \"**\\/Demo*\", \"**\\/ClassTester*\")\n */\nexport function shouldExcludeFile(filePath: string, excludePatterns: string[]): boolean {\n  if (!excludePatterns || excludePatterns.length === 0) {\n    return false;\n  }\n\n  // Normalize path for consistent matching\n  const normalizedPath = filePath.replace(/\\\\/g, '/');\n\n  for (const pattern of excludePatterns) {\n    // Convert glob pattern to regex\n    // Support: ** (any path), * (any chars), ? (single char)\n    const regexPattern = pattern\n      .replace(/\\\\/g, '/')\n      .replace(/\\*\\*/g, '{{DOUBLESTAR}}')\n      .replace(/\\*/g, '[^/]*')\n      .replace(/\\?/g, '.')\n      .replace(/{{DOUBLESTAR}}/g, '.*');\n\n    const regex = new RegExp(regexPattern);\n    if (regex.test(normalizedPath)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/**\n * Filter files to exclude those matching exclusion patterns\n */\nexport function filterExcludedFiles(files: string[], excludePatterns: string[]): string[] {\n  if (!excludePatterns || excludePatterns.length === 0) {\n    return files;\n  }\n\n  return files.filter(filePath => !shouldExcludeFile(filePath, excludePatterns));\n}\n","/**\n * Scanner - Extracts className patterns from build output\n */\n\nimport type {\n  ClasspressoConfig,\n  ClassOccurrence,\n  FileLocation,\n  ScanResult,\n  FileStats,\n  DynamicBasePattern,\n  SourceFileType,\n} from '../types/index.js';\nimport {\n  findFiles,\n  readFileContent,\n  getFileSize,\n  isJSFile,\n  isHTMLFile,\n  isRSCFile,\n  DEFAULT_PATTERNS,\n  filterExcludedFiles,\n} from '../utils/files.js';\nimport { ALL_CLASS_PATTERNS, isDynamicClassString, extractDynamicBaseStrings, extractConcatBaseStrings } from '../utils/regex.js';\n\n/**\n * Determine the source file type\n */\nfunction getSourceFileType(filePath: string): SourceFileType {\n  if (isHTMLFile(filePath)) return 'html';\n  if (isRSCFile(filePath)) return 'rsc';\n  return 'js';\n}\n\n/**\n * Check if pattern A's classes are a proper subset of pattern B's classes.\n * A is a proper subset of B if all classes in A are in B, and B has more classes.\n */\nexport function isProperSubset(classesA: string[], classesB: string[]): boolean {\n  if (classesA.length >= classesB.length) return false;\n\n  const setB = new Set(classesB);\n  return classesA.every(cls => setB.has(cls));\n}\n\n/**\n * Detect patterns that appear in JS but are subsets of HTML patterns.\n * These are likely className props that get merged with component classes.\n */\nexport function detectMergeablePatterns(\n  occurrences: Map<string, ClassOccurrence>\n): Set<string> {\n  const mergeablePatterns = new Set<string>();\n\n  // Get all JS-only patterns and HTML patterns\n  const jsPatterns: ClassOccurrence[] = [];\n  const htmlPatterns: ClassOccurrence[] = [];\n\n  for (const [, occurrence] of occurrences) {\n    if (occurrence.sourceTypes.has('js')) {\n      jsPatterns.push(occurrence);\n    }\n    if (occurrence.sourceTypes.has('html') || occurrence.sourceTypes.has('rsc')) {\n      htmlPatterns.push(occurrence);\n    }\n  }\n\n  // For each JS pattern, check if it's a subset of any HTML pattern\n  for (const jsPattern of jsPatterns) {\n    for (const htmlPattern of htmlPatterns) {\n      if (isProperSubset(jsPattern.classes, htmlPattern.classes)) {\n        // This JS pattern's classes appear as part of a larger HTML pattern\n        // It's likely a className prop that gets merged\n        mergeablePatterns.add(jsPattern.normalizedKey);\n        break;\n      }\n    }\n  }\n\n  return mergeablePatterns;\n}\n\n/**\n * Check if any class in a list contains a dynamic library prefix.\n * These are classes generated at runtime by libraries like lucide-react, heroicons, etc.\n */\nexport function containsDynamicPrefix(\n  classes: string[],\n  dynamicPrefixes: string[]\n): boolean {\n  for (const cls of classes) {\n    for (const prefix of dynamicPrefixes) {\n      // For prefixes ending with '-' (e.g., \"fa-\", \"icon-\"), just check startsWith\n      if (prefix.endsWith('-')) {\n        if (cls.startsWith(prefix)) {\n          return true;\n        }\n      } else {\n        // For prefixes without '-' (e.g., \"lucide\", \"fas\", \"far\", \"fab\"),\n        // match exact or followed by '-' to avoid false positives\n        // e.g., \"fab\" matches \"fab\" or \"fab-icon\", but not \"fabric\"\n        if (cls === prefix || cls.startsWith(prefix + '-')) {\n          return true;\n        }\n      }\n    }\n  }\n  return false;\n}\n\n/**\n * Check if a class occurrence is safe for SSR hydration.\n * A pattern is hydration-safe if it appears in BOTH:\n * - Server context (html or rsc)\n * - Client context (js)\n *\n * If a pattern only appears in one context, transforming it would cause\n * React hydration mismatches.\n */\nexport function isHydrationSafe(occurrence: ClassOccurrence): boolean {\n  const hasServerContext = occurrence.sourceTypes.has('html') || occurrence.sourceTypes.has('rsc');\n  const hasClientContext = occurrence.sourceTypes.has('js');\n\n  // Must appear in both server and client contexts to be safe\n  return hasServerContext && hasClientContext;\n}\n\n/**\n * Returns true for classes whose CSS rule cannot be expressed as flat declarations\n * on a single-class selector — i.e., classes that require a media query wrapper,\n * an @container wrapper, or a combinator child selector to function correctly.\n *\n * Consolidating these into a plain `.cp-xxx { ... }` rule silently drops the\n * wrapping context, producing a visually broken build with no warning.\n *\n * Detected categories:\n *  - Any variant prefix:    md:, hover:, dark:, focus:, group-hover:, data-[x]:, etc.\n *  - Container queries:     @sm, @md, @[800px], etc.\n *  - Combinator utilities:  space-x-*, space-y-*, divide-x-*, divide-y-*\n */\nexport function isNonFlattenableClass(className: string): boolean {\n  // Variant prefixes — any colon in the class name means it needs a wrapper\n  if (className.includes(':')) return true;\n  // Container queries\n  if (className.startsWith('@')) return true;\n  // Combinator utilities that generate child selectors like `.space-y-6 > :not(:last-child)`\n  if (/^space-[xy]/.test(className)) return true;\n  if (/^divide-[xy]/.test(className)) return true;\n  return false;\n}\n\n/**\n * Check if a class should be excluded based on config\n */\nexport function shouldExcludeClass(\n  className: string,\n  exclude: ClasspressoConfig['exclude']\n): boolean {\n  // Check prefix patterns\n  if (exclude.prefixes) {\n    for (const prefix of exclude.prefixes) {\n      if (className.startsWith(prefix)) return true;\n    }\n  }\n\n  // Check suffix patterns\n  if (exclude.suffixes) {\n    for (const suffix of exclude.suffixes) {\n      if (className.endsWith(suffix)) return true;\n    }\n  }\n\n  // Check exact matches\n  if (exclude.classes) {\n    if (exclude.classes.includes(className)) return true;\n  }\n\n  // Check regex patterns\n  if (exclude.patterns) {\n    for (const pattern of exclude.patterns) {\n      if (pattern.test(className)) return true;\n    }\n  }\n\n  return false;\n}\n\n/**\n * Normalize a class string for consistent comparison\n * - Splits into individual classes\n * - Removes excluded classes\n * - Sorts alphabetically\n * - Joins back together\n */\nexport function normalizeClassString(\n  classString: string,\n  exclude: ClasspressoConfig['exclude'],\n  excludeNonFlattenable: boolean = false\n): { normalized: string; classes: string[]; excludedClasses: string[] } {\n  const allClasses = classString.split(/\\s+/).filter(Boolean);\n  const includedClasses: string[] = [];\n  const excludedClasses: string[] = [];\n\n  for (const cls of allClasses) {\n    if (shouldExcludeClass(cls, exclude) || (excludeNonFlattenable && isNonFlattenableClass(cls))) {\n      excludedClasses.push(cls);\n    } else {\n      includedClasses.push(cls);\n    }\n  }\n\n  // Sort for consistent comparison\n  const sorted = [...includedClasses].sort();\n  return {\n    normalized: sorted.join(' '),\n    classes: includedClasses,\n    excludedClasses,\n  };\n}\n\n/**\n * Extract class strings from file content\n */\nexport function extractClassStrings(\n  content: string,\n  filePath: string\n): Array<{ classString: string; location: FileLocation }> {\n  const results: Array<{ classString: string; location: FileLocation }> = [];\n  const seen = new Set<string>();\n\n  for (const pattern of ALL_CLASS_PATTERNS) {\n    // Reset regex lastIndex\n    pattern.lastIndex = 0;\n\n    let match;\n    while ((match = pattern.exec(content)) !== null) {\n      const classString = match[1];\n\n      // Skip empty strings\n      if (!classString || !classString.trim()) continue;\n\n      // Skip dynamic expressions\n      if (isDynamicClassString(classString)) continue;\n\n      // Skip if already seen at this exact position (same file and character offset)\n      // This allows duplicate strings in the same file (e.g., bundled components)\n      // while avoiding double-counting from overlapping regex patterns\n      const key = `${filePath}:${match.index}:${classString}`;\n      if (seen.has(key)) continue;\n      seen.add(key);\n\n      // Calculate approximate line number\n      const beforeMatch = content.substring(0, match.index);\n      const line = (beforeMatch.match(/\\n/g) || []).length + 1;\n\n      results.push({\n        classString: classString.trim(),\n        location: {\n          filePath,\n          line,\n        },\n      });\n    }\n  }\n\n  return results;\n}\n\n/**\n * Scan build directory for className patterns\n */\nexport async function scanBuildOutput(\n  config: ClasspressoConfig\n): Promise<ScanResult> {\n  const occurrences = new Map<string, ClassOccurrence>();\n  const dynamicBasePatterns = new Map<string, DynamicBasePattern>();\n  const fileStats: FileStats[] = [];\n  const errors: string[] = [];\n\n  // Find all files to scan\n  const patterns = config.include.length > 0 ? config.include : DEFAULT_PATTERNS;\n  const allFiles = await findFiles(config.buildDir, patterns);\n\n  // Filter out excluded files\n  const files = filterExcludedFiles(allFiles, config.exclude.files || []);\n\n  if (config.verbose) {\n    console.log(`Found ${allFiles.length} files, scanning ${files.length} (${allFiles.length - files.length} excluded)`);\n  }\n\n  for (const filePath of files) {\n    try {\n      // Skip non-relevant file types\n      if (!isJSFile(filePath) && !isHTMLFile(filePath) && !isRSCFile(filePath)) {\n        continue;\n      }\n\n      const content = await readFileContent(filePath);\n      const size = await getFileSize(filePath);\n\n      fileStats.push({\n        path: filePath,\n        originalSize: size,\n        modified: false,\n      });\n\n      // Extract dynamic base patterns from JS files (for hydration safety)\n      // These include template literals with ${} and .concat() calls\n      if (isJSFile(filePath)) {\n        // Get bases from template literals: className:`base ${dynamic}`\n        const dynamicBases = extractDynamicBaseStrings(content);\n        // Get bases from concat calls: className:\"\".concat(\"base\", variant)\n        const concatBases = extractConcatBaseStrings(content);\n\n        // Combine all dynamic bases\n        const allDynamicBases = [...dynamicBases, ...concatBases];\n\n        for (const baseString of allDynamicBases) {\n          const { normalized, classes } = normalizeClassString(baseString, config.exclude, config.excludeNonFlattenableClasses);\n\n          // Skip if too few classes\n          if (classes.length < config.minClasses) continue;\n\n          const location: FileLocation = { filePath };\n\n          if (dynamicBasePatterns.has(normalized)) {\n            dynamicBasePatterns.get(normalized)!.locations.push(location);\n          } else {\n            dynamicBasePatterns.set(normalized, {\n              baseClasses: classes,\n              normalizedKey: normalized,\n              locations: [location],\n            });\n          }\n        }\n      }\n\n      const classStrings = extractClassStrings(content, filePath);\n      const sourceType = getSourceFileType(filePath);\n\n      for (const { classString, location } of classStrings) {\n        const { normalized, classes, excludedClasses } = normalizeClassString(\n          classString,\n          config.exclude,\n          config.excludeNonFlattenableClasses\n        );\n\n        // Skip if all classes were excluded\n        if (classes.length === 0) continue;\n\n        // Skip single classes (no benefit to consolidate)\n        if (classes.length < config.minClasses) continue;\n\n        // Skip patterns containing dynamic library prefixes (e.g., lucide-react, heroicons)\n        // These are generated at runtime and transforming them causes hydration mismatches\n        if (config.excludeDynamicPatterns && containsDynamicPrefix(classes, config.dynamicPrefixes)) {\n          continue;\n        }\n\n        if (occurrences.has(normalized)) {\n          const existing = occurrences.get(normalized)!;\n          existing.count++;\n          existing.locations.push(location);\n          existing.sourceTypes.add(sourceType);\n        } else {\n          occurrences.set(normalized, {\n            classString,\n            normalizedKey: normalized,\n            count: 1,\n            locations: [location],\n            classes,\n            excludedClasses,\n            sourceTypes: new Set([sourceType]),\n          });\n        }\n      }\n    } catch (err) {\n      errors.push(`Error scanning ${filePath}: ${err}`);\n    }\n  }\n\n  // Detect patterns that are likely className props that get merged\n  const mergeablePatterns = detectMergeablePatterns(occurrences);\n\n  if (config.verbose && mergeablePatterns.size > 0) {\n    console.log(`Found ${mergeablePatterns.size} patterns that appear to be merged className props`);\n  }\n\n  return {\n    occurrences,\n    files: fileStats,\n    errors,\n    dynamicBasePatterns,\n    mergeablePatterns,\n  };\n}\n","/**\n * Regex utilities for Classpresso\n */\n\n/**\n * Escape special regex characters in a string\n */\nexport function escapeRegex(str: string): string {\n  return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Patterns to match className in various contexts\n */\nexport const CLASS_PATTERNS = {\n  // JSX: className=\"...\"\n  jsxDouble: /className\\s*=\\s*\"([^\"]+)\"/g,\n\n  // JSX: className='...'\n  jsxSingle: /className\\s*=\\s*'([^']+)'/g,\n\n  // React createElement: className:\"...\"\n  createElementDouble: /className\\s*:\\s*\"([^\"]+)\"/g,\n\n  // React createElement: className:'...'\n  createElementSingle: /className\\s*:\\s*'([^']+)'/g,\n\n  // Minified: \"className\",\"...\"\n  minifiedComma: /\"className\"\\s*,\\s*\"([^\"]+)\"/g,\n\n  // HTML: class=\"...\"\n  htmlDouble: /\\bclass\\s*=\\s*\"([^\"]+)\"/g,\n\n  // HTML: class='...'\n  htmlSingle: /\\bclass\\s*=\\s*'([^']+)'/g,\n\n  // HTML entity encoded: class=&quot;...&quot;\n  htmlEntityDouble: /\\bclass=&quot;([^&]+)&quot;/g,\n\n  // HTML entity encoded: class=&#34;...&#34; (numeric entity)\n  htmlNumericDouble: /\\bclass=&#34;([^&]+)&#34;/g,\n\n  // RSC payload: \\\"className\\\":\\\"...\\\" (escaped JSON in Next.js RSC payloads)\n  rscPayload: /\\\\\"className\\\\\"\\s*:\\s*\\\\\"([^\"\\\\]+)\\\\\"/g,\n\n  // Vue/Quasar createElement: class:\"...\" (Vue uses 'class' not 'className')\n  vueCreateElementDouble: /\\bclass\\s*:\\s*\"([^\"]+)\"/g,\n\n  // Vue/Quasar createElement: class:'...'\n  vueCreateElementSingle: /\\bclass\\s*:\\s*'([^']+)'/g,\n\n  // JSX: className=`...` (static template literal, no dynamic expressions)\n  jsxBacktick: /className\\s*=\\s*`([^`$]+)`/g,\n\n  // React createElement: className:`...` (static template literal, no dynamic expressions)\n  createElementBacktick: /className\\s*:\\s*`([^`$]+)`/g,\n};\n\n/**\n * All patterns combined for extraction\n */\nexport const ALL_CLASS_PATTERNS = [\n  CLASS_PATTERNS.jsxDouble,\n  CLASS_PATTERNS.jsxSingle,\n  CLASS_PATTERNS.createElementDouble,\n  CLASS_PATTERNS.createElementSingle,\n  CLASS_PATTERNS.minifiedComma,\n  CLASS_PATTERNS.htmlDouble,\n  CLASS_PATTERNS.htmlSingle,\n  CLASS_PATTERNS.htmlEntityDouble,\n  CLASS_PATTERNS.htmlNumericDouble,\n  CLASS_PATTERNS.rscPayload,\n  CLASS_PATTERNS.vueCreateElementDouble,\n  CLASS_PATTERNS.vueCreateElementSingle,\n  CLASS_PATTERNS.jsxBacktick,\n  CLASS_PATTERNS.createElementBacktick,\n];\n\n/**\n * Check if a class string contains dynamic expressions\n */\nexport function isDynamicClassString(classString: string): boolean {\n  // Template literal expression\n  if (classString.includes('${')) return true;\n\n  // Ternary operator (likely dynamic)\n  if (/\\s*\\?\\s*/.test(classString) && classString.includes(':')) return true;\n\n  // Function call\n  if (/\\w+\\s*\\(/.test(classString)) return true;\n\n  // Variable reference (camelCase or UPPER_CASE that's not a valid class)\n  if (/^[a-z][a-zA-Z0-9]*$/.test(classString) && !classString.includes('-')) return true;\n\n  return false;\n}\n\n/**\n * Patterns to extract the static base portion of template literal class names\n * These capture the static classes before the ${...} dynamic expression\n */\nexport const DYNAMIC_BASE_PATTERNS = [\n  // className:`base classes ${...}`\n  /className\\s*:\\s*`([^`$]+)\\s*\\$\\{/g,\n  // className=`base classes ${...}` (JSX)\n  /className\\s*=\\s*`([^`$]+)\\s*\\$\\{/g,\n  // class:`base classes ${...}` (rare but possible)\n  /\\bclass\\s*:\\s*`([^`$]+)\\s*\\$\\{/g,\n];\n\n/**\n * Patterns to extract the static base portion of .concat() calls\n * Minified React often uses \"\".concat(\"base\", \" \", variant) for className\n * These are treated as dynamic and should be skipped\n */\nexport const CONCAT_BASE_PATTERNS = [\n  // className:\"\".concat(\"base classes\",...) - the base before concat\n  /className\\s*:\\s*\"\"\\s*\\.concat\\s*\\(\\s*\"([^\"]+)\"/g,\n  // className:''.concat('base classes',...)\n  /className\\s*:\\s*''\\s*\\.concat\\s*\\(\\s*'([^']+)'/g,\n];\n\n/**\n * Extract static base patterns from .concat() calls\n * Returns the static class portion from the first concat argument\n */\nexport function extractConcatBaseStrings(content: string): string[] {\n  const results: string[] = [];\n\n  for (const pattern of CONCAT_BASE_PATTERNS) {\n    pattern.lastIndex = 0;\n    let match;\n    while ((match = pattern.exec(content)) !== null) {\n      const baseString = match[1]?.trim();\n      if (baseString && baseString.length > 0) {\n        results.push(baseString);\n      }\n    }\n  }\n\n  return results;\n}\n\n/**\n * Extract static base patterns from template literals with dynamic expressions\n * Returns the static class portion before ${...}\n */\nexport function extractDynamicBaseStrings(\n  content: string\n): string[] {\n  const results: string[] = [];\n\n  for (const pattern of DYNAMIC_BASE_PATTERNS) {\n    pattern.lastIndex = 0;\n    let match;\n    while ((match = pattern.exec(content)) !== null) {\n      const baseString = match[1]?.trim();\n      if (baseString && baseString.length > 0) {\n        results.push(baseString);\n      }\n    }\n  }\n\n  return results;\n}\n\n/**\n * Create a replacement pattern for a class string\n */\nexport function createReplacementPatterns(original: string): RegExp[] {\n  const escaped = escapeRegex(original);\n\n  return [\n    new RegExp(`(className\\\\s*=\\\\s*)\"${escaped}\"`, 'g'),\n    new RegExp(`(className\\\\s*=\\\\s*)'${escaped}'`, 'g'),\n    new RegExp(`(className\\\\s*:\\\\s*)\"${escaped}\"`, 'g'),\n    new RegExp(`(className\\\\s*:\\\\s*)'${escaped}'`, 'g'),\n    new RegExp(`(\"className\"\\\\s*,\\\\s*)\"${escaped}\"`, 'g'),\n    new RegExp(`(class\\\\s*=\\\\s*)\"${escaped}\"`, 'g'),\n    new RegExp(`(class\\\\s*=\\\\s*)'${escaped}'`, 'g'),\n    // HTML entity encoded quotes\n    new RegExp(`(class=&quot;)${escaped}(&quot;)`, 'g'),\n    new RegExp(`(class=&#34;)${escaped}(&#34;)`, 'g'),\n    // Vue/Quasar class: syntax\n    new RegExp(`(\\\\bclass\\\\s*:\\\\s*)\"${escaped}\"`, 'g'),\n    new RegExp(`(\\\\bclass\\\\s*:\\\\s*)'${escaped}'`, 'g'),\n    // Static template literals\n    new RegExp(`(className\\\\s*=\\\\s*)\\`${escaped}\\``, 'g'),\n    new RegExp(`(className\\\\s*:\\\\s*)\\`${escaped}\\``, 'g'),\n  ];\n}\n","/**\n * Hash generation utilities for Classpresso\n */\n\nimport crypto from 'crypto';\n\n// Base36 alphabet: a-z then 0-9 (letters first for valid CSS class names)\nconst ALPHABET = 'abcdefghijklmnopqrstuvwxyz0123456789';\nconst BASE = ALPHABET.length; // 36\n\n/**\n * Calculate the minimum hash length needed for a given count of patterns\n * Uses base36 (a-z, 0-9) for 36 possible characters per position\n */\nexport function calculateMinHashLength(count: number): number {\n  if (count <= 0) return 1;\n  // How many characters needed to represent `count` unique values in base36\n  return Math.max(1, Math.ceil(Math.log(count + 1) / Math.log(BASE)));\n}\n\n/**\n * Generate a sequential short name from an index\n * 0 -> 'a', 1 -> 'b', ..., 35 -> '9', 36 -> 'aa', 37 -> 'ab', ...\n */\nexport function generateSequentialName(index: number, prefix: string = 'cp-'): string {\n  let result = '';\n  let n = index;\n\n  do {\n    result = ALPHABET[n % BASE] + result;\n    n = Math.floor(n / BASE) - 1;\n  } while (n >= 0);\n\n  return `${prefix}${result}`;\n}\n\n/**\n * Generate sequential names for a list of items\n * Returns the shortest possible names based on total count\n */\nexport function generateSequentialNames(\n  count: number,\n  prefix: string = 'cp-'\n): string[] {\n  const names: string[] = [];\n  for (let i = 0; i < count; i++) {\n    names.push(generateSequentialName(i, prefix));\n  }\n  return names;\n}\n\n/**\n * Generate a hash-based class name from a normalized class string\n * @deprecated Use generateSequentialName for shorter names\n */\nexport function generateHashName(\n  normalizedClassString: string,\n  prefix: string = 'cp-',\n  length: number = 5\n): string {\n  const hash = crypto\n    .createHash('md5')\n    .update(normalizedClassString)\n    .digest('hex')\n    .substring(0, length);\n\n  return `${prefix}${hash}`;\n}\n\n/**\n * Resolve hash collisions by appending a suffix\n */\nexport function resolveCollisions<T extends { hashName: string; normalizedKey: string }>(\n  candidates: T[]\n): T[] {\n  const hashMap = new Map<string, T>();\n\n  for (const candidate of candidates) {\n    let hash = candidate.hashName;\n    let suffix = 0;\n\n    // Check for collision with different content\n    while (\n      hashMap.has(hash) &&\n      hashMap.get(hash)!.normalizedKey !== candidate.normalizedKey\n    ) {\n      suffix++;\n      hash = `${candidate.hashName}${suffix}`;\n    }\n\n    candidate.hashName = hash;\n    hashMap.set(hash, candidate);\n  }\n\n  return candidates;\n}\n","/**\n * Metrics - Calculate and format optimization metrics\n */\n\nimport type {\n  ConsolidationCandidate,\n  FileStats,\n  OptimizationMetrics,\n  TransformResult,\n} from '../types/index.js';\n\n/**\n * Calculate optimization metrics\n */\nexport function calculateMetrics(\n  candidates: ConsolidationCandidate[],\n  originalFiles: FileStats[],\n  transformResult: TransformResult,\n  cssOverhead: number\n): OptimizationMetrics {\n  const totalBytesSaved = candidates.reduce((sum, c) => sum + c.bytesSaved, 0);\n  const netSavings = totalBytesSaved - cssOverhead;\n\n  const originalTotalBytes = originalFiles.reduce((sum, f) => sum + f.originalSize, 0);\n  const optimizedTotalBytes = originalTotalBytes - netSavings;\n\n  // Estimate browser impact\n  // Based on research: ~0.1ms per KB of class parsing saved\n  const estimatedParseTimeSavedMs = Math.max(0, (netSavings / 1024) * 0.1);\n  const estimatedRenderTimeSavedMs = estimatedParseTimeSavedMs * 0.5;\n\n  return {\n    totalFilesScanned: originalFiles.length,\n    totalFilesModified: transformResult.filesModified,\n\n    totalClassStringsFound: candidates.reduce((sum, c) => sum + c.frequency, 0),\n    uniqueClassPatterns: candidates.length,\n    consolidatedPatterns: candidates.filter((c) => c.frequency >= 2).length,\n    totalOccurrencesReplaced: candidates.reduce((sum, c) => sum + c.frequency, 0),\n\n    originalTotalBytes,\n    optimizedTotalBytes,\n    bytesSaved: totalBytesSaved,\n    percentageReduction: originalTotalBytes > 0\n      ? (netSavings / originalTotalBytes) * 100\n      : 0,\n\n    originalCSSBytes: 0, // Would need to track CSS separately\n    consolidatedCSSBytes: cssOverhead,\n    netCSSChange: cssOverhead,\n\n    estimatedParseTimeSavedMs,\n    estimatedRenderTimeSavedMs,\n\n    topConsolidations: candidates.slice(0, 10).map((c) => ({\n      original: c.classString,\n      consolidated: c.hashName,\n      frequency: c.frequency,\n      bytesSaved: c.bytesSaved,\n    })),\n  };\n}\n\n/**\n * Calculate CSS overhead for a single pattern\n * More accurate estimation based on actual CSS output\n */\nexport function calculatePatternCSSOverhead(classes: string[]): number {\n  // Base overhead: selector + braces + newlines = ~15 bytes\n  // e.g., \".cp-a7b2c {\\n}\\n\" = ~15 bytes\n  const baseOverhead = 15;\n\n  // Per-class overhead: property: value; + newline = ~20 bytes average\n  // e.g., \"  display: flex;\\n\" = ~18 bytes\n  const perClassOverhead = 20;\n\n  return baseOverhead + (classes.length * perClassOverhead);\n}\n\n/**\n * Estimate CSS overhead from consolidated classes\n */\nexport function estimateCSSOverhead(candidates: ConsolidationCandidate[]): number {\n  return candidates.reduce((sum, c) => {\n    return sum + calculatePatternCSSOverhead(c.classes);\n  }, 0);\n}\n\n/**\n * Check if a pattern has net positive savings\n */\nexport function hasNetPositiveSavings(candidate: ConsolidationCandidate): boolean {\n  const cssOverhead = calculatePatternCSSOverhead(candidate.classes);\n  return candidate.bytesSaved > cssOverhead;\n}\n\n/**\n * Calculate net savings for a pattern\n */\nexport function calculateNetSavings(candidate: ConsolidationCandidate): number {\n  const cssOverhead = calculatePatternCSSOverhead(candidate.classes);\n  return candidate.bytesSaved - cssOverhead;\n}\n\n/**\n * Format bytes for display\n */\nexport function formatBytes(bytes: number): string {\n  if (bytes === 0) return '0 B';\n\n  const sign = bytes < 0 ? '-' : '';\n  const absBytes = Math.abs(bytes);\n\n  if (absBytes < 1024) {\n    return `${sign}${absBytes} B`;\n  } else if (absBytes < 1024 * 1024) {\n    return `${sign}${(absBytes / 1024).toFixed(2)} KB`;\n  } else {\n    return `${sign}${(absBytes / (1024 * 1024)).toFixed(2)} MB`;\n  }\n}\n\n/**\n * Format percentage for display\n */\nexport function formatPercentage(value: number): string {\n  return `${value.toFixed(2)}%`;\n}\n\n/**\n * Format time in milliseconds\n */\nexport function formatTime(ms: number): string {\n  if (ms < 1) {\n    return `${(ms * 1000).toFixed(2)}μs`;\n  } else if (ms < 1000) {\n    return `${ms.toFixed(2)}ms`;\n  } else {\n    return `${(ms / 1000).toFixed(2)}s`;\n  }\n}\n","/**\n * Pattern Detector - Identifies patterns worth consolidating\n */\n\nimport type {\n  ClasspressoConfig,\n  ClassOccurrence,\n  ConsolidationCandidate,\n} from '../types/index.js';\nimport { generateSequentialName } from '../utils/hash.js';\nimport { calculatePatternCSSOverhead } from './metrics.js';\nimport { isHydrationSafe } from './scanner.js';\n\n/**\n * Calculate bytes saved by consolidating a pattern\n */\nexport function calculateBytesSaved(\n  original: string,\n  hashName: string,\n  frequency: number,\n  excludedClasses: string[]\n): number {\n  // Original: \"flex flex-col gap-2 js-hook\" (with excluded)\n  // New: \"cp-a7b2c js-hook\"\n\n  // We're replacing the included classes portion only\n  const originalLength = original.length;\n  const excludedLength = excludedClasses.join(' ').length;\n  const includedLength = originalLength - excludedLength - (excludedClasses.length > 0 ? 1 : 0);\n\n  // New length is just the hash name\n  const newLength = hashName.length;\n\n  // Savings per occurrence\n  const savingsPerOccurrence = includedLength - newLength;\n\n  // Total savings across all occurrences\n  return savingsPerOccurrence * frequency;\n}\n\n/**\n * Detect patterns that are worth consolidating\n * Uses sequential naming (cp-a, cp-b, etc.) for shortest possible class names\n * @param occurrences - Map of pattern occurrences from scanner\n * @param config - Classpresso configuration\n * @param mergeablePatterns - Patterns that would be skipped in JS but not HTML (for SSR mode)\n */\nexport function detectConsolidatablePatterns(\n  occurrences: Map<string, ClassOccurrence>,\n  config: ClasspressoConfig,\n  mergeablePatterns?: Set<string>\n): ConsolidationCandidate[] {\n  // First pass: collect all valid candidates (without names yet)\n  const preliminaryCandidates: Array<{\n    occurrence: ClassOccurrence;\n    cssOverhead: number;\n  }> = [];\n\n  for (const [, occurrence] of occurrences) {\n    // Filter by minimum occurrences\n    if (occurrence.count < config.minOccurrences) continue;\n\n    // Filter by minimum classes\n    if (occurrence.classes.length < config.minClasses) continue;\n\n    // SSR mode: only transform patterns found in BOTH server and client contexts\n    // This prevents React hydration mismatches\n    if (config.ssr && !isHydrationSafe(occurrence)) {\n      continue;\n    }\n\n    // SSR mode: skip mergeable patterns to prevent hydration mismatches\n    // These are patterns that appear as className props in JS but get merged\n    // with component classes in HTML. If we consolidate in HTML but skip in JS,\n    // we get a mismatch. So we skip the pattern entirely in SSR mode.\n    if (config.ssr && mergeablePatterns && mergeablePatterns.has(occurrence.normalizedKey)) {\n      continue;\n    }\n\n    // Skip patterns that have excluded classes if skipPatternsWithExcludedClasses is enabled\n    // This prevents issues like \"hidden md:flex\" becoming \"_cp-xxx md:flex\" where\n    // the consolidated class has display:none that overrides the responsive md:flex\n    if (config.skipPatternsWithExcludedClasses && occurrence.excludedClasses.length > 0) {\n      continue;\n    }\n\n    const cssOverhead = calculatePatternCSSOverhead(occurrence.classes);\n    preliminaryCandidates.push({ occurrence, cssOverhead });\n  }\n\n  // Sort by frequency (highest first) for best sequential name assignment\n  // Most frequent patterns get shortest names (cp-a, cp-b, etc.)\n  preliminaryCandidates.sort((a, b) => b.occurrence.count - a.occurrence.count);\n\n  // Second pass: filter candidates that will have positive savings\n  // Use a placeholder name length estimate for initial filtering\n  const filteredCandidates: Array<{\n    occurrence: ClassOccurrence;\n    cssOverhead: number;\n  }> = [];\n\n  for (const { occurrence, cssOverhead } of preliminaryCandidates) {\n    // Estimate name length: cp-a (4 bytes) for first 36, cp-aa (5 bytes) for next, etc.\n    const estimatedNameLength = config.hashPrefix.length + 1; // Conservative estimate\n\n    // Calculate estimated bytes saved\n    const estimatedBytesSaved = calculateBytesSaved(\n      occurrence.classString,\n      'x'.repeat(estimatedNameLength), // placeholder\n      occurrence.count,\n      occurrence.excludedClasses\n    );\n\n    // Filter by minimum bytes saved\n    if (estimatedBytesSaved < config.minBytesSaved) continue;\n\n    // Filter by net positive savings (bytes saved > CSS overhead)\n    // Skip this check if forceAll is enabled (for React hydration consistency)\n    if (!config.forceAll) {\n      if (estimatedBytesSaved <= cssOverhead) continue;\n    }\n\n    filteredCandidates.push({ occurrence, cssOverhead });\n  }\n\n  // Third pass: assign sequential names to only the filtered candidates\n  const candidates: ConsolidationCandidate[] = [];\n\n  for (let i = 0; i < filteredCandidates.length; i++) {\n    const { occurrence } = filteredCandidates[i];\n\n    // Generate sequential name (cp-a, cp-b, cp-c, ...)\n    const hashName = generateSequentialName(i, config.hashPrefix);\n\n    // Calculate actual bytes saved with real name\n    const bytesSaved = calculateBytesSaved(\n      occurrence.classString,\n      hashName,\n      occurrence.count,\n      occurrence.excludedClasses\n    );\n\n    candidates.push({\n      classString: occurrence.classString,\n      normalizedKey: occurrence.normalizedKey,\n      frequency: occurrence.count,\n      bytesSaved,\n      classes: occurrence.classes,\n      excludedClasses: occurrence.excludedClasses,\n      hashName,\n    });\n  }\n\n  // Sort by bytes saved (highest first)\n  return candidates.sort((a, b) => b.bytesSaved - a.bytesSaved);\n}\n\n/**\n * Get summary statistics for detected patterns\n */\nexport function getPatternSummary(candidates: ConsolidationCandidate[]): {\n  totalPatterns: number;\n  totalOccurrences: number;\n  totalBytesSaved: number;\n  avgFrequency: number;\n  avgClassesPerPattern: number;\n} {\n  const totalPatterns = candidates.length;\n  const totalOccurrences = candidates.reduce((sum, c) => sum + c.frequency, 0);\n  const totalBytesSaved = candidates.reduce((sum, c) => sum + c.bytesSaved, 0);\n  const totalClasses = candidates.reduce((sum, c) => sum + c.classes.length, 0);\n\n  return {\n    totalPatterns,\n    totalOccurrences,\n    totalBytesSaved,\n    avgFrequency: totalPatterns > 0 ? totalOccurrences / totalPatterns : 0,\n    avgClassesPerPattern: totalPatterns > 0 ? totalClasses / totalPatterns : 0,\n  };\n}\n","/**\n * Consolidator - Creates consolidated class mappings\n */\n\nimport type {\n  ClasspressoConfig,\n  ConsolidationCandidate,\n  ClassMapping,\n  MappingManifest,\n  OptimizationMetrics,\n} from '../types/index.js';\nimport { writeFileContent } from '../utils/files.js';\nimport path from 'path';\n\n/**\n * Create class mappings from consolidation candidates\n */\nexport function createClassMappings(\n  candidates: ConsolidationCandidate[]\n): ClassMapping[] {\n  return candidates.map((candidate) => ({\n    original: candidate.classString,\n    consolidated: candidate.hashName,\n    classes: candidate.classes,\n    excludedClasses: candidate.excludedClasses,\n    cssDeclarations: '', // Will be filled by CSS generator\n    frequency: candidate.frequency,\n    bytesSaved: candidate.bytesSaved,\n  }));\n}\n\n/**\n * Build a lookup map from original class patterns to their consolidated names\n */\nexport function buildReplacementMap(\n  mappings: ClassMapping[]\n): Map<string, { consolidated: string; excludedClasses: string[] }> {\n  const map = new Map<string, { consolidated: string; excludedClasses: string[] }>();\n\n  for (const mapping of mappings) {\n    // Key is the sorted class string (without excluded classes)\n    const key = [...mapping.classes].sort().join(' ');\n    map.set(key, {\n      consolidated: mapping.consolidated,\n      excludedClasses: mapping.excludedClasses,\n    });\n  }\n\n  return map;\n}\n\n/**\n * Create and save the mapping manifest\n */\nexport async function saveMappingManifest(\n  mappings: ClassMapping[],\n  metrics: OptimizationMetrics,\n  config: ClasspressoConfig\n): Promise<string> {\n  const manifest: MappingManifest = {\n    version: '1.0.0',\n    tool: 'classpresso',\n    buildDir: config.buildDir,\n    created: new Date().toISOString(),\n    config: {\n      minOccurrences: config.minOccurrences,\n      minClasses: config.minClasses,\n      hashPrefix: config.hashPrefix,\n      hashLength: config.hashLength,\n    },\n    mappings,\n    metrics,\n  };\n\n  const manifestPath = path.join(config.buildDir, 'classpresso-manifest.json');\n  await writeFileContent(manifestPath, JSON.stringify(manifest, null, 2));\n\n  return manifestPath;\n}\n\n/**\n * Load an existing manifest\n */\nexport async function loadMappingManifest(\n  buildDir: string\n): Promise<MappingManifest | null> {\n  const manifestPath = path.join(buildDir, 'classpresso-manifest.json');\n\n  try {\n    const { readFileContent } = await import('../utils/files.js');\n    const content = await readFileContent(manifestPath);\n    return JSON.parse(content) as MappingManifest;\n  } catch {\n    return null;\n  }\n}\n","/**\n * CSS Generator - Creates consolidated CSS rules\n */\n\nimport postcss from 'postcss';\nimport type { ClassMapping } from '../types/index.js';\nimport { readFileContent, writeFileContent, findFiles, isCSSFile } from '../utils/files.js';\nimport { isNonFlattenableClass } from './scanner.js';\n\n// Map of Tailwind utility prefixes to CSS properties\nconst UTILITY_PROPERTY_MAP: Record<string, string | string[]> = {\n  // Display\n  'flex': 'display: flex',\n  'grid': 'display: grid',\n  'block': 'display: block',\n  'inline': 'display: inline',\n  'inline-block': 'display: inline-block',\n  'hidden': 'display: none',\n\n  // Flex direction\n  'flex-col': 'flex-direction: column',\n  'flex-row': 'flex-direction: row',\n  'flex-col-reverse': 'flex-direction: column-reverse',\n  'flex-row-reverse': 'flex-direction: row-reverse',\n\n  // Flex wrap\n  'flex-wrap': 'flex-wrap: wrap',\n  'flex-nowrap': 'flex-wrap: nowrap',\n\n  // Justify content\n  'justify-start': 'justify-content: flex-start',\n  'justify-end': 'justify-content: flex-end',\n  'justify-center': 'justify-content: center',\n  'justify-between': 'justify-content: space-between',\n  'justify-around': 'justify-content: space-around',\n  'justify-evenly': 'justify-content: space-evenly',\n\n  // Align items\n  'items-start': 'align-items: flex-start',\n  'items-end': 'align-items: flex-end',\n  'items-center': 'align-items: center',\n  'items-baseline': 'align-items: baseline',\n  'items-stretch': 'align-items: stretch',\n\n  // Text align\n  'text-left': 'text-align: left',\n  'text-center': 'text-align: center',\n  'text-right': 'text-align: right',\n\n  // Font weight\n  'font-bold': 'font-weight: 700',\n  'font-semibold': 'font-weight: 600',\n  'font-medium': 'font-weight: 500',\n  'font-normal': 'font-weight: 400',\n  'font-light': 'font-weight: 300',\n\n  // Position\n  'relative': 'position: relative',\n  'absolute': 'position: absolute',\n  'fixed': 'position: fixed',\n  'sticky': 'position: sticky',\n\n  // Overflow\n  'overflow-hidden': 'overflow: hidden',\n  'overflow-auto': 'overflow: auto',\n  'overflow-scroll': 'overflow: scroll',\n  'overflow-visible': 'overflow: visible',\n\n  // Cursor\n  'cursor-pointer': 'cursor: pointer',\n  'cursor-default': 'cursor: default',\n  'cursor-not-allowed': 'cursor: not-allowed',\n\n  // Misc\n  'truncate': ['overflow: hidden', 'text-overflow: ellipsis', 'white-space: nowrap'],\n  'uppercase': 'text-transform: uppercase',\n  'lowercase': 'text-transform: lowercase',\n  'capitalize': 'text-transform: capitalize',\n};\n\n/**\n * Parse a Tailwind utility class and return its CSS\n */\nexport function parseUtilityClass(className: string): string[] {\n  // Check direct mapping first\n  if (UTILITY_PROPERTY_MAP[className]) {\n    const value = UTILITY_PROPERTY_MAP[className];\n    return Array.isArray(value) ? value : [value];\n  }\n\n  // Handle arbitrary values: text-[var(--gold)]\n  const arbitraryMatch = className.match(/^([a-z]+(?:-[a-z]+)?)-\\[(.+)\\]$/);\n  if (arbitraryMatch) {\n    const [, prefix, value] = arbitraryMatch;\n    return parseArbitraryValue(prefix, value);\n  }\n\n  // Handle spacing utilities: p-4, m-2, gap-2, etc.\n  const spacingMatch = className.match(/^(p|px|py|pt|pb|pl|pr|m|mx|my|mt|mb|ml|mr|gap|gap-x|gap-y)-(\\d+(?:\\.\\d+)?|\\[.+\\])$/);\n  if (spacingMatch) {\n    const [, prefix, value] = spacingMatch;\n    return parseSpacingUtility(prefix, value);\n  }\n\n  // Handle sizing utilities: w-full, h-screen, etc.\n  const sizeMatch = className.match(/^(w|h|min-w|min-h|max-w|max-h)-(.+)$/);\n  if (sizeMatch) {\n    const [, prefix, value] = sizeMatch;\n    return parseSizeUtility(prefix, value);\n  }\n\n  // Handle rounded utilities\n  const roundedMatch = className.match(/^rounded(-[a-z]+)?(-[a-z0-9]+)?$/);\n  if (roundedMatch) {\n    return parseRoundedUtility(className);\n  }\n\n  // Handle text size utilities: text-sm, text-lg, etc.\n  const textSizeMatch = className.match(/^text-(xs|sm|base|lg|xl|2xl|3xl|4xl|5xl|6xl|7xl|8xl|9xl)$/);\n  if (textSizeMatch) {\n    return parseTextSizeUtility(textSizeMatch[1]);\n  }\n\n  // Handle opacity utilities\n  const opacityMatch = className.match(/^opacity-(\\d+)$/);\n  if (opacityMatch) {\n    return [`opacity: ${parseInt(opacityMatch[1]) / 100}`];\n  }\n\n  // Handle z-index utilities\n  const zMatch = className.match(/^z-(\\d+|auto)$/);\n  if (zMatch) {\n    return [`z-index: ${zMatch[1]}`];\n  }\n\n  // Unknown utility - return empty (will be looked up from CSS file)\n  return [];\n}\n\n/**\n * Parse arbitrary value syntax\n */\nfunction parseArbitraryValue(prefix: string, value: string): string[] {\n  const propertyMap: Record<string, string> = {\n    'text': 'color',\n    'bg': 'background-color',\n    'border': 'border-color',\n    'border-t': 'border-top-color',\n    'border-b': 'border-bottom-color',\n    'border-l': 'border-left-color',\n    'border-r': 'border-right-color',\n    'fill': 'fill',\n    'stroke': 'stroke',\n    'p': 'padding',\n    'px': 'padding-inline',\n    'py': 'padding-block',\n    'pt': 'padding-top',\n    'pb': 'padding-bottom',\n    'pl': 'padding-left',\n    'pr': 'padding-right',\n    'm': 'margin',\n    'mx': 'margin-inline',\n    'my': 'margin-block',\n    'mt': 'margin-top',\n    'mb': 'margin-bottom',\n    'ml': 'margin-left',\n    'mr': 'margin-right',\n    'w': 'width',\n    'h': 'height',\n    'min-w': 'min-width',\n    'min-h': 'min-height',\n    'max-w': 'max-width',\n    'max-h': 'max-height',\n    'top': 'top',\n    'bottom': 'bottom',\n    'left': 'left',\n    'right': 'right',\n    'gap': 'gap',\n    'gap-x': 'column-gap',\n    'gap-y': 'row-gap',\n  };\n\n  const property = propertyMap[prefix];\n  if (property) {\n    return [`${property}: ${value}`];\n  }\n\n  return [];\n}\n\n/**\n * Parse spacing utilities (padding, margin, gap)\n */\nfunction parseSpacingUtility(prefix: string, value: string): string[] {\n  // Convert Tailwind spacing scale to rem\n  const spacingScale: Record<string, string> = {\n    '0': '0px',\n    '0.5': '0.125rem',\n    '1': '0.25rem',\n    '1.5': '0.375rem',\n    '2': '0.5rem',\n    '2.5': '0.625rem',\n    '3': '0.75rem',\n    '3.5': '0.875rem',\n    '4': '1rem',\n    '5': '1.25rem',\n    '6': '1.5rem',\n    '7': '1.75rem',\n    '8': '2rem',\n    '9': '2.25rem',\n    '10': '2.5rem',\n    '11': '2.75rem',\n    '12': '3rem',\n    '14': '3.5rem',\n    '16': '4rem',\n    '20': '5rem',\n    '24': '6rem',\n    '28': '7rem',\n    '32': '8rem',\n    '36': '9rem',\n    '40': '10rem',\n    '44': '11rem',\n    '48': '12rem',\n    '52': '13rem',\n    '56': '14rem',\n    '60': '15rem',\n    '64': '16rem',\n    '72': '18rem',\n    '80': '20rem',\n    '96': '24rem',\n  };\n\n  // Handle arbitrary values\n  let cssValue = spacingScale[value];\n  if (!cssValue && value.startsWith('[') && value.endsWith(']')) {\n    cssValue = value.slice(1, -1);\n  }\n  if (!cssValue) return [];\n\n  const propertyMap: Record<string, string | string[]> = {\n    'p': 'padding',\n    'px': ['padding-left', 'padding-right'],\n    'py': ['padding-top', 'padding-bottom'],\n    'pt': 'padding-top',\n    'pb': 'padding-bottom',\n    'pl': 'padding-left',\n    'pr': 'padding-right',\n    'm': 'margin',\n    'mx': ['margin-left', 'margin-right'],\n    'my': ['margin-top', 'margin-bottom'],\n    'mt': 'margin-top',\n    'mb': 'margin-bottom',\n    'ml': 'margin-left',\n    'mr': 'margin-right',\n    'gap': 'gap',\n    'gap-x': 'column-gap',\n    'gap-y': 'row-gap',\n  };\n\n  const property = propertyMap[prefix];\n  if (Array.isArray(property)) {\n    return property.map((p) => `${p}: ${cssValue}`);\n  }\n  if (property) {\n    return [`${property}: ${cssValue}`];\n  }\n\n  return [];\n}\n\n/**\n * Parse size utilities (width, height)\n */\nfunction parseSizeUtility(prefix: string, value: string): string[] {\n  const sizeMap: Record<string, string> = {\n    'full': '100%',\n    'screen': '100vh',\n    'svh': '100svh',\n    'lvh': '100lvh',\n    'dvh': '100dvh',\n    'min': 'min-content',\n    'max': 'max-content',\n    'fit': 'fit-content',\n    'auto': 'auto',\n  };\n\n  let cssValue = sizeMap[value];\n  if (!cssValue && value.startsWith('[') && value.endsWith(']')) {\n    cssValue = value.slice(1, -1);\n  }\n  if (!cssValue) {\n    // Try numeric (spacing scale)\n    const spacingMatch = value.match(/^(\\d+(?:\\.\\d+)?)$/);\n    if (spacingMatch) {\n      cssValue = `${parseFloat(spacingMatch[1]) * 0.25}rem`;\n    }\n  }\n  if (!cssValue) return [];\n\n  const propertyMap: Record<string, string> = {\n    'w': 'width',\n    'h': 'height',\n    'min-w': 'min-width',\n    'min-h': 'min-height',\n    'max-w': 'max-width',\n    'max-h': 'max-height',\n  };\n\n  const property = propertyMap[prefix];\n  if (property) {\n    return [`${property}: ${cssValue}`];\n  }\n\n  return [];\n}\n\n/**\n * Parse rounded utilities\n */\nfunction parseRoundedUtility(className: string): string[] {\n  const roundedMap: Record<string, string> = {\n    'rounded': 'border-radius: 0.25rem',\n    'rounded-none': 'border-radius: 0px',\n    'rounded-sm': 'border-radius: 0.125rem',\n    'rounded-md': 'border-radius: 0.375rem',\n    'rounded-lg': 'border-radius: 0.5rem',\n    'rounded-xl': 'border-radius: 0.75rem',\n    'rounded-2xl': 'border-radius: 1rem',\n    'rounded-3xl': 'border-radius: 1.5rem',\n    'rounded-full': 'border-radius: 9999px',\n  };\n\n  if (roundedMap[className]) {\n    return [roundedMap[className]];\n  }\n\n  return [];\n}\n\n/**\n * Parse text size utilities\n */\nfunction parseTextSizeUtility(size: string): string[] {\n  const sizeMap: Record<string, [string, string]> = {\n    'xs': ['0.75rem', '1rem'],\n    'sm': ['0.875rem', '1.25rem'],\n    'base': ['1rem', '1.5rem'],\n    'lg': ['1.125rem', '1.75rem'],\n    'xl': ['1.25rem', '1.75rem'],\n    '2xl': ['1.5rem', '2rem'],\n    '3xl': ['1.875rem', '2.25rem'],\n    '4xl': ['2.25rem', '2.5rem'],\n    '5xl': ['3rem', '1'],\n    '6xl': ['3.75rem', '1'],\n    '7xl': ['4.5rem', '1'],\n    '8xl': ['6rem', '1'],\n    '9xl': ['8rem', '1'],\n  };\n\n  const [fontSize, lineHeight] = sizeMap[size] || ['1rem', '1.5rem'];\n  return [`font-size: ${fontSize}`, `line-height: ${lineHeight}`];\n}\n\n/**\n * Extract utility CSS from the build's CSS file\n */\nexport async function extractUtilityCSS(\n  buildDir: string\n): Promise<Map<string, string[]>> {\n  const utilityMap = new Map<string, string[]>();\n\n  // Find CSS files in build (supports all frameworks)\n  const cssPatterns = [\n    // Next.js\n    'static/**/*.css',\n    'static/css/**/*.css',\n    // Angular\n    'browser/**/*.css',\n    // Astro\n    '_astro/**/*.css',\n    // Nuxt\n    'public/_nuxt/**/*.css',\n    // Vite/Vue/React/Qwik generic\n    'assets/**/*.css',\n    // Gatsby/Hugo/Eleventy/Docusaurus/Parcel\n    '**/*.css',\n  ];\n  const cssFiles = await findFiles(buildDir, cssPatterns);\n\n  for (const cssFile of cssFiles) {\n    if (!isCSSFile(cssFile)) continue;\n\n    try {\n      const content = await readFileContent(cssFile);\n      const root = postcss.parse(content);\n\n      root.walkRules((rule) => {\n        // Extract class name from selector\n        const selectorMatch = rule.selector.match(/^\\.([^\\s:,\\[]+)/);\n        if (!selectorMatch) return;\n\n        const className = selectorMatch[1];\n        const declarations: string[] = [];\n\n        rule.walkDecls((decl) => {\n          declarations.push(`${decl.prop}: ${decl.value}`);\n        });\n\n        if (declarations.length > 0) {\n          utilityMap.set(className, declarations);\n        }\n      });\n    } catch {\n      // Skip files that can't be parsed\n    }\n  }\n\n  return utilityMap;\n}\n\n/**\n * Generate CSS for consolidated classes\n */\nexport async function generateConsolidatedCSS(\n  mappings: ClassMapping[],\n  buildDir: string,\n  cssLayer?: string | false\n): Promise<string> {\n  // First, try to extract utilities from the build CSS\n  const utilityMap = await extractUtilityCSS(buildDir);\n\n  const cssRules: string[] = [];\n\n  for (const mapping of mappings) {\n    const declarations: string[] = [];\n    const lossyClasses: string[] = [];\n\n    for (const className of mapping.classes) {\n      // Try to get from extracted utilities first\n      const extracted = utilityMap.get(className);\n      if (extracted) {\n        declarations.push(...extracted);\n        continue;\n      }\n\n      // Fall back to parsing the utility\n      const parsed = parseUtilityClass(className);\n      if (parsed.length > 0) {\n        declarations.push(...parsed);\n        continue;\n      }\n\n      // Class produced no CSS — if it's a non-flattenable class this is silent data loss\n      if (isNonFlattenableClass(className)) {\n        lossyClasses.push(className);\n      }\n    }\n\n    if (lossyClasses.length > 0) {\n      console.warn(\n        `[classpresso] WARNING: Lossy consolidation detected for \"${mapping.original}\" → \"${mapping.consolidated}\". ` +\n        `The following classes require media query, container query, or combinator selectors that cannot be ` +\n        `expressed as flat CSS and have been silently dropped: ${lossyClasses.join(', ')}. ` +\n        `To fix: set excludeNonFlattenableClasses: true in your classpresso.config (it is true by default) ` +\n        `or add these classes to exclude.patterns.`\n      );\n    }\n\n    // Remove duplicates\n    const uniqueDeclarations = [...new Set(declarations)];\n\n    if (uniqueDeclarations.length > 0) {\n      mapping.cssDeclarations = uniqueDeclarations.join('; ');\n      cssRules.push(`.${mapping.consolidated} {\\n  ${uniqueDeclarations.join(';\\n  ')};\\n}`);\n    }\n  }\n\n  const cssContent = cssRules.join('\\n\\n');\n\n  if (cssLayer) {\n    return `/* Classpresso Consolidated Classes */\\n@layer ${cssLayer} {\\n${cssRules.map(rule => '  ' + rule.replace(/\\n/g, '\\n  ')).join('\\n\\n')}\\n}`;\n  }\n\n  return `/* Classpresso Consolidated Classes */\\n${cssContent}`;\n}\n\n/**\n * Inject consolidated CSS into the build\n * Only injects into ONE CSS file (the largest) to avoid duplicating overhead\n */\nexport async function injectConsolidatedCSS(\n  buildDir: string,\n  consolidatedCSS: string\n): Promise<string> {\n  // Find CSS files in build (supports all frameworks)\n  const cssPatterns = [\n    // Next.js\n    'static/**/*.css',\n    'static/css/**/*.css',\n    'standalone/.next/static/**/*.css',\n    'standalone/.next/static/css/**/*.css',\n    // Angular\n    'browser/**/*.css',\n    // Astro\n    '_astro/**/*.css',\n    'client/_astro/**/*.css',\n    // Nuxt\n    'public/_nuxt/**/*.css',\n    // SvelteKit\n    '_app/**/*.css',\n    'client/**/*.css',\n    // Vite/Vue/React/Qwik generic\n    'assets/**/*.css',\n    // Gatsby/Hugo/Eleventy/Docusaurus/Parcel\n    '**/*.css',\n  ];\n  const cssFiles = await findFiles(buildDir, cssPatterns);\n\n  if (cssFiles.length === 0) {\n    throw new Error('No CSS files found in build output');\n  }\n\n  // Find the largest CSS file to inject into (likely the main stylesheet)\n  // This avoids duplicating the consolidated CSS across multiple files\n  let targetFile = cssFiles[0];\n  let maxSize = 0;\n\n  for (const cssFile of cssFiles) {\n    if (!isCSSFile(cssFile)) continue;\n    try {\n      const content = await readFileContent(cssFile);\n      // Skip if already injected\n      if (content.includes('Classpresso Consolidated')) {\n        return `none (already injected in ${cssFile})`;\n      }\n      const size = Buffer.byteLength(content, 'utf-8');\n      if (size > maxSize) {\n        maxSize = size;\n        targetFile = cssFile;\n      }\n    } catch {\n      // Skip files that can't be read\n    }\n  }\n\n  // Inject into the largest CSS file only\n  const existingContent = await readFileContent(targetFile);\n  const newContent = `${existingContent}\\n\\n${consolidatedCSS}`;\n  await writeFileContent(targetFile, newContent);\n\n  return targetFile;\n}\n","/**\n * Transformer - Replaces class patterns in build output\n */\n\nimport type { ClassMapping, TransformResult, ClasspressoConfig, DynamicBasePattern } from '../types/index.js';\nimport {\n  findFiles,\n  readFileContent,\n  writeFileContent,\n  backupFile,\n  isJSFile,\n  isHTMLFile,\n  isRSCFile,\n  DEFAULT_PATTERNS,\n  filterExcludedFiles,\n} from '../utils/files.js';\nimport { escapeRegex } from '../utils/regex.js';\nimport { normalizeClassString } from './scanner.js';\n\ninterface MatchPattern {\n  regex: RegExp;\n  supportsDataAttr: boolean;\n}\n\n/**\n * Check if a set of classes is a superset of any dynamic base pattern\n * This helps prevent hydration mismatches in React/Next.js\n */\nfunction isSupersetOfDynamicBase(\n  classes: string[],\n  dynamicBasePatterns: Map<string, DynamicBasePattern>\n): boolean {\n  const classSet = new Set(classes);\n\n  for (const [, pattern] of dynamicBasePatterns) {\n    // Check if all base classes are present in the target classes\n    const allBasePresent = pattern.baseClasses.every(cls => classSet.has(cls));\n\n    // If all base classes are present and target has MORE classes, it's a superset\n    if (allBasePresent && classes.length > pattern.baseClasses.length) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/**\n * Check if a set of classes exactly matches any dynamic base pattern\n */\nfunction matchesDynamicBase(\n  classes: string[],\n  dynamicBasePatterns: Map<string, DynamicBasePattern>\n): boolean {\n  const classSet = new Set(classes);\n\n  for (const [, pattern] of dynamicBasePatterns) {\n    if (classes.length !== pattern.baseClasses.length) continue;\n\n    const allMatch = pattern.baseClasses.every(cls => classSet.has(cls));\n    if (allMatch) return true;\n  }\n\n  return false;\n}\n\n/**\n * Build a regex pattern to match a class string in various contexts\n */\nfunction buildMatchPatterns(classString: string): MatchPattern[] {\n  const escaped = escapeRegex(classString);\n\n  return [\n    // className=\"...\" (JSX/HTML) - supports data attributes\n    { regex: new RegExp(`(className\\\\s*=\\\\s*\")${escaped}(\")`,'g'), supportsDataAttr: true },\n    { regex: new RegExp(`(className\\\\s*=\\\\s*')${escaped}(')`,'g'), supportsDataAttr: true },\n\n    // className:\"...\" (React createElement) - no data attr support\n    { regex: new RegExp(`(className\\\\s*:\\\\s*\")${escaped}(\")`,'g'), supportsDataAttr: false },\n    { regex: new RegExp(`(className\\\\s*:\\\\s*')${escaped}(')`,'g'), supportsDataAttr: false },\n\n    // Template literals: className:`...` (static content only)\n    { regex: new RegExp(`(className\\\\s*:\\\\s*\\`)${escaped}(\\`)`,'g'), supportsDataAttr: false },\n\n    // Template literals with dynamic suffix: className:`... ${...}`\n    // Matches static prefix before ${...} expression\n    { regex: new RegExp(`(className\\\\s*:\\\\s*\\`)${escaped}( \\\\$\\\\{)`,'g'), supportsDataAttr: false },\n\n    // \"className\",\"...\" (minified) - no data attr support\n    { regex: new RegExp(`(\"className\"\\\\s*,\\\\s*\")${escaped}(\")`,'g'), supportsDataAttr: false },\n\n    // class=\"...\" (HTML) - supports data attributes\n    { regex: new RegExp(`(\\\\bclass\\\\s*=\\\\s*\")${escaped}(\")`,'g'), supportsDataAttr: true },\n    { regex: new RegExp(`(\\\\bclass\\\\s*=\\\\s*')${escaped}(')`,'g'), supportsDataAttr: true },\n\n    // class:\"...\" (Vue/Quasar createElement) - no data attr support\n    { regex: new RegExp(`(\\\\bclass\\\\s*:\\\\s*\")${escaped}(\")`,'g'), supportsDataAttr: false },\n    { regex: new RegExp(`(\\\\bclass\\\\s*:\\\\s*')${escaped}(')`,'g'), supportsDataAttr: false },\n\n    // HTML entity encoded: class=&quot;...&quot; - supports data attributes\n    { regex: new RegExp(`(class=&quot;)${escaped}(&quot;)`,'g'), supportsDataAttr: true },\n    { regex: new RegExp(`(class=&#34;)${escaped}(&#34;)`,'g'), supportsDataAttr: true },\n\n    // RSC payload (escaped JSON in HTML): \\\"className\\\":\\\"...\\\"\n    // This is used in Next.js self.__next_f.push() payloads\n    { regex: new RegExp(`(\\\\\\\\\"className\\\\\\\\\"\\\\s*:\\\\s*\\\\\\\\\")${escaped}(\\\\\\\\\")`, 'g'), supportsDataAttr: false },\n  ];\n}\n\n/**\n * Replace a single class pattern in content\n */\nfunction replacePattern(\n  content: string,\n  originalClasses: string,\n  consolidated: string,\n  excludedClasses: string[],\n  originalClassList: string[],\n  addDataAttributes: boolean\n): { content: string; replacements: number } {\n  let replacements = 0;\n  let result = content;\n\n  // Build the replacement string (consolidated + excluded classes)\n  const replacement = excludedClasses.length > 0\n    ? `${consolidated} ${excludedClasses.join(' ')}`\n    : consolidated;\n\n  // Build the data attribute string\n  const dataAttr = addDataAttributes\n    ? ` data-cp-original=\"${originalClassList.join(' ')}\"`\n    : '';\n\n  // Try exact match first\n  const patterns = buildMatchPatterns(originalClasses);\n\n  for (const { regex: pattern, supportsDataAttr } of patterns) {\n    const beforeLength = result.length;\n    const suffix = (addDataAttributes && supportsDataAttr) ? dataAttr : '';\n    result = result.replace(pattern, `$1${replacement}$2${suffix}`);\n    if (result.length !== beforeLength) {\n      // Count replacements (approximate)\n      const matches = content.match(pattern);\n      if (matches) replacements += matches.length;\n    }\n  }\n\n  return { content: result, replacements };\n}\n\n/**\n * Find all variations of a class pattern that should be replaced\n * This handles cases where classes appear in different orders\n */\nfunction findClassVariations(\n  content: string,\n  mapping: ClassMapping,\n  config: ClasspressoConfig\n): string[] {\n  const variations: string[] = [];\n  const targetClasses = new Set(mapping.classes);\n\n  // Create regex patterns to find className attributes (including HTML entity encoded and template literals)\n  const classAttrPatterns = [\n    /(?:className|class)\\s*[=:]\\s*[\"']([^\"']+)[\"']/g,\n    /class=&quot;([^&]+)&quot;/g,\n    /class=&#34;([^&]+)&#34;/g,\n    // Template literals - static only: className:`...`\n    /(?:className|class)\\s*:\\s*`([^`$]+)`/g,\n    // Template literals with dynamic suffix: className:`... ${...}`\n    // Captures the static part before the ${\n    /(?:className|class)\\s*:\\s*`([^`$]+) \\$\\{/g,\n    // RSC payload (escaped JSON in HTML): \\\"className\\\":\\\"...\\\"\n    // Used in Next.js self.__next_f.push() payloads\n    /\\\\\"className\\\\\"\\s*:\\s*\\\\\"([^\"\\\\]+)\\\\\"/g,\n  ];\n\n  for (const classAttrRegex of classAttrPatterns) {\n    classAttrRegex.lastIndex = 0;\n    let match;\n    while ((match = classAttrRegex.exec(content)) !== null) {\n      const classString = match[1];\n      const { classes } = normalizeClassString(classString, config.exclude);\n\n      // Check if this class string contains all the target classes\n      if (classes.length >= targetClasses.size) {\n        const classSet = new Set(classes);\n        let allPresent = true;\n\n        for (const targetClass of targetClasses) {\n          if (!classSet.has(targetClass)) {\n            allPresent = false;\n            break;\n          }\n        }\n\n        // If all target classes are present and it's an exact match\n        if (allPresent && classes.length === targetClasses.size) {\n          variations.push(classString);\n        }\n      }\n    }\n  }\n\n  return [...new Set(variations)];\n}\n\n/**\n * Transform a single file\n */\nasync function transformFile(\n  filePath: string,\n  mappings: ClassMapping[],\n  config: ClasspressoConfig,\n  dryRun: boolean,\n  dynamicBasePatterns: Map<string, DynamicBasePattern>,\n  mergeablePatterns: Set<string>\n): Promise<{ modified: boolean; replacements: number; skippedForHydration: number; error?: string }> {\n  try {\n    let content = await readFileContent(filePath);\n    let totalReplacements = 0;\n    let skippedForHydration = 0;\n    const originalContent = content;\n    const isJS = isJSFile(filePath);\n\n    for (const mapping of mappings) {\n      // Skip patterns that would cause hydration mismatches (SSR mode only)\n      // In non-SSR builds there is no server-rendered HTML to reconcile against,\n      // so template-literal base patterns pose no hydration risk.\n      if (config.ssr && dynamicBasePatterns.size > 0) {\n        // Skip if the pattern is a superset of OR exactly matches a dynamic base\n        // This prevents hydration mismatches in React/Next.js where:\n        // - HTML has rendered result: \"px-4 py-2 bg-blue\" (superset of base)\n        // - JS has template literal: `px-4 py-2 ${dynamic}` (base pattern)\n        // - Static JS may also have: \"px-4 py-2 bg-blue\" (same as HTML)\n        // All must stay untransformed to match at hydration time\n        const isSuperset = isSupersetOfDynamicBase(mapping.classes, dynamicBasePatterns);\n        const isExact = matchesDynamicBase(mapping.classes, dynamicBasePatterns);\n\n        if (isSuperset || isExact) {\n          skippedForHydration++;\n          continue;\n        }\n      }\n\n      // Skip mergeable patterns in JS files (SSR mode only)\n      // These are patterns that appear in JS as className props but get merged\n      // with component-internal classes in the HTML output during SSR.\n      // In non-SSR builds, className props are applied client-side only and\n      // there is no server-rendered HTML to cause a mismatch.\n      // NOTE: In SSR mode, mergeable patterns are also filtered at pattern detection\n      // time (pattern-detector.ts) to ensure consistent transformation across files.\n      if (config.ssr && isJS && mergeablePatterns.has(mapping.original)) {\n        skippedForHydration++;\n        continue;\n      }\n\n      // Find all variations of this pattern in the file\n      const variations = findClassVariations(content, mapping, config);\n\n      for (const variation of variations) {\n        const { content: newContent, replacements } = replacePattern(\n          content,\n          variation,\n          mapping.consolidated,\n          mapping.excludedClasses,\n          mapping.classes,\n          config.dataAttributes\n        );\n        content = newContent;\n        totalReplacements += replacements;\n      }\n    }\n\n    const modified = content !== originalContent;\n\n    if (modified && !dryRun) {\n      if (config.backup) {\n        await backupFile(filePath);\n      }\n      await writeFileContent(filePath, content);\n    }\n\n    return { modified, replacements: totalReplacements, skippedForHydration };\n  } catch (err) {\n    return {\n      modified: false,\n      replacements: 0,\n      skippedForHydration: 0,\n      error: `Error transforming ${filePath}: ${err}`,\n    };\n  }\n}\n\n/**\n * Transform all files in the build output\n */\nexport async function transformBuildOutput(\n  mappings: ClassMapping[],\n  config: ClasspressoConfig,\n  dryRun: boolean = false,\n  dynamicBasePatterns: Map<string, DynamicBasePattern> = new Map(),\n  mergeablePatterns: Set<string> = new Set()\n): Promise<TransformResult> {\n  if (config.verbose) {\n    if (dynamicBasePatterns.size > 0) {\n      console.log(`  ℹ Found ${dynamicBasePatterns.size} dynamic base patterns (template literals)`);\n    }\n    if (mergeablePatterns.size > 0) {\n      console.log(`  ℹ Found ${mergeablePatterns.size} mergeable patterns (className props)`);\n    }\n  }\n\n  const patterns = config.include.length > 0 ? config.include : DEFAULT_PATTERNS;\n  const allFiles = await findFiles(config.buildDir, patterns);\n\n  // Filter out excluded files\n  const files = filterExcludedFiles(allFiles, config.exclude.files || []);\n\n  if (config.verbose && allFiles.length !== files.length) {\n    console.log(`  ℹ Excluded ${allFiles.length - files.length} files from transformation`);\n  }\n\n  let filesModified = 0;\n  let totalBytesChanged = 0;\n  let totalSkippedForHydration = 0;\n  const errors: string[] = [];\n\n  for (const filePath of files) {\n    // Only transform JS, HTML, and RSC files\n    if (!isJSFile(filePath) && !isHTMLFile(filePath) && !isRSCFile(filePath)) {\n      continue;\n    }\n\n    const result = await transformFile(filePath, mappings, config, dryRun, dynamicBasePatterns, mergeablePatterns);\n\n    if (result.error) {\n      errors.push(result.error);\n    }\n\n    if (result.modified) {\n      filesModified++;\n      // Estimate bytes changed based on replacements\n      totalBytesChanged += result.replacements * 10; // Rough estimate\n    }\n\n    totalSkippedForHydration += result.skippedForHydration;\n  }\n\n  if (config.verbose && totalSkippedForHydration > 0) {\n    console.log(`Skipped ${totalSkippedForHydration} pattern transformations to prevent hydration mismatches`);\n  }\n\n  return {\n    filesModified,\n    bytesChanged: totalBytesChanged,\n    errors,\n  };\n}\n","/**\n * Rehasher - Restore the cache-busting contract for content-hashed assets.\n *\n * Bundlers (Vite/Rollup `[hash]`, webpack `[contenthash]`, …) name assets after their\n * PRE-optimization content. Classpresso rewrites those files in place but keeps the\n * filename, so the hash in the filename no longer reflects the SERVED content. A returning\n * client with `Cache-Control: immutable` then keeps serving a stale cached copy after a\n * redeploy: old `cp-*` rules against new `cp-*` references → broken styling.\n *\n * The fix: after all mutations are done, re-hash every content-hashed asset whose content\n * actually changed, rename it to a new content-hash filename, and rewrite every reference\n * to it (HTML, JS, CSS `url()`, and bundler manifest JSON) so the build stays internally\n * consistent. Identical input → identical output, so the names are deterministic.\n *\n * Only JS/CSS assets with a hash-shaped filename are renamed. HTML/RSC entry documents are\n * never renamed (they are served by route, not by hash) but their references are updated.\n */\n\nimport { rename } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport crypto from 'crypto';\nimport path from 'path';\nimport type { ClasspressoConfig } from '../types/index.js';\nimport {\n  findFiles,\n  readFileContent,\n  writeFileContent,\n  filterExcludedFiles,\n  isJSFile,\n  isCSSFile,\n  DEFAULT_PATTERNS,\n} from '../utils/files.js';\n\nexport interface RehashRename {\n  /** Absolute path before renaming */\n  fromPath: string;\n  /** Absolute path after renaming */\n  toPath: string;\n  /** Original filename (basename) */\n  fromName: string;\n  /** New filename (basename) */\n  toName: string;\n}\n\nexport interface RehashResult {\n  /** Assets that were renamed to a new content-hash filename */\n  renamed: RehashRename[];\n  /** Number of files whose references were rewritten */\n  filesUpdated: number;\n  /** Non-fatal errors */\n  errors: string[];\n}\n\n/**\n * Decide whether a filename segment looks like a bundler content hash.\n *\n * Content hashes are hex or base64url and effectively always contain a digit or mix\n * letter cases. Plain human-readable name parts (\"react-dom\", \"vendor\", \"polyfills\")\n * are all-lowercase with no digit, so they are left alone.\n */\nfunction looksLikeHash(segment: string): boolean {\n  if (segment.length < 8) return false;\n  if (!/^[A-Za-z0-9_-]+$/.test(segment)) return false;\n  const hasDigit = /[0-9]/.test(segment);\n  const hasUpper = /[A-Z]/.test(segment);\n  const hasLower = /[a-z]/.test(segment);\n  return hasDigit || (hasUpper && hasLower);\n}\n\n/**\n * Split a filename into { prefix, hash, ext } when it carries a content hash.\n * Returns null when no hash-shaped segment is present.\n *\n * Handles the common forms:\n *   index-D4Gx2k_p.css   (Vite/Rollup: name-<hash>.ext)\n *   main.1f2e3d4c.js     (webpack: name.<hash>.ext)\n *   D4Gx2k_p.css         (filename is the hash itself)\n */\nexport function detectContentHash(\n  basename: string\n): { prefix: string; hash: string; ext: string } | null {\n  const extMatch = basename.match(/\\.[^.]+$/);\n  if (!extMatch) return null;\n  const ext = extMatch[0];\n  const stem = basename.slice(0, -ext.length);\n\n  // Split on the last `-` or `.` separator (NOT `_`, which appears inside base64url hashes).\n  const sepMatch = stem.match(/^(.*[-.])([A-Za-z0-9_-]+)$/);\n  if (sepMatch && looksLikeHash(sepMatch[2])) {\n    return { prefix: sepMatch[1], hash: sepMatch[2], ext };\n  }\n\n  // Whole stem is the hash (no human-readable prefix).\n  if (looksLikeHash(stem)) {\n    return { prefix: '', hash: stem, ext };\n  }\n\n  return null;\n}\n\n/**\n * Compute a content hash of the SAME length as the original, so the new filename stays tidy.\n * Deterministic: identical content always yields the same name.\n */\nfunction computeHash(content: string, length: number): string {\n  const digest = crypto.createHash('sha256').update(content).digest('hex');\n  return digest.slice(0, Math.max(8, length));\n}\n\n/**\n * Asset file patterns (JS + CSS) used for hashing snapshots and rehash candidates.\n */\nfunction assetPatterns(config: ClasspressoConfig): string[] {\n  return config.include.length > 0 ? config.include : DEFAULT_PATTERNS;\n}\n\n/**\n * Snapshot the content hash of every candidate asset BEFORE any mutation.\n * Compared against the post-mutation state to find what actually changed.\n */\nexport async function captureAssetHashes(\n  config: ClasspressoConfig\n): Promise<Map<string, string>> {\n  const snapshot = new Map<string, string>();\n  const allFiles = await findFiles(config.buildDir, assetPatterns(config));\n  const files = filterExcludedFiles(allFiles, config.exclude.files || []);\n\n  for (const filePath of files) {\n    if (!isJSFile(filePath) && !isCSSFile(filePath)) continue;\n    try {\n      const content = await readFileContent(filePath);\n      snapshot.set(path.resolve(filePath), computeHash(content, 16));\n    } catch {\n      // Unreadable file - skip; it simply won't be considered for rehashing.\n    }\n  }\n\n  return snapshot;\n}\n\n/**\n * All text files in the build whose references may point at hashed assets.\n */\nasync function findReferenceFiles(buildDir: string): Promise<string[]> {\n  const patterns = [\n    '**/*.html',\n    '**/*.htm',\n    '**/*.js',\n    '**/*.mjs',\n    '**/*.cjs',\n    '**/*.css',\n    '**/*.rsc',\n    '**/*.json',\n    '**/*.map',\n    '**/*.webmanifest',\n  ];\n  const files = await findFiles(buildDir, patterns);\n  return [...new Set(files)];\n}\n\n/**\n * Re-hash modified content-hashed assets and rewrite every reference to them.\n *\n * @param originalHashes Snapshot from captureAssetHashes(), taken before mutation.\n */\nexport async function rehashAssets(\n  config: ClasspressoConfig,\n  originalHashes: Map<string, string>\n): Promise<RehashResult> {\n  const result: RehashResult = { renamed: [], filesUpdated: 0, errors: [] };\n\n  const allFiles = await findFiles(config.buildDir, assetPatterns(config));\n  const files = filterExcludedFiles(allFiles, config.exclude.files || []);\n\n  // Plan renames for every hashed asset whose content changed.\n  const renameMap = new Map<string, string>(); // old basename -> new basename\n  for (const filePath of files) {\n    if (!isJSFile(filePath) && !isCSSFile(filePath)) continue;\n\n    const absPath = path.resolve(filePath);\n    const original = originalHashes.get(absPath);\n\n    let content: string;\n    try {\n      content = await readFileContent(filePath);\n    } catch {\n      continue;\n    }\n\n    const current = computeHash(content, 16);\n    // Unchanged content keeps its filename - nothing to do.\n    if (original !== undefined && original === current) continue;\n    // A file with no snapshot entry was created during optimization; treat as changed.\n\n    const dir = path.dirname(filePath);\n    const basename = path.basename(filePath);\n    const parsed = detectContentHash(basename);\n    if (!parsed) continue; // Not content-hashed - renaming would break a stable name.\n\n    const newHash = computeHash(content, parsed.hash.length);\n    if (newHash === parsed.hash) continue; // Hash already reflects content (shouldn't happen, but safe).\n\n    const newName = `${parsed.prefix}${newHash}${parsed.ext}`;\n    if (newName === basename || renameMap.has(basename)) continue;\n\n    const toPath = path.join(dir, newName);\n    try {\n      await rename(filePath, toPath);\n      // Keep the backup paired with the renamed asset so restores still line up.\n      const backup = `${filePath}.classpresso-backup`;\n      if (existsSync(backup)) {\n        await rename(backup, `${toPath}.classpresso-backup`);\n      }\n      renameMap.set(basename, newName);\n      result.renamed.push({\n        fromPath: filePath,\n        toPath,\n        fromName: basename,\n        toName: newName,\n      });\n    } catch (err) {\n      result.errors.push(`Failed to rename ${basename} -> ${newName}: ${err}`);\n    }\n  }\n\n  if (renameMap.size === 0) return result;\n\n  // Rewrite every reference to the old filenames across all text files.\n  const referenceFiles = await findReferenceFiles(config.buildDir);\n  for (const filePath of referenceFiles) {\n    try {\n      const content = await readFileContent(filePath);\n      let updated = content;\n      for (const [oldName, newName] of renameMap) {\n        if (updated.includes(oldName)) {\n          updated = updated.split(oldName).join(newName);\n        }\n      }\n      if (updated !== content) {\n        await writeFileContent(filePath, updated);\n        result.filesUpdated++;\n      }\n    } catch (err) {\n      result.errors.push(`Failed to rewrite references in ${filePath}: ${err}`);\n    }\n  }\n\n  return result;\n}\n","/**\n * Configuration loader for Classpresso\n */\n\nimport { readFileContent } from './utils/files.js';\nimport { stat } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport path from 'path';\nimport type { ClasspressoConfig } from './types/index.js';\n\n/**\n * Build directory candidates in priority order.\n * When multiple exist, we use the most recently modified.\n */\nexport const BUILD_DIR_CANDIDATES = [\n  '.next',           // Next.js\n  'dist',            // Vite, Angular, generic\n  'build',           // Create React App, Remix, Docusaurus\n  '.output',         // Nuxt 3, Solid Start\n  '.svelte-kit',     // SvelteKit (intermediate)\n  'public',          // Gatsby, Hugo\n  '_site',           // Eleventy\n  'out',             // Next.js static export\n  '.vitepress/dist', // VitePress\n  'web/dist',        // RedwoodJS\n];\n\n/**\n * Default prefixes that indicate dynamically-generated classes from icon/component libraries.\n * Patterns containing these will be skipped to prevent hydration mismatches.\n */\nexport const DEFAULT_DYNAMIC_PREFIXES = [\n  'lucide',      // lucide-react icons\n  'heroicon',    // heroicons\n  'icon-',       // generic icon patterns\n  'fa-',         // Font Awesome\n  'fas',         // Font Awesome solid\n  'far',         // Font Awesome regular\n  'fab',         // Font Awesome brands\n  'material-icons', // Material Design Icons\n  'mdi-',        // Material Design Icons (alternative)\n  'ri-',         // Remix Icons\n  'bi-',         // Bootstrap Icons\n  'tabler-',     // Tabler Icons\n  'phosphor-',   // Phosphor Icons\n];\n\n/**\n * Default configuration\n */\nexport const DEFAULT_CONFIG: ClasspressoConfig = {\n  buildDir: '.next',\n  minOccurrences: 2,\n  minClasses: 2,\n  minBytesSaved: 10,\n  hashPrefix: 'cp-',\n  hashLength: 5,\n  exclude: {\n    prefixes: ['js-', 'data-', 'hook-', 'track-'],\n    suffixes: ['-handler', '-trigger'],\n    classes: [],\n    patterns: [/^qa-/, /^test-/, /^e2e-/],\n    files: [],\n  },\n  include: [],\n  cssLayer: false,\n  dataAttributes: false,\n  manifest: true,\n  backup: false,\n  verbose: false,\n  forceAll: false,\n  excludeDynamicPatterns: true,\n  dynamicPrefixes: DEFAULT_DYNAMIC_PREFIXES,\n  skipPatternsWithExcludedClasses: true,\n  ssr: false,\n  debug: false,\n  sendErrorReports: false,\n  errorReportUrl: undefined,\n  excludeNonFlattenableClasses: true,\n  purgeUnusedCSS: false,\n  rehashAssets: true,\n  purgeSafelist: [\n    /^js-/,      // JavaScript hooks\n    /^data-/,    // Data attributes used as classes\n    /^is-/,      // State classes\n    /^has-/,     // State classes\n    /^active$/,\n    /^disabled$/,\n    /^hidden$/,\n    /^visible$/,\n  ],\n};\n\n/**\n * Load configuration from file or use defaults\n */\nexport async function loadConfig(buildDir?: string): Promise<ClasspressoConfig> {\n  const config = { ...DEFAULT_CONFIG };\n\n  if (buildDir) {\n    config.buildDir = buildDir;\n  }\n\n  // Try to load config file from current directory\n  const configPaths = [\n    'classpresso.config.js',\n    'classpresso.config.mjs',\n    'classpresso.config.json',\n  ];\n\n  for (const configPath of configPaths) {\n    try {\n      const fullPath = path.resolve(process.cwd(), configPath);\n\n      if (configPath.endsWith('.json')) {\n        const content = await readFileContent(fullPath);\n        const userConfig = JSON.parse(content);\n        return mergeConfig(config, userConfig);\n      } else {\n        // Dynamic import for JS config files\n        const userConfig = await import(fullPath);\n        return mergeConfig(config, userConfig.default || userConfig);\n      }\n    } catch {\n      // Config file not found, continue to next\n    }\n  }\n\n  return config;\n}\n\n/**\n * Merge user config with defaults\n */\nfunction mergeConfig(\n  defaults: ClasspressoConfig,\n  userConfig: Partial<ClasspressoConfig>\n): ClasspressoConfig {\n  return {\n    ...defaults,\n    ...userConfig,\n    exclude: {\n      ...defaults.exclude,\n      ...userConfig.exclude,\n      // Merge arrays instead of replacing\n      prefixes: [\n        ...(defaults.exclude.prefixes || []),\n        ...(userConfig.exclude?.prefixes || []),\n      ],\n      suffixes: [\n        ...(defaults.exclude.suffixes || []),\n        ...(userConfig.exclude?.suffixes || []),\n      ],\n      classes: [\n        ...(defaults.exclude.classes || []),\n        ...(userConfig.exclude?.classes || []),\n      ],\n      patterns: [\n        ...(defaults.exclude.patterns || []),\n        ...(userConfig.exclude?.patterns || []),\n      ],\n      files: [\n        ...(defaults.exclude.files || []),\n        ...(userConfig.exclude?.files || []),\n      ],\n    },\n    // Merge dynamicPrefixes arrays\n    dynamicPrefixes: [\n      ...(defaults.dynamicPrefixes || []),\n      ...(userConfig.dynamicPrefixes || []),\n    ],\n    // Merge purgeSafelist arrays\n    purgeSafelist: [\n      ...(defaults.purgeSafelist || []),\n      ...(userConfig.purgeSafelist || []),\n    ],\n  };\n}\n\n/**\n * Validate configuration\n */\nexport function validateConfig(config: ClasspressoConfig): string[] {\n  const errors: string[] = [];\n\n  if (config.minOccurrences < 1) {\n    errors.push('minOccurrences must be at least 1');\n  }\n\n  if (config.minClasses < 1) {\n    errors.push('minClasses must be at least 1');\n  }\n\n  if (config.hashLength < 3) {\n    errors.push('hashLength must be at least 3');\n  }\n\n  if (config.hashLength > 32) {\n    errors.push('hashLength must be at most 32');\n  }\n\n  if (!config.hashPrefix || config.hashPrefix.length === 0) {\n    errors.push('hashPrefix must not be empty');\n  }\n\n  // Validate error reporting configuration\n  if (config.sendErrorReports && !config.errorReportUrl) {\n    errors.push('errorReportUrl is required when sendErrorReports is true');\n  }\n\n  if (config.errorReportUrl && !isValidHttpsUrl(config.errorReportUrl)) {\n    errors.push('errorReportUrl must be a valid HTTPS URL');\n  }\n\n  return errors;\n}\n\n/**\n * Check if a URL is a valid HTTPS URL\n */\nfunction isValidHttpsUrl(url: string): boolean {\n  try {\n    const parsed = new URL(url);\n    return parsed.protocol === 'https:';\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Auto-detect build directory from common framework patterns.\n * Returns the most recently modified build directory if multiple exist.\n * Returns null if no build directory is found.\n */\nexport async function detectBuildDir(cwd: string = process.cwd()): Promise<{\n  detected: string | null;\n  candidates: string[];\n  suggestion: string | null;\n}> {\n  const foundDirs: Array<{ dir: string; mtime: Date }> = [];\n  const existingCandidates: string[] = [];\n\n  for (const candidate of BUILD_DIR_CANDIDATES) {\n    const fullPath = path.resolve(cwd, candidate);\n\n    if (existsSync(fullPath)) {\n      existingCandidates.push(candidate);\n      try {\n        const stats = await stat(fullPath);\n        if (stats.isDirectory()) {\n          foundDirs.push({ dir: candidate, mtime: stats.mtime });\n        }\n      } catch {\n        // Skip if we can't stat\n      }\n    }\n  }\n\n  // No build directories found\n  if (foundDirs.length === 0) {\n    return {\n      detected: null,\n      candidates: [],\n      suggestion: 'No build directory found. Run your build command first, then try again.',\n    };\n  }\n\n  // Single directory found - use it\n  if (foundDirs.length === 1) {\n    return {\n      detected: foundDirs[0].dir,\n      candidates: existingCandidates,\n      suggestion: null,\n    };\n  }\n\n  // Multiple directories found - use most recently modified\n  foundDirs.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());\n  const mostRecent = foundDirs[0];\n\n  return {\n    detected: mostRecent.dir,\n    candidates: existingCandidates,\n    suggestion: `Multiple build directories found (${existingCandidates.join(', ')}). Using most recent: ${mostRecent.dir}`,\n  };\n}\n\n/**\n * Framework hints from package.json dependencies\n */\ninterface FrameworkHint {\n  name: string;\n  buildDir: string;\n}\n\n/**\n * Try to detect framework from package.json and suggest build directory\n */\nexport async function detectFrameworkHint(cwd: string = process.cwd()): Promise<FrameworkHint | null> {\n  const packageJsonPath = path.resolve(cwd, 'package.json');\n\n  if (!existsSync(packageJsonPath)) {\n    return null;\n  }\n\n  try {\n    const content = await readFileContent(packageJsonPath);\n    const pkg = JSON.parse(content);\n    const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n    // Check for frameworks in priority order\n    if (deps['next']) return { name: 'Next.js', buildDir: '.next' };\n    if (deps['nuxt']) return { name: 'Nuxt', buildDir: '.output' };\n    if (deps['@sveltejs/kit']) return { name: 'SvelteKit', buildDir: 'build' };\n    if (deps['astro']) return { name: 'Astro', buildDir: 'dist' };\n    if (deps['@remix-run/react']) return { name: 'Remix', buildDir: 'build' };\n    if (deps['solid-start']) return { name: 'Solid Start', buildDir: '.output' };\n    if (deps['@builder.io/qwik']) return { name: 'Qwik', buildDir: 'dist' };\n    if (deps['gatsby']) return { name: 'Gatsby', buildDir: 'public' };\n    if (deps['@angular/core']) return { name: 'Angular', buildDir: 'dist' };\n    if (deps['vite']) return { name: 'Vite', buildDir: 'dist' };\n    if (deps['@docusaurus/core']) return { name: 'Docusaurus', buildDir: 'build' };\n    if (deps['@11ty/eleventy']) return { name: 'Eleventy', buildDir: '_site' };\n\n    return null;\n  } catch {\n    return null;\n  }\n}\n","/**\n * Classpresso - CSS Class Consolidation Tool\n *\n * Compress multiple utility classes into single optimized classes\n * https://classpresso.com\n */\n\n// Types\nexport type {\n  ClasspressoConfig,\n  ExcludeConfig,\n  ClassMapping,\n  ClassOccurrence,\n  ConsolidationCandidate,\n  OptimizationMetrics,\n  MappingManifest,\n  ScanResult,\n  TransformResult,\n  FileStats,\n  DynamicBasePattern,\n  SourceFileType,\n} from './types/index.js';\n\n// Core functions\nexport { scanBuildOutput, normalizeClassString, shouldExcludeClass, containsDynamicPrefix, isProperSubset, detectMergeablePatterns } from './core/scanner.js';\nexport { detectConsolidatablePatterns, getPatternSummary } from './core/pattern-detector.js';\nexport { createClassMappings, saveMappingManifest, loadMappingManifest, buildReplacementMap } from './core/consolidator.js';\nexport { generateConsolidatedCSS, injectConsolidatedCSS, parseUtilityClass } from './core/css-generator.js';\nexport { transformBuildOutput } from './core/transformer.js';\nexport { captureAssetHashes, rehashAssets, detectContentHash } from './core/rehasher.js';\nexport type { RehashResult, RehashRename } from './core/rehasher.js';\nexport { calculateMetrics, estimateCSSOverhead, formatBytes, formatPercentage, formatTime } from './core/metrics.js';\n\n// Configuration\nexport { loadConfig, validateConfig, DEFAULT_CONFIG, DEFAULT_DYNAMIC_PREFIXES } from './config.js';\n\n// Utilities\nexport { generateHashName, resolveCollisions } from './utils/hash.js';\nexport { escapeRegex, isDynamicClassString, extractDynamicBaseStrings, CLASS_PATTERNS, ALL_CLASS_PATTERNS, DYNAMIC_BASE_PATTERNS } from './utils/regex.js';\nexport { findFiles, readFileContent, writeFileContent, getFileSize, backupFile, DEFAULT_PATTERNS } from './utils/files.js';\n"]}