{"version":3,"sources":["../src/pagespeed/constants.ts","../src/pagespeed/extractors.ts","../src/pagespeed/utils.ts","../src/pagespeed/insights.ts","../src/pagespeed/client.ts","../src/lighthouse/index.ts","../src/context/index.ts","../src/report/utils.ts","../src/report/diagnostics.ts","../src/report/lcp.ts","../src/report/opportunities.ts","../src/report/generator.ts","../src/bundle/runner.ts","../src/analyzer/analyzer.ts","../src/index.ts"],"names":["fs","path","promisify","exec"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @silverassist/performance-toolkit\n *\n * PageSpeed API constants and configuration values.\n *\n * @module pagespeed/constants\n * @author Miguel Colmenares <me@miguelcolmenares.com>\n * @license PolyForm-Noncommercial-1.0.0\n */\n\nimport type { Category } from \"../types\";\n\n/** PageSpeed Insights API base URL */\nexport const PSI_API_URL =\n  \"https://www.googleapis.com/pagespeedonline/v5/runPagespeed\";\n\n/** Default request timeout in milliseconds */\nexport const DEFAULT_TIMEOUT = 60000;\n\n/** Default categories to analyze */\nexport const DEFAULT_CATEGORIES: Category[] = [\n  \"performance\",\n  \"accessibility\",\n  \"best-practices\",\n  \"seo\",\n];\n\n/** Audit IDs for performance improvement opportunities */\nexport const OPPORTUNITY_AUDITS = [\n  \"render-blocking-resources\",\n  \"unused-css-rules\",\n  \"unused-javascript\",\n  \"modern-image-formats\",\n  \"offscreen-images\",\n  \"unminified-css\",\n  \"unminified-javascript\",\n  \"efficient-animated-content\",\n  \"uses-optimized-images\",\n  \"uses-responsive-images\",\n  \"server-response-time\",\n  \"uses-text-compression\",\n  \"uses-rel-preconnect\",\n  \"uses-rel-preload\",\n  \"font-display\",\n  \"third-party-summary\",\n] as const;\n\n/** Audit IDs for diagnostic information */\nexport const DIAGNOSTIC_AUDITS = [\n  \"mainthread-work-breakdown\",\n  \"bootup-time\",\n  \"dom-size\",\n  \"critical-request-chains\",\n  \"network-requests\",\n  \"network-rtt\",\n  \"network-server-latency\",\n  \"long-tasks\",\n  \"non-composited-animations\",\n  \"unsized-images\",\n  \"viewport\",\n  \"no-document-write\",\n  \"js-libraries\",\n] as const;\n\n/** Third-party entity name patterns */\nexport const THIRD_PARTY_PATTERNS: Record<string, string> = {\n  facebook: \"Facebook\",\n  \"fb.com\": \"Facebook\",\n  fbcdn: \"Facebook\",\n  google: \"Google\",\n  googleapis: \"Google APIs\",\n  gstatic: \"Google Static\",\n  googletagmanager: \"Google Tag Manager\",\n  \"google-analytics\": \"Google Analytics\",\n  doubleclick: \"DoubleClick\",\n  twitter: \"Twitter\",\n  twimg: \"Twitter\",\n  linkedin: \"LinkedIn\",\n  trustedform: \"TrustedForm\",\n  leadid: \"LeadID\",\n  jornaya: \"Jornaya\",\n  cloudflare: \"Cloudflare\",\n  cloudfront: \"CloudFront\",\n  amazonaws: \"AWS\",\n  cdn: \"CDN\",\n  jquery: \"jQuery\",\n  unpkg: \"unpkg\",\n  cdnjs: \"cdnjs\",\n  bootstrapcdn: \"Bootstrap CDN\",\n};\n","/**\n * @silverassist/performance-toolkit\n *\n * PageSpeed data extractors for scores, metrics, opportunities, and diagnostics.\n *\n * @module pagespeed/extractors\n * @author Miguel Colmenares <me@miguelcolmenares.com>\n * @license PolyForm-Noncommercial-1.0.0\n */\n\nimport type {\n  CoreWebVitals,\n  CategoryScores,\n  Diagnostic,\n  LCPElement,\n  MetricValue,\n  Opportunity,\n  PageSpeedResponse,\n} from \"../types\";\nimport { OPPORTUNITY_AUDITS, DIAGNOSTIC_AUDITS } from \"./constants\";\n\ntype LighthouseResult = PageSpeedResponse[\"lighthouseResult\"];\ntype LighthouseAudit = LighthouseResult[\"audits\"][string];\n\n/**\n * Extracts category scores from Lighthouse result\n */\nexport function extractScores(result: LighthouseResult): CategoryScores {\n  const { categories } = result;\n\n  return {\n    performance:\n      categories.performance?.score != null\n        ? Math.round(categories.performance.score * 100)\n        : null,\n    accessibility:\n      categories.accessibility?.score != null\n        ? Math.round(categories.accessibility.score * 100)\n        : null,\n    bestPractices:\n      categories[\"best-practices\"]?.score != null\n        ? Math.round(categories[\"best-practices\"].score * 100)\n        : null,\n    seo:\n      categories.seo?.score != null\n        ? Math.round(categories.seo.score * 100)\n        : null,\n  };\n}\n\n/**\n * Extracts Core Web Vitals metrics from audits\n */\nexport function extractMetrics(result: LighthouseResult): CoreWebVitals {\n  const { audits } = result;\n\n  return {\n    lcp: extractMetricValue(audits[\"largest-contentful-paint\"]),\n    fcp: extractMetricValue(audits[\"first-contentful-paint\"]),\n    cls: extractMetricValue(audits[\"cumulative-layout-shift\"]),\n    tbt: extractMetricValue(audits[\"total-blocking-time\"]),\n    si: extractMetricValue(audits[\"speed-index\"]),\n    tti: extractMetricValue(audits[\"interactive\"]),\n  };\n}\n\n/**\n * Extracts a single metric value from audit\n */\nexport function extractMetricValue(audit?: LighthouseAudit): MetricValue {\n  if (!audit) {\n    return { value: 0, displayValue: \"N/A\", rating: \"poor\" };\n  }\n\n  const value = audit.numericValue ?? 0;\n  const displayValue = audit.displayValue ?? \"N/A\";\n  const score = audit.score ?? 0;\n\n  let rating: MetricValue[\"rating\"];\n  if (score >= 0.9) {\n    rating = \"good\";\n  } else if (score >= 0.5) {\n    rating = \"needs-improvement\";\n  } else {\n    rating = \"poor\";\n  }\n\n  return { value, displayValue, rating };\n}\n\n/**\n * Extracts LCP element information\n */\nexport function extractLCPElement(\n  result: LighthouseResult,\n): LCPElement | undefined {\n  const lcpAudit = result.audits[\"largest-contentful-paint-element\"];\n\n  if (!lcpAudit?.details?.items?.[0]) {\n    return undefined;\n  }\n\n  const item = lcpAudit.details.items[0] as Record<string, unknown>;\n  const node = item.node as Record<string, unknown> | undefined;\n\n  return {\n    tagName: (node?.nodeLabel as string) ?? \"Unknown\",\n    selector: (node?.selector as string) ?? \"\",\n    url: node?.lhId as string | undefined,\n    nodePath: (node?.path as string) ?? \"\",\n    snippet: (node?.snippet as string) ?? undefined,\n  };\n}\n\n/**\n * Extracts performance improvement opportunities\n */\nexport function extractOpportunities(result: LighthouseResult): Opportunity[] {\n  const opportunities: Opportunity[] = [];\n\n  for (const id of OPPORTUNITY_AUDITS) {\n    const audit = result.audits[id];\n    if (\n      !audit ||\n      audit.score === 1 ||\n      audit.scoreDisplayMode === \"notApplicable\"\n    ) {\n      continue;\n    }\n\n    opportunities.push({\n      id,\n      title: audit.title,\n      description: audit.description,\n      savingsMs: audit.details?.overallSavingsMs,\n      savingsBytes: audit.details?.overallSavingsBytes,\n      score: audit.score,\n      items: audit.details?.items as Array<Record<string, unknown>> | undefined,\n    });\n  }\n\n  return opportunities.sort((a, b) => (b.savingsMs ?? 0) - (a.savingsMs ?? 0));\n}\n\n/**\n * Extracts diagnostic information\n */\nexport function extractDiagnostics(result: LighthouseResult): Diagnostic[] {\n  const diagnostics: Diagnostic[] = [];\n\n  for (const id of DIAGNOSTIC_AUDITS) {\n    const audit = result.audits[id];\n    if (!audit || audit.scoreDisplayMode === \"notApplicable\") {\n      continue;\n    }\n\n    diagnostics.push({\n      id,\n      title: audit.title,\n      description: audit.description,\n      displayValue: audit.displayValue,\n      score: audit.score,\n      details: audit.details,\n    });\n  }\n\n  return diagnostics;\n}\n","/**\n * @silverassist/performance-toolkit\n *\n * PageSpeed utility functions for data extraction and formatting.\n *\n * @module pagespeed/utils\n * @author Miguel Colmenares <me@miguelcolmenares.com>\n * @license PolyForm-Noncommercial-1.0.0\n */\n\nimport { THIRD_PARTY_PATTERNS } from \"./constants\";\n\n/**\n * Formats cache TTL to human-readable string\n */\nexport function formatCacheTTL(ms: number): string {\n  if (ms === 0) return \"No cache\";\n  const seconds = Math.floor(ms / 1000);\n  if (seconds < 60) return `${seconds}s`;\n  const minutes = Math.floor(seconds / 60);\n  if (minutes < 60) return `${minutes}m`;\n  const hours = Math.floor(minutes / 60);\n  if (hours < 24) return `${hours}h`;\n  const days = Math.floor(hours / 24);\n  if (days < 365) return `${days}d`;\n  const years = Math.floor(days / 365);\n  return `${years}y`;\n}\n\n/**\n * Extracts entity/third-party name from URL\n */\nexport function extractEntityFromUrl(url: string): string | undefined {\n  try {\n    const hostname = new URL(url).hostname;\n\n    for (const [pattern, name] of Object.entries(THIRD_PARTY_PATTERNS)) {\n      if (hostname.includes(pattern)) {\n        return name;\n      }\n    }\n\n    return undefined;\n  } catch {\n    return undefined;\n  }\n}\n\n/**\n * Categorizes third-party by type\n */\nexport function categorizeThirdParty(entity: string): string {\n  const lower = entity.toLowerCase();\n  if (lower.includes(\"analytics\") || lower.includes(\"tag manager\"))\n    return \"analytics\";\n  if (\n    lower.includes(\"facebook\") ||\n    lower.includes(\"twitter\") ||\n    lower.includes(\"linkedin\")\n  )\n    return \"social\";\n  if (lower.includes(\"ad\") || lower.includes(\"doubleclick\"))\n    return \"advertising\";\n  if (\n    lower.includes(\"cdn\") ||\n    lower.includes(\"cloudflare\") ||\n    lower.includes(\"cloudfront\")\n  )\n    return \"cdn\";\n  if (lower.includes(\"font\")) return \"fonts\";\n  if (\n    lower.includes(\"trustedform\") ||\n    lower.includes(\"leadid\") ||\n    lower.includes(\"jornaya\")\n  )\n    return \"lead-tracking\";\n  return \"other\";\n}\n\n/**\n * Checks if URL is first-party\n */\nexport function isFirstParty(url: string, hostDomain: string): boolean {\n  try {\n    const urlHost = new URL(url).hostname;\n    return urlHost.includes(hostDomain) || urlHost === hostDomain;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Gets host domain from URL\n * @param url - The URL to extract domain from\n * @returns The host domain\n */\nexport function getHostDomain(url: string): string {\n  try {\n    return new URL(url).hostname;\n  } catch {\n    return \"\";\n  }\n}\n","/**\n * @silverassist/performance-toolkit\n *\n * Detailed insights extractors for AI agents and actionable data.\n *\n * @module pagespeed/insights\n * @author Miguel Colmenares <me@miguelcolmenares.com>\n * @license PolyForm-Noncommercial-1.0.0\n */\n\nimport type {\n  CacheIssue,\n  DetailedInsights,\n  ImageIssue,\n  LCPBreakdown,\n  LegacyJSIssue,\n  LongTask,\n  PageSpeedResponse,\n  RenderBlockingResource,\n  ThirdPartyIssue,\n  UnusedCodeIssue,\n} from \"../types\";\nimport {\n  formatCacheTTL,\n  extractEntityFromUrl,\n  categorizeThirdParty,\n  isFirstParty,\n  getHostDomain,\n} from \"./utils\";\n\ntype LighthouseAudits = PageSpeedResponse[\"lighthouseResult\"][\"audits\"];\n\n/**\n * Extracts all detailed insights for actionable improvements\n */\nexport function extractDetailedInsights(\n  audits: LighthouseAudits,\n  analyzedUrl?: string,\n): DetailedInsights {\n  const hostDomain = analyzedUrl ? getHostDomain(analyzedUrl) : \"\";\n\n  const cacheIssues = extractCacheIssues(audits);\n  const imageIssues = extractImageIssues(audits);\n  const unusedJavaScript = extractUnusedCode(\n    audits,\n    \"unused-javascript\",\n    hostDomain,\n  );\n  const unusedCSS = extractUnusedCode(audits, \"unused-css-rules\", hostDomain);\n  const legacyJavaScript = extractLegacyJavaScript(audits);\n  const thirdParties = extractThirdParties(audits);\n  const longTasks = extractLongTasks(audits);\n  const renderBlocking = extractRenderBlockingResources(audits);\n  const lcpBreakdown = extractLCPBreakdown(audits);\n\n  // Calculate total savings\n  let totalTimeMs = 0;\n  let totalSizeBytes = 0;\n\n  for (const issue of [...unusedJavaScript, ...unusedCSS]) {\n    totalSizeBytes += issue.wastedBytes;\n  }\n  for (const issue of cacheIssues) {\n    totalSizeBytes += issue.wastedBytes;\n  }\n  for (const issue of imageIssues) {\n    totalSizeBytes += issue.wastedBytes;\n  }\n  for (const resource of renderBlocking) {\n    totalTimeMs += resource.wastedMs;\n  }\n\n  return {\n    lcpBreakdown,\n    cacheIssues,\n    imageIssues,\n    unusedJavaScript,\n    unusedCSS,\n    legacyJavaScript,\n    thirdParties,\n    longTasks,\n    renderBlocking,\n    totalSavings: {\n      timeMs: Math.round(totalTimeMs),\n      sizeBytes: Math.round(totalSizeBytes),\n    },\n  };\n}\n\n/**\n * Extracts resources with poor cache policies\n */\nexport function extractCacheIssues(audits: LighthouseAudits): CacheIssue[] {\n  const audit = audits[\"uses-long-cache-ttl\"];\n  if (!audit?.details?.items) return [];\n\n  const items = audit.details.items as Array<Record<string, unknown>>;\n  const issues: CacheIssue[] = [];\n\n  for (const item of items) {\n    const url = item.url as string;\n    if (!url) continue;\n\n    issues.push({\n      url,\n      cacheTTL: (item.cacheLifetimeMs as number) ?? 0,\n      cacheTTLDisplay: formatCacheTTL((item.cacheLifetimeMs as number) ?? 0),\n      transferSize: (item.totalBytes as number) ?? 0,\n      wastedBytes: (item.wastedBytes as number) ?? 0,\n      entity: extractEntityFromUrl(url),\n    });\n  }\n\n  return issues.sort((a, b) => b.wastedBytes - a.wastedBytes);\n}\n\n/**\n * Extracts image optimization issues from multiple audits\n */\nexport function extractImageIssues(audits: LighthouseAudits): ImageIssue[] {\n  const issues: ImageIssue[] = [];\n  const seenUrls = new Set<string>();\n\n  // Modern image formats (WebP/AVIF)\n  const modernFormats = audits[\"modern-image-formats\"];\n  if (modernFormats?.details?.items) {\n    const items = modernFormats.details.items as Array<Record<string, unknown>>;\n    for (const item of items) {\n      const url = item.url as string;\n      if (!url || seenUrls.has(url)) continue;\n      seenUrls.add(url);\n\n      issues.push({\n        url,\n        totalBytes: (item.totalBytes as number) ?? 0,\n        wastedBytes: (item.wastedBytes as number) ?? 0,\n        issueType: \"format\",\n        recommendation: \"Convert to WebP or AVIF format\",\n        snippet: (item.node as Record<string, unknown>)?.snippet as\n          | string\n          | undefined,\n      });\n    }\n  }\n\n  // Responsive images (oversized)\n  const responsive = audits[\"uses-responsive-images\"];\n  if (responsive?.details?.items) {\n    const items = responsive.details.items as Array<Record<string, unknown>>;\n    for (const item of items) {\n      const url = item.url as string;\n      if (!url || seenUrls.has(url)) continue;\n      seenUrls.add(url);\n\n      issues.push({\n        url,\n        totalBytes: (item.totalBytes as number) ?? 0,\n        wastedBytes: (item.wastedBytes as number) ?? 0,\n        issueType: \"oversized\",\n        recommendation: \"Serve properly sized images for viewport\",\n        snippet: (item.node as Record<string, unknown>)?.snippet as\n          | string\n          | undefined,\n      });\n    }\n  }\n\n  // Offscreen images (lazy load candidates)\n  const offscreen = audits[\"offscreen-images\"];\n  if (offscreen?.details?.items) {\n    const items = offscreen.details.items as Array<Record<string, unknown>>;\n    for (const item of items) {\n      const url = item.url as string;\n      if (!url || seenUrls.has(url)) continue;\n      seenUrls.add(url);\n\n      issues.push({\n        url,\n        totalBytes: (item.totalBytes as number) ?? 0,\n        wastedBytes: (item.wastedBytes as number) ?? 0,\n        issueType: \"offscreen\",\n        recommendation: \"Lazy-load offscreen images with loading='lazy'\",\n        snippet: (item.node as Record<string, unknown>)?.snippet as\n          | string\n          | undefined,\n      });\n    }\n  }\n\n  // Unoptimized images (compression)\n  const unoptimized = audits[\"uses-optimized-images\"];\n  if (unoptimized?.details?.items) {\n    const items = unoptimized.details.items as Array<Record<string, unknown>>;\n    for (const item of items) {\n      const url = item.url as string;\n      if (!url || seenUrls.has(url)) continue;\n      seenUrls.add(url);\n\n      issues.push({\n        url,\n        totalBytes: (item.totalBytes as number) ?? 0,\n        wastedBytes: (item.wastedBytes as number) ?? 0,\n        issueType: \"unoptimized\",\n        recommendation: \"Compress image or use better optimization\",\n        snippet: (item.node as Record<string, unknown>)?.snippet as\n          | string\n          | undefined,\n      });\n    }\n  }\n\n  return issues.sort((a, b) => b.wastedBytes - a.wastedBytes);\n}\n\n/**\n * Extracts unused JavaScript or CSS\n */\nexport function extractUnusedCode(\n  audits: LighthouseAudits,\n  auditId: \"unused-javascript\" | \"unused-css-rules\",\n  hostDomain: string,\n): UnusedCodeIssue[] {\n  const audit = audits[auditId];\n  if (!audit?.details?.items) return [];\n\n  const items = audit.details.items as Array<Record<string, unknown>>;\n  const issues: UnusedCodeIssue[] = [];\n\n  for (const item of items) {\n    const url = item.url as string;\n    if (!url) continue;\n\n    const transferSize = (item.totalBytes as number) ?? 0;\n    const wastedBytes = (item.wastedBytes as number) ?? 0;\n\n    issues.push({\n      url,\n      transferSize,\n      wastedBytes,\n      wastedPercent:\n        transferSize > 0 ? Math.round((wastedBytes / transferSize) * 100) : 0,\n      entity: extractEntityFromUrl(url),\n      isFirstParty: isFirstParty(url, hostDomain),\n    });\n  }\n\n  return issues.sort((a, b) => b.wastedBytes - a.wastedBytes);\n}\n\n/**\n * Extracts legacy JavaScript polyfills\n */\nexport function extractLegacyJavaScript(\n  audits: LighthouseAudits,\n): LegacyJSIssue[] {\n  const audit = audits[\"legacy-javascript\"];\n  if (!audit?.details?.items) return [];\n\n  const items = audit.details.items as Array<Record<string, unknown>>;\n  const issues: LegacyJSIssue[] = [];\n\n  for (const item of items) {\n    const url = item.url as string;\n    if (!url) continue;\n\n    const subItems = item.subItems as\n      | { items?: Array<{ signal?: string }> }\n      | undefined;\n    const polyfills: string[] = [];\n\n    if (subItems?.items) {\n      for (const sub of subItems.items) {\n        if (sub.signal) {\n          polyfills.push(sub.signal);\n        }\n      }\n    }\n\n    issues.push({\n      url,\n      wastedBytes: (item.wastedBytes as number) ?? 0,\n      polyfills,\n      entity: extractEntityFromUrl(url),\n    });\n  }\n\n  return issues.sort((a, b) => b.wastedBytes - a.wastedBytes);\n}\n\n/**\n * Extracts third-party script impact\n */\nexport function extractThirdParties(\n  audits: LighthouseAudits,\n): ThirdPartyIssue[] {\n  const audit = audits[\"third-party-summary\"];\n  if (!audit?.details?.items) return [];\n\n  const items = audit.details.items as Array<Record<string, unknown>>;\n  const issues: ThirdPartyIssue[] = [];\n\n  for (const item of items) {\n    const entity = item.entity as string | { text?: string } | undefined;\n    const entityName =\n      typeof entity === \"string\" ? entity : (entity?.text ?? \"Unknown\");\n\n    // Get URLs from subItems\n    const subItems = item.subItems as\n      | { items?: Array<{ url?: string }> }\n      | undefined;\n    const urls: string[] = [];\n    if (subItems?.items) {\n      for (const sub of subItems.items) {\n        if (sub.url) urls.push(sub.url);\n      }\n    }\n\n    issues.push({\n      entity: entityName,\n      blockingTime: (item.blockingTime as number) ?? 0,\n      transferSize: (item.transferSize as number) ?? 0,\n      requestCount: urls.length,\n      urls,\n      category: categorizeThirdParty(entityName),\n    });\n  }\n\n  return issues.sort((a, b) => b.blockingTime - a.blockingTime);\n}\n\n/**\n * Extracts long tasks blocking main thread\n */\nexport function extractLongTasks(audits: LighthouseAudits): LongTask[] {\n  const audit = audits[\"long-tasks\"];\n  if (!audit?.details?.items) return [];\n\n  const items = audit.details.items as Array<Record<string, unknown>>;\n  const tasks: LongTask[] = [];\n\n  for (const item of items) {\n    tasks.push({\n      duration: (item.duration as number) ?? 0,\n      startTime: (item.startTime as number) ?? 0,\n      url: item.url as string | undefined,\n      attribution: (item.attribution as string) ?? undefined,\n    });\n  }\n\n  return tasks.sort((a, b) => b.duration - a.duration);\n}\n\n/**\n * Extracts render-blocking resources\n */\nexport function extractRenderBlockingResources(\n  audits: LighthouseAudits,\n): RenderBlockingResource[] {\n  const audit = audits[\"render-blocking-resources\"];\n  if (!audit?.details?.items) return [];\n\n  const items = audit.details.items as Array<Record<string, unknown>>;\n  const resources: RenderBlockingResource[] = [];\n\n  for (const item of items) {\n    const url = item.url as string;\n    if (!url) continue;\n\n    let resourceType: RenderBlockingResource[\"resourceType\"] = \"other\";\n    if (url.endsWith(\".js\") || url.includes(\".js?\")) {\n      resourceType = \"script\";\n    } else if (url.endsWith(\".css\") || url.includes(\".css?\")) {\n      resourceType = \"stylesheet\";\n    }\n\n    resources.push({\n      url,\n      transferSize: (item.totalBytes as number) ?? 0,\n      wastedMs: (item.wastedMs as number) ?? 0,\n      resourceType,\n    });\n  }\n\n  return resources.sort((a, b) => b.wastedMs - a.wastedMs);\n}\n\n/**\n * Extracts LCP timing breakdown\n */\nexport function extractLCPBreakdown(\n  audits: LighthouseAudits,\n): LCPBreakdown | undefined {\n  const lcpAudit = audits[\"largest-contentful-paint\"];\n  if (!lcpAudit?.numericValue) return undefined;\n\n  const fcpAudit = audits[\"first-contentful-paint\"];\n  const ttfbAudit = audits[\"server-response-time\"];\n\n  // Get TTFB\n  const ttfb = ttfbAudit?.numericValue ?? 0;\n\n  // Estimate breakdown based on available metrics\n  const totalLcp = lcpAudit.numericValue;\n  const fcp = fcpAudit?.numericValue ?? 0;\n\n  // These are estimates when precise breakdown isn't available\n  const resourceLoadDelay = Math.max(0, fcp - ttfb);\n  const resourceLoadDuration = Math.max(0, (totalLcp - fcp) * 0.6);\n  const elementRenderDelay = Math.max(\n    0,\n    totalLcp - ttfb - resourceLoadDelay - resourceLoadDuration,\n  );\n\n  return {\n    ttfb: Math.round(ttfb),\n    resourceLoadDelay: Math.round(resourceLoadDelay),\n    resourceLoadDuration: Math.round(resourceLoadDuration),\n    elementRenderDelay: Math.round(elementRenderDelay),\n    total: Math.round(totalLcp),\n  };\n}\n","/**\n * @silverassist/performance-toolkit\n *\n * PageSpeed API client for fetching and analyzing performance data.\n *\n * @module pagespeed/client\n * @author Miguel Colmenares <me@miguelcolmenares.com>\n * @license PolyForm-Noncommercial-1.0.0\n */\n\nimport type {\n  Category,\n  PageSpeedOptions,\n  PageSpeedResponse,\n  PerformanceResult,\n  Strategy,\n} from \"../types\";\nimport { PSI_API_URL, DEFAULT_TIMEOUT, DEFAULT_CATEGORIES } from \"./constants\";\nimport {\n  extractScores,\n  extractMetrics,\n  extractLCPElement,\n  extractOpportunities,\n  extractDiagnostics,\n} from \"./extractors\";\nimport { extractDetailedInsights } from \"./insights\";\n\n/**\n * PageSpeed Insights API client for fetching performance data\n */\nexport class PageSpeedClient {\n  private apiKey?: string;\n  private timeout: number;\n\n  /**\n   * Creates a new PageSpeed client\n   * @param apiKey - Optional API key for higher rate limits\n   * @param timeout - Request timeout in milliseconds\n   */\n  constructor(apiKey?: string, timeout = DEFAULT_TIMEOUT) {\n    this.apiKey = apiKey;\n    this.timeout = timeout;\n  }\n\n  /**\n   * Analyzes a URL using PageSpeed Insights API\n   * @param options - Analysis options\n   * @returns Performance analysis result\n   */\n  async analyze(options: PageSpeedOptions): Promise<PerformanceResult> {\n    const {\n      url,\n      strategy = \"mobile\",\n      categories = DEFAULT_CATEGORIES,\n      apiKey = this.apiKey,\n      timeout = this.timeout,\n    } = options;\n\n    const apiUrl = this.buildApiUrl(url, strategy, categories, apiKey);\n    const response = await this.fetchWithTimeout(apiUrl, timeout);\n    const data = (await response.json()) as PageSpeedResponse;\n\n    return this.transformResponse(data, url, strategy);\n  }\n\n  /**\n   * Analyzes a URL for both mobile and desktop\n   * @param url - URL to analyze\n   * @param categories - Categories to analyze\n   * @returns Object with mobile and desktop results\n   */\n  async analyzeAll(\n    url: string,\n    categories: Category[] = DEFAULT_CATEGORIES,\n  ): Promise<{ mobile: PerformanceResult; desktop: PerformanceResult }> {\n    const [mobile, desktop] = await Promise.all([\n      this.analyze({ url, strategy: \"mobile\", categories }),\n      this.analyze({ url, strategy: \"desktop\", categories }),\n    ]);\n\n    return { mobile, desktop };\n  }\n\n  /**\n   * Builds the PageSpeed API URL with query parameters\n   */\n  private buildApiUrl(\n    url: string,\n    strategy: Strategy,\n    categories: Category[],\n    apiKey?: string,\n  ): string {\n    const params = new URLSearchParams();\n    params.append(\"url\", url);\n    params.append(\"strategy\", strategy.toUpperCase());\n\n    // Add each category separately (API requires separate params)\n    for (const category of categories) {\n      params.append(\"category\", category.toUpperCase().replace(\"-\", \"_\"));\n    }\n\n    if (apiKey) {\n      params.append(\"key\", apiKey);\n    }\n\n    return `${PSI_API_URL}?${params.toString()}`;\n  }\n\n  /**\n   * Fetches URL with timeout using AbortController\n   */\n  private async fetchWithTimeout(\n    url: string,\n    timeout: number,\n  ): Promise<Response> {\n    const controller = new AbortController();\n    const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n    try {\n      const response = await fetch(url, { signal: controller.signal });\n\n      if (!response.ok) {\n        throw new Error(\n          `PageSpeed API error: ${response.status} ${response.statusText}`,\n        );\n      }\n\n      return response;\n    } finally {\n      clearTimeout(timeoutId);\n    }\n  }\n\n  /**\n   * Transforms PageSpeed API response to PerformanceResult\n   */\n  private transformResponse(\n    data: PageSpeedResponse,\n    url: string,\n    strategy: Strategy,\n  ): PerformanceResult {\n    const { lighthouseResult, loadingExperience } = data;\n\n    return {\n      url,\n      strategy,\n      timestamp: data.analysisUTCTimestamp,\n      scores: extractScores(lighthouseResult),\n      metrics: extractMetrics(lighthouseResult),\n      lcpElement: extractLCPElement(lighthouseResult),\n      opportunities: extractOpportunities(lighthouseResult),\n      diagnostics: extractDiagnostics(lighthouseResult),\n      insights: extractDetailedInsights(lighthouseResult.audits, url),\n      fieldData: loadingExperience,\n      rawResponse: data,\n    };\n  }\n}\n\n/**\n * Creates a configured PageSpeed client instance\n * @param apiKey - Optional API key\n * @returns Configured PageSpeedClient instance\n */\nexport function createPageSpeedClient(apiKey?: string): PageSpeedClient {\n  return new PageSpeedClient(apiKey);\n}\n\n/**\n * Quick function to analyze a single URL\n * @param url - URL to analyze\n * @param options - Analysis options\n * @returns Performance result\n */\nexport async function analyzeUrl(\n  url: string,\n  options: Omit<PageSpeedOptions, \"url\"> = {},\n): Promise<PerformanceResult> {\n  const client = new PageSpeedClient(options.apiKey, options.timeout);\n  return client.analyze({ url, ...options });\n}\n","/**\n * @silverassist/performance-toolkit\n *\n * Lighthouse CI runner - wrapper for @lhci/cli with fluent API.\n *\n * @module lighthouse\n * @author Miguel Colmenares <me@miguelcolmenares.com>\n * @license PolyForm-Noncommercial-1.0.0\n */\n\nimport type {\n  LHCIAssertions,\n  LHCIConfig,\n  LHCIOptions,\n  PerformanceThresholds,\n} from \"../types\";\n\n/**\n * Lighthouse CI Runner for programmatic execution\n */\nexport class LighthouseRunner {\n  private config: LHCIConfig;\n\n  /**\n   * Creates a new Lighthouse runner\n   * @param options - Runner options\n   */\n  constructor(options: LHCIOptions) {\n    this.config = this.buildConfig(options);\n  }\n\n  /**\n   * Builds LHCI configuration from options\n   */\n  private buildConfig(options: LHCIOptions): LHCIConfig {\n    const {\n      urls,\n      method = \"node\",\n      numberOfRuns = 3,\n      psiApiKey,\n      psiStrategy = \"mobile\",\n      chromeFlags = [\"--headless\", \"--no-sandbox\"],\n      outputDir,\n    } = options;\n\n    const config: LHCIConfig = {\n      ci: {\n        collect: {\n          url: urls,\n          method,\n          numberOfRuns,\n          ...(method === \"psi\" && psiApiKey ? { psiApiKey, psiStrategy } : {}),\n          settings: {\n            chromeFlags: method === \"node\" ? chromeFlags : undefined,\n            preset: psiStrategy === \"desktop\" ? \"desktop\" : \"mobile\",\n          },\n        },\n      },\n    };\n\n    if (outputDir) {\n      config.ci.upload = {\n        target: \"filesystem\",\n        outputDir,\n      };\n    }\n\n    return config;\n  }\n\n  /**\n   * Gets the generated configuration\n   * @returns LHCI configuration object\n   */\n  getConfig(): LHCIConfig {\n    return this.config;\n  }\n\n  /**\n   * Adds assertion thresholds to the configuration\n   * @param thresholds - Performance thresholds to assert\n   * @returns This runner instance for chaining\n   */\n  withAssertions(thresholds: PerformanceThresholds): this {\n    const assertions: LHCIAssertions = {};\n\n    if (thresholds.performance !== undefined) {\n      assertions[\"categories:performance\"] = [\n        \"error\",\n        { minScore: thresholds.performance / 100 },\n      ];\n    }\n    if (thresholds.accessibility !== undefined) {\n      assertions[\"categories:accessibility\"] = [\n        \"error\",\n        { minScore: thresholds.accessibility / 100 },\n      ];\n    }\n    if (thresholds.bestPractices !== undefined) {\n      assertions[\"categories:best-practices\"] = [\n        \"error\",\n        { minScore: thresholds.bestPractices / 100 },\n      ];\n    }\n    if (thresholds.seo !== undefined) {\n      assertions[\"categories:seo\"] = [\n        \"error\",\n        { minScore: thresholds.seo / 100 },\n      ];\n    }\n    if (thresholds.lcp !== undefined) {\n      assertions[\"largest-contentful-paint\"] = [\n        \"error\",\n        { maxNumericValue: thresholds.lcp },\n      ];\n    }\n    if (thresholds.fcp !== undefined) {\n      assertions[\"first-contentful-paint\"] = [\n        \"error\",\n        { maxNumericValue: thresholds.fcp },\n      ];\n    }\n    if (thresholds.cls !== undefined) {\n      assertions[\"cumulative-layout-shift\"] = [\n        \"error\",\n        { maxNumericValue: thresholds.cls },\n      ];\n    }\n    if (thresholds.tbt !== undefined) {\n      assertions[\"total-blocking-time\"] = [\n        \"error\",\n        { maxNumericValue: thresholds.tbt },\n      ];\n    }\n\n    this.config.ci.assert = { assertions };\n    return this;\n  }\n\n  /**\n   * Configures upload to temporary public storage\n   * @returns This runner instance for chaining\n   */\n  withTemporaryStorage(): this {\n    this.config.ci.upload = {\n      target: \"temporary-public-storage\",\n    };\n    return this;\n  }\n\n  /**\n   * Configures upload to LHCI server\n   * @param serverBaseUrl - LHCI server URL\n   * @param token - Build token\n   * @returns This runner instance for chaining\n   */\n  withLHCIServer(serverBaseUrl: string, token: string): this {\n    this.config.ci.upload = {\n      target: \"lhci\",\n      serverBaseUrl,\n      token,\n    };\n    return this;\n  }\n\n  /**\n   * Runs Lighthouse CI with the configured options\n   * @returns Promise resolving to exit code (0 for success)\n   */\n  async run(): Promise<number> {\n    // Dynamic import to avoid requiring @lhci/cli at module load time\n    try {\n      const { autorun } = await import(\"@lhci/cli\");\n\n      // Run with the ci config\n      const result = await autorun(this.config.ci);\n      return result.success ? 0 : 1;\n    } catch (error) {\n      if ((error as NodeJS.ErrnoException).code === \"MODULE_NOT_FOUND\") {\n        throw new Error(\n          \"Lighthouse CI (@lhci/cli) is not installed. \" +\n            \"Install it with: npm install -D @lhci/cli\",\n        );\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Generates a lighthouserc.js configuration file content\n   * @returns Configuration file content as string\n   */\n  generateConfigFile(): string {\n    const configContent = `/** @type {import('@lhci/cli').LighthouseConfig} */\nmodule.exports = ${JSON.stringify(this.config, null, 2)};\n`;\n    return configContent;\n  }\n}\n\n/**\n * Creates a Lighthouse runner for staging/internal URLs (uses local Chrome)\n * @param urls - URLs to analyze\n * @param options - Additional options\n * @returns Configured LighthouseRunner\n */\nexport function createNodeRunner(\n  urls: string[],\n  options: Partial<Omit<LHCIOptions, \"urls\" | \"method\">> = {},\n): LighthouseRunner {\n  return new LighthouseRunner({\n    urls,\n    method: \"node\",\n    ...options,\n  });\n}\n\n/**\n * Creates a Lighthouse runner for production URLs (uses PageSpeed API)\n * @param urls - URLs to analyze\n * @param psiApiKey - PageSpeed Insights API key\n * @param options - Additional options\n * @returns Configured LighthouseRunner\n */\nexport function createPSIRunner(\n  urls: string[],\n  psiApiKey: string,\n  options: Partial<Omit<LHCIOptions, \"urls\" | \"method\" | \"psiApiKey\">> = {},\n): LighthouseRunner {\n  return new LighthouseRunner({\n    urls,\n    method: \"psi\",\n    psiApiKey,\n    ...options,\n  });\n}\n\n/**\n * Creates a hybrid runner that uses node for staging and PSI for production\n * @param config - Configuration with staging and production URLs\n * @returns Object with staging and production runners\n */\nexport function createHybridRunners(config: {\n  stagingUrls: string[];\n  productionUrls: string[];\n  psiApiKey: string;\n  thresholds?: PerformanceThresholds;\n}): {\n  staging: LighthouseRunner;\n  production: LighthouseRunner;\n} {\n  const { stagingUrls, productionUrls, psiApiKey, thresholds } = config;\n\n  const staging = createNodeRunner(stagingUrls);\n  const production = createPSIRunner(productionUrls, psiApiKey);\n\n  if (thresholds) {\n    staging.withAssertions(thresholds);\n    production.withAssertions(thresholds);\n  }\n\n  return { staging, production };\n}\n\n/**\n * Generates default performance thresholds based on Core Web Vitals\n * @param strict - Whether to use stricter thresholds\n * @returns Performance thresholds object\n */\nexport function getDefaultThresholds(strict = false): PerformanceThresholds {\n  if (strict) {\n    return {\n      performance: 90,\n      accessibility: 90,\n      bestPractices: 90,\n      seo: 90,\n      lcp: 2500, // Good: < 2.5s\n      fcp: 1800,\n      cls: 0.1,\n      tbt: 200,\n    };\n  }\n\n  return {\n    performance: 50,\n    accessibility: 80,\n    bestPractices: 80,\n    seo: 80,\n    lcp: 4000, // Needs improvement: < 4s\n    fcp: 3000,\n    cls: 0.25,\n    tbt: 600,\n  };\n}\n","/**\n * @silverassist/performance-toolkit\n *\n * Project context detector for analyzing technology stack and patterns.\n *\n * @module context\n * @author Miguel Colmenares <me@miguelcolmenares.com>\n * @license PolyForm-Noncommercial-1.0.0\n */\n\nimport type { FrameworkInfo, ProjectContext } from \"../types\";\n\n/**\n * Project context detector for analyzing user's technology stack\n */\nexport class ProjectContextDetector {\n  private packageJson: PackageJson | null = null;\n  private projectRoot: string;\n\n  constructor(projectRoot: string = process.cwd()) {\n    this.projectRoot = projectRoot;\n  }\n\n  /**\n   * Detects the complete project context\n   */\n  async detect(): Promise<ProjectContext> {\n    await this.loadPackageJson();\n\n    const framework = this.detectFramework();\n    const packageManager = this.detectPackageManager();\n    const buildTool = this.detectBuildTool();\n    const cssSolution = this.detectCSSSolution();\n    const isTypeScript = this.detectTypeScript();\n    const imageOptimization = this.detectImageOptimization();\n    const analytics = this.detectAnalytics();\n    const thirdPartyIntegrations = this.detectThirdPartyIntegrations();\n    const uiLibrary = this.detectUILibrary();\n\n    const allDeps = this.getAllDependencies();\n\n    return {\n      name: this.packageJson?.name,\n      framework,\n      packageManager,\n      buildTool,\n      uiLibrary,\n      cssSolution,\n      isTypeScript,\n      imageOptimization,\n      analytics,\n      thirdPartyIntegrations,\n      dependencies: {\n        production: Object.keys(this.packageJson?.dependencies || {}),\n        development: Object.keys(this.packageJson?.devDependencies || {}),\n        total: allDeps.length,\n      },\n    };\n  }\n\n  /**\n   * Loads and parses package.json\n   */\n  private async loadPackageJson(): Promise<void> {\n    try {\n      // Dynamic import for fs (works in both Node and edge environments)\n      const fs = await import(\"fs\");\n      const path = await import(\"path\");\n\n      const packagePath = path.join(this.projectRoot, \"package.json\");\n\n      if (fs.existsSync(packagePath)) {\n        const content = fs.readFileSync(packagePath, \"utf-8\");\n        this.packageJson = JSON.parse(content) as PackageJson;\n      }\n    } catch {\n      // Package.json not found or invalid - continue with null\n      this.packageJson = null;\n    }\n  }\n\n  /**\n   * Detects the main framework being used\n   */\n  private detectFramework(): FrameworkInfo | null {\n    if (!this.packageJson) return null;\n\n    // Next.js detection\n    if (this.hasDependency(\"next\")) {\n      return this.detectNextJS();\n    }\n\n    // Nuxt detection\n    if (this.hasDependency(\"nuxt\") || this.hasDependency(\"nuxt3\")) {\n      return this.detectNuxt();\n    }\n\n    // Remix detection\n    if (this.hasDependency(\"@remix-run/react\")) {\n      return this.detectRemix();\n    }\n\n    // Gatsby detection\n    if (this.hasDependency(\"gatsby\")) {\n      return this.detectGatsby();\n    }\n\n    // Astro detection\n    if (this.hasDependency(\"astro\")) {\n      return this.detectAstro();\n    }\n\n    // SvelteKit detection\n    if (this.hasDependency(\"@sveltejs/kit\")) {\n      return {\n        name: \"svelte\",\n        version: this.getDependencyVersion(\"@sveltejs/kit\") || \"unknown\",\n        routerType: \"file-based\",\n        renderingMode: \"hybrid\",\n      };\n    }\n\n    // Vue detection (standalone)\n    if (this.hasDependency(\"vue\")) {\n      return {\n        name: \"vue\",\n        version: this.getDependencyVersion(\"vue\") || \"unknown\",\n        routerType: this.hasDependency(\"vue-router\")\n          ? \"config-based\"\n          : undefined,\n        renderingMode: \"spa\",\n      };\n    }\n\n    // Angular detection\n    if (this.hasDependency(\"@angular/core\")) {\n      return {\n        name: \"angular\",\n        version: this.getDependencyVersion(\"@angular/core\") || \"unknown\",\n        routerType: \"config-based\",\n        renderingMode: this.hasDependency(\"@angular/platform-server\")\n          ? \"ssr\"\n          : \"spa\",\n      };\n    }\n\n    // React detection (standalone - after checking for meta-frameworks)\n    if (this.hasDependency(\"react\")) {\n      return {\n        name: \"react\",\n        version: this.getDependencyVersion(\"react\") || \"unknown\",\n        routerType: this.hasDependency(\"react-router-dom\")\n          ? \"config-based\"\n          : undefined,\n        renderingMode: \"spa\",\n      };\n    }\n\n    return null;\n  }\n\n  /**\n   * Detects Next.js specific configuration\n   */\n  private detectNextJS(): FrameworkInfo {\n    const version = this.getDependencyVersion(\"next\") || \"unknown\";\n    const majorVersion = this.parseMajorVersion(version);\n\n    // Detect features\n    const features: string[] = [];\n\n    if (\n      this.hasDependency(\"next-auth\") ||\n      this.hasDependency(\"@auth/nextjs-provider\")\n    ) {\n      features.push(\"auth\");\n    }\n    if (this.hasDependency(\"@next/font\") || this.hasDependency(\"next/font\")) {\n      features.push(\"font-optimization\");\n    }\n    if (this.hasDependency(\"next-intl\") || this.hasDependency(\"next-i18next\")) {\n      features.push(\"i18n\");\n    }\n    if (\n      this.hasDependency(\"next-mdx-remote\") ||\n      this.hasDependency(\"@next/mdx\")\n    ) {\n      features.push(\"mdx\");\n    }\n\n    // Next.js 16 features (detected from config would be ideal, but we mark by version)\n    if (majorVersion >= 16) {\n      features.push(\"cache-components\");\n      features.push(\"turbopack\");\n      features.push(\"react-compiler\");\n    }\n\n    // Determine router type (app router available since Next 13.4+)\n    // This is a heuristic - actual detection would require file system check\n    const routerType: \"app\" | \"pages\" = majorVersion >= 14 ? \"app\" : \"pages\";\n\n    // Determine rendering mode\n    let renderingMode: \"ssr\" | \"ssg\" | \"hybrid\" | \"isr\" = \"hybrid\";\n    if (majorVersion >= 13) {\n      renderingMode = \"hybrid\"; // App router supports all modes\n    }\n\n    return {\n      name: \"next\",\n      version,\n      routerType,\n      renderingMode,\n      features: features.length > 0 ? features : undefined,\n    };\n  }\n\n  /**\n   * Detects Nuxt specific configuration\n   */\n  private detectNuxt(): FrameworkInfo {\n    const version =\n      this.getDependencyVersion(\"nuxt\") ||\n      this.getDependencyVersion(\"nuxt3\") ||\n      \"unknown\";\n\n    return {\n      name: \"nuxt\",\n      version,\n      routerType: \"file-based\",\n      renderingMode: \"hybrid\",\n    };\n  }\n\n  /**\n   * Detects Remix specific configuration\n   */\n  private detectRemix(): FrameworkInfo {\n    return {\n      name: \"remix\",\n      version: this.getDependencyVersion(\"@remix-run/react\") || \"unknown\",\n      routerType: \"file-based\",\n      renderingMode: \"ssr\",\n    };\n  }\n\n  /**\n   * Detects Gatsby specific configuration\n   */\n  private detectGatsby(): FrameworkInfo {\n    const features: string[] = [];\n\n    if (this.hasDependency(\"gatsby-plugin-image\")) {\n      features.push(\"image-optimization\");\n    }\n    if (\n      this.hasDependency(\"gatsby-source-contentful\") ||\n      this.hasDependency(\"gatsby-source-sanity\")\n    ) {\n      features.push(\"headless-cms\");\n    }\n\n    return {\n      name: \"gatsby\",\n      version: this.getDependencyVersion(\"gatsby\") || \"unknown\",\n      routerType: \"file-based\",\n      renderingMode: \"ssg\",\n      features: features.length > 0 ? features : undefined,\n    };\n  }\n\n  /**\n   * Detects Astro specific configuration\n   */\n  private detectAstro(): FrameworkInfo {\n    const features: string[] = [];\n\n    if (this.hasDependency(\"@astrojs/react\")) features.push(\"react\");\n    if (this.hasDependency(\"@astrojs/vue\")) features.push(\"vue\");\n    if (this.hasDependency(\"@astrojs/svelte\")) features.push(\"svelte\");\n    if (this.hasDependency(\"@astrojs/image\"))\n      features.push(\"image-optimization\");\n\n    return {\n      name: \"astro\",\n      version: this.getDependencyVersion(\"astro\") || \"unknown\",\n      routerType: \"file-based\",\n      renderingMode: \"hybrid\",\n      features: features.length > 0 ? features : undefined,\n    };\n  }\n\n  /**\n   * Detects package manager from lock files\n   */\n  private detectPackageManager(): ProjectContext[\"packageManager\"] {\n    // This would ideally check for lock files\n    // For now, return a reasonable default\n    if (this.packageJson?.packageManager) {\n      const pm = this.packageJson.packageManager;\n      if (pm.startsWith(\"pnpm\")) return \"pnpm\";\n      if (pm.startsWith(\"yarn\")) return \"yarn\";\n      if (pm.startsWith(\"bun\")) return \"bun\";\n      if (pm.startsWith(\"npm\")) return \"npm\";\n    }\n    return \"npm\"; // Default assumption\n  }\n\n  /**\n   * Detects build tool\n   */\n  private detectBuildTool(): ProjectContext[\"buildTool\"] {\n    // Turbopack (Next.js 16+ default, 13-15 optional)\n    if (this.hasDependency(\"next\")) {\n      const version = this.getDependencyVersion(\"next\");\n      if (version) {\n        const majorVersion = this.parseMajorVersion(version);\n        // Next.js 16+ uses Turbopack by default\n        if (majorVersion >= 16) {\n          return \"turbopack\";\n        }\n      }\n    }\n\n    if (this.hasDependency(\"vite\")) return \"vite\";\n    if (this.hasDependency(\"esbuild\") && !this.hasDependency(\"vite\"))\n      return \"esbuild\";\n    if (this.hasDependency(\"rollup\") && !this.hasDependency(\"vite\"))\n      return \"rollup\";\n    if (this.hasDependency(\"webpack\")) return \"webpack\";\n\n    // Next.js < 16 uses webpack by default\n    if (this.hasDependency(\"next\")) return \"webpack\";\n\n    return null;\n  }\n\n  /**\n   * Detects CSS solution\n   */\n  private detectCSSSolution(): ProjectContext[\"cssSolution\"] {\n    if (this.hasDependency(\"tailwindcss\")) return \"tailwind\";\n    if (this.hasDependency(\"styled-components\")) return \"styled-components\";\n    if (\n      this.hasDependency(\"@emotion/react\") ||\n      this.hasDependency(\"@emotion/styled\")\n    )\n      return \"emotion\";\n    if (this.hasDependency(\"sass\") || this.hasDependency(\"node-sass\"))\n      return \"sass\";\n\n    // CSS Modules is built into most frameworks, hard to detect without file analysis\n    return null;\n  }\n\n  /**\n   * Detects if project uses TypeScript\n   */\n  private detectTypeScript(): boolean {\n    return (\n      this.hasDependency(\"typescript\") ||\n      this.hasDependency(\"@types/node\") ||\n      this.hasDependency(\"@types/react\")\n    );\n  }\n\n  /**\n   * Detects image optimization library\n   */\n  private detectImageOptimization(): ProjectContext[\"imageOptimization\"] {\n    if (this.hasDependency(\"next\")) return \"next/image\";\n    if (this.hasDependency(\"sharp\")) return \"sharp\";\n    if (this.hasDependency(\"imagemin\")) return \"imagemin\";\n    if (this.hasDependency(\"cloudinary\")) return \"cloudinary\";\n    return null;\n  }\n\n  /**\n   * Detects analytics libraries\n   */\n  private detectAnalytics(): string[] {\n    const analytics: string[] = [];\n\n    if (this.hasDependency(\"@vercel/analytics\"))\n      analytics.push(\"Vercel Analytics\");\n    if (\n      this.hasDependency(\"@google-analytics/react-ga\") ||\n      this.hasDependency(\"react-ga\") ||\n      this.hasDependency(\"react-ga4\")\n    )\n      analytics.push(\"Google Analytics\");\n    if (\n      this.hasDependency(\"@segment/analytics-next\") ||\n      this.hasDependency(\"analytics-node\")\n    )\n      analytics.push(\"Segment\");\n    if (\n      this.hasDependency(\"mixpanel-browser\") ||\n      this.hasDependency(\"mixpanel\")\n    )\n      analytics.push(\"Mixpanel\");\n    if (this.hasDependency(\"amplitude-js\")) analytics.push(\"Amplitude\");\n    if (this.hasDependency(\"posthog-js\") || this.hasDependency(\"posthog-node\"))\n      analytics.push(\"PostHog\");\n    if (this.hasDependency(\"@datadog/browser-rum\"))\n      analytics.push(\"Datadog RUM\");\n    if (\n      this.hasDependency(\"@sentry/nextjs\") ||\n      this.hasDependency(\"@sentry/react\")\n    )\n      analytics.push(\"Sentry\");\n\n    return analytics;\n  }\n\n  /**\n   * Detects third-party integrations\n   */\n  private detectThirdPartyIntegrations(): string[] {\n    const integrations: string[] = [];\n\n    // Auth providers\n    if (this.hasDependency(\"next-auth\")) integrations.push(\"NextAuth\");\n    if (this.hasDependency(\"@auth0/nextjs-auth0\")) integrations.push(\"Auth0\");\n    if (this.hasDependency(\"@clerk/nextjs\")) integrations.push(\"Clerk\");\n    if (this.hasDependency(\"firebase\")) integrations.push(\"Firebase\");\n    if (this.hasDependency(\"@supabase/supabase-js\"))\n      integrations.push(\"Supabase\");\n\n    // CMS\n    if (this.hasDependency(\"@sanity/client\")) integrations.push(\"Sanity\");\n    if (this.hasDependency(\"contentful\")) integrations.push(\"Contentful\");\n    if (this.hasDependency(\"@prismic/client\")) integrations.push(\"Prismic\");\n    if (this.hasDependency(\"@strapi/strapi\")) integrations.push(\"Strapi\");\n\n    // E-commerce\n    if (this.hasDependency(\"@shopify/shopify-api\"))\n      integrations.push(\"Shopify\");\n    if (this.hasDependency(\"@stripe/stripe-js\")) integrations.push(\"Stripe\");\n\n    // Database/ORM\n    if (this.hasDependency(\"@prisma/client\")) integrations.push(\"Prisma\");\n    if (this.hasDependency(\"drizzle-orm\")) integrations.push(\"Drizzle ORM\");\n    if (this.hasDependency(\"mongoose\")) integrations.push(\"MongoDB/Mongoose\");\n\n    return integrations;\n  }\n\n  /**\n   * Detects UI library\n   */\n  private detectUILibrary(): string | undefined {\n    if (\n      this.hasDependency(\"@radix-ui/react-dialog\") ||\n      this.hasDependency(\"@radix-ui/react-slot\")\n    )\n      return \"Radix UI\";\n    if (this.hasDependency(\"@chakra-ui/react\")) return \"Chakra UI\";\n    if (this.hasDependency(\"@mantine/core\")) return \"Mantine\";\n    if (this.hasDependency(\"@mui/material\")) return \"Material UI\";\n    if (this.hasDependency(\"antd\")) return \"Ant Design\";\n    if (this.hasDependency(\"@headlessui/react\")) return \"Headless UI\";\n    if (this.hasDependency(\"react-bootstrap\")) return \"React Bootstrap\";\n    return undefined;\n  }\n\n  // =========================================================================\n  // Helper methods\n  // =========================================================================\n\n  /**\n   * Checks if a dependency exists\n   */\n  private hasDependency(name: string): boolean {\n    if (!this.packageJson) return false;\n    return !!(\n      this.packageJson.dependencies?.[name] ||\n      this.packageJson.devDependencies?.[name] ||\n      this.packageJson.peerDependencies?.[name]\n    );\n  }\n\n  /**\n   * Gets version of a dependency\n   */\n  private getDependencyVersion(name: string): string | undefined {\n    if (!this.packageJson) return undefined;\n    return (\n      this.packageJson.dependencies?.[name] ||\n      this.packageJson.devDependencies?.[name] ||\n      this.packageJson.peerDependencies?.[name]\n    );\n  }\n\n  /**\n   * Gets all dependencies as array\n   */\n  private getAllDependencies(): string[] {\n    if (!this.packageJson) return [];\n    return [\n      ...Object.keys(this.packageJson.dependencies || {}),\n      ...Object.keys(this.packageJson.devDependencies || {}),\n    ];\n  }\n\n  /**\n   * Parses major version from semver string\n   */\n  private parseMajorVersion(version: string): number {\n    const clean = version.replace(/^[\\^~]/, \"\");\n    const major = clean.split(\".\")[0];\n    return parseInt(major, 10) || 0;\n  }\n}\n\n/**\n * Package.json structure (simplified)\n */\ninterface PackageJson {\n  name?: string;\n  version?: string;\n  packageManager?: string;\n  dependencies?: Record<string, string>;\n  devDependencies?: Record<string, string>;\n  peerDependencies?: Record<string, string>;\n  scripts?: Record<string, string>;\n}\n\n/**\n * Creates a project context detector instance\n * @param projectRoot - Root directory of the project\n * @returns ProjectContextDetector instance\n */\nexport function createContextDetector(\n  projectRoot?: string,\n): ProjectContextDetector {\n  return new ProjectContextDetector(projectRoot);\n}\n\n/**\n * Quick function to detect project context\n * @param projectRoot - Root directory of the project\n * @returns Detected project context\n */\nexport async function detectProjectContext(\n  projectRoot?: string,\n): Promise<ProjectContext> {\n  const detector = new ProjectContextDetector(projectRoot);\n  return detector.detect();\n}\n","/**\n * @silverassist/performance-toolkit\n *\n * Report utility functions for formatting and severity calculations.\n *\n * @module report/utils\n * @author Miguel Colmenares <me@miguelcolmenares.com>\n * @license PolyForm-Noncommercial-1.0.0\n */\n\nimport type { DiagnosticItem } from \"../types\";\n\n/**\n * Formats bytes into human-readable string\n */\nexport function formatBytes(bytes: number): string {\n  if (bytes < 1024) return `${bytes} B`;\n  if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(0)} KiB`;\n  return `${(bytes / (1024 * 1024)).toFixed(1)} MiB`;\n}\n\n/**\n * Truncates URL to specified length with ellipsis\n */\nexport function truncateUrl(url: string, maxLength: number = 50): string {\n  if (url.length <= maxLength) return url;\n  return url.substring(0, maxLength - 3) + \"...\";\n}\n\n/**\n * Calculates a normalized score between 0-1 based on thresholds\n */\nexport function calculateScore(\n  value: number,\n  goodThreshold: number,\n  poorThreshold: number,\n): number {\n  if (value <= goodThreshold) return 1;\n  if (value >= poorThreshold) return 0;\n  return 1 - (value - goodThreshold) / (poorThreshold - goodThreshold);\n}\n\n/**\n * Determines severity level based on byte size\n */\nexport function getSeverityByBytes(\n  bytes: number,\n  moderate: number = 100000,\n  serious: number = 300000,\n  critical: number = 500000,\n): DiagnosticItem[\"severity\"] {\n  if (bytes >= critical) return \"critical\";\n  if (bytes >= serious) return \"serious\";\n  if (bytes >= moderate) return \"moderate\";\n  return \"minor\";\n}\n\n/**\n * Determines severity level based on time in milliseconds\n */\nexport function getSeverityByTime(\n  ms: number,\n  moderate: number = 300,\n  serious: number = 800,\n  critical: number = 1500,\n): DiagnosticItem[\"severity\"] {\n  if (ms >= critical) return \"critical\";\n  if (ms >= serious) return \"serious\";\n  if (ms >= moderate) return \"moderate\";\n  return \"minor\";\n}\n","/**\n * @silverassist/performance-toolkit\n *\n * Diagnostics table generation similar to PageSpeed Insights.\n *\n * @module report/diagnostics\n * @author Miguel Colmenares <me@miguelcolmenares.com>\n * @license PolyForm-Noncommercial-1.0.0\n */\n\nimport type { DiagnosticItem, PerformanceResult } from \"../types\";\nimport {\n  formatBytes,\n  truncateUrl,\n  calculateScore,\n  getSeverityByBytes,\n  getSeverityByTime,\n} from \"./utils\";\n\n/**\n * Generates enhanced diagnostics table from performance insights\n */\nexport function generateDiagnosticsTable(\n  result: PerformanceResult,\n): DiagnosticItem[] {\n  const items: DiagnosticItem[] = [];\n  const { insights } = result;\n\n  // Unused JavaScript\n  if (insights?.unusedJavaScript?.length) {\n    const totalWasted = insights.unusedJavaScript.reduce(\n      (sum, js) => sum + js.wastedBytes,\n      0,\n    );\n    items.push({\n      id: \"unused-javascript\",\n      title: \"Reduce unused JavaScript\",\n      displayValue: `Est savings of ${formatBytes(totalWasted)}`,\n      description:\n        \"Remove unused JavaScript to reduce bytes consumed by network activity and improve page load performance.\",\n      score: calculateScore(totalWasted, 150000, 500000),\n      severity: getSeverityByBytes(totalWasted),\n      savings: { bytes: totalWasted },\n      items: insights.unusedJavaScript.slice(0, 10).map((js) => ({\n        url: js.url,\n        size: js.transferSize,\n        wastedBytes: js.wastedBytes,\n        metadata: {\n          isFirstParty: js.isFirstParty,\n          wastedPercent: js.wastedPercent,\n          entity: js.entity,\n        },\n      })),\n      category: \"javascript\",\n    });\n  }\n\n  // Unused CSS\n  if (insights?.unusedCSS?.length) {\n    const totalWasted = insights.unusedCSS.reduce(\n      (sum, css) => sum + css.wastedBytes,\n      0,\n    );\n    items.push({\n      id: \"unused-css\",\n      title: \"Reduce unused CSS\",\n      displayValue: `Est savings of ${formatBytes(totalWasted)}`,\n      description:\n        \"Remove unused CSS rules to reduce bytes consumed by network activity.\",\n      score: calculateScore(totalWasted, 50000, 200000),\n      severity: getSeverityByBytes(totalWasted, 50000, 100000, 200000),\n      savings: { bytes: totalWasted },\n      items: insights.unusedCSS.slice(0, 10).map((css) => ({\n        url: css.url,\n        size: css.transferSize,\n        wastedBytes: css.wastedBytes,\n        metadata: { wastedPercent: css.wastedPercent },\n      })),\n      category: \"resource\",\n    });\n  }\n\n  // Long Tasks\n  if (insights?.longTasks?.length) {\n    const count = insights.longTasks.length;\n    const totalDuration = insights.longTasks.reduce(\n      (sum, task) => sum + task.duration,\n      0,\n    );\n    items.push({\n      id: \"long-tasks\",\n      title: \"Avoid long main-thread tasks\",\n      displayValue: `${count} long task${count > 1 ? \"s\" : \"\"} found`,\n      description: `Long tasks block the main thread for ${Math.round(totalDuration)}ms total, causing the page to feel unresponsive.`,\n      score: calculateScore(count, 2, 5),\n      severity:\n        count > 5\n          ? \"critical\"\n          : count > 3\n            ? \"serious\"\n            : count > 1\n              ? \"moderate\"\n              : \"minor\",\n      savings: { timeMs: totalDuration },\n      items: insights.longTasks.map((task) => ({\n        label: task.url ? truncateUrl(task.url) : \"Unknown source\",\n        timeMs: task.duration,\n        metadata: { startTime: task.startTime, attribution: task.attribution },\n      })),\n      category: \"javascript\",\n    });\n  }\n\n  // Render-Blocking Resources\n  if (insights?.renderBlocking?.length) {\n    const totalWastedMs = insights.renderBlocking.reduce(\n      (sum, rb) => sum + rb.wastedMs,\n      0,\n    );\n    items.push({\n      id: \"render-blocking\",\n      title: \"Eliminate render-blocking resources\",\n      displayValue: `Est savings of ${Math.round(totalWastedMs)}ms`,\n      description:\n        \"Resources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring non-critical resources.\",\n      score: calculateScore(totalWastedMs, 500, 1500),\n      severity: getSeverityByTime(totalWastedMs),\n      savings: { timeMs: totalWastedMs },\n      items: insights.renderBlocking.map((rb) => ({\n        url: rb.url,\n        size: rb.transferSize,\n        timeMs: rb.wastedMs,\n        metadata: { resourceType: rb.resourceType },\n      })),\n      category: \"rendering\",\n    });\n  }\n\n  // Third-Party Impact\n  if (insights?.thirdParties?.length) {\n    const totalBlocking = insights.thirdParties.reduce(\n      (sum, tp) => sum + tp.blockingTime,\n      0,\n    );\n    const totalSize = insights.thirdParties.reduce(\n      (sum, tp) => sum + tp.transferSize,\n      0,\n    );\n    items.push({\n      id: \"third-party-summary\",\n      title: \"Reduce impact of third-party code\",\n      displayValue: `${Math.round(totalBlocking)}ms blocking time`,\n      description: `Third-party code blocked the main thread for ${Math.round(totalBlocking)}ms and transferred ${formatBytes(totalSize)}.`,\n      score: calculateScore(totalBlocking, 250, 1000),\n      severity:\n        totalBlocking > 1000\n          ? \"critical\"\n          : totalBlocking > 500\n            ? \"serious\"\n            : \"moderate\",\n      savings: { timeMs: totalBlocking, bytes: totalSize },\n      items: insights.thirdParties.slice(0, 10).map((tp) => ({\n        label: tp.entity,\n        timeMs: tp.blockingTime,\n        size: tp.transferSize,\n        metadata: { category: tp.category, requestCount: tp.requestCount },\n      })),\n      category: \"network\",\n    });\n  }\n\n  // Cache Issues\n  if (insights?.cacheIssues?.length) {\n    const totalWasted = insights.cacheIssues.reduce(\n      (sum, c) => sum + c.wastedBytes,\n      0,\n    );\n    items.push({\n      id: \"cache-policy\",\n      title: \"Serve static assets with efficient cache policy\",\n      displayValue: `${insights.cacheIssues.length} resources found`,\n      description: `${insights.cacheIssues.length} static resources have short cache lifetimes. A longer cache lifetime can speed up repeat visits.`,\n      score: calculateScore(totalWasted, 100000, 500000),\n      severity: totalWasted > 500000 ? \"serious\" : \"moderate\",\n      savings: { bytes: totalWasted },\n      items: insights.cacheIssues.slice(0, 10).map((c) => ({\n        url: c.url,\n        size: c.transferSize,\n        wastedBytes: c.wastedBytes,\n        metadata: { cacheTTL: c.cacheTTLDisplay, entity: c.entity },\n      })),\n      category: \"network\",\n    });\n  }\n\n  // Image Issues\n  if (insights?.imageIssues?.length) {\n    const totalWasted = insights.imageIssues.reduce(\n      (sum, img) => sum + img.wastedBytes,\n      0,\n    );\n    const issueTypes = [\n      ...new Set(insights.imageIssues.map((i) => i.issueType)),\n    ];\n    items.push({\n      id: \"image-optimization\",\n      title: \"Properly size and optimize images\",\n      displayValue: `Est savings of ${formatBytes(totalWasted)}`,\n      description: `Images have optimization opportunities: ${issueTypes.join(\", \")}. Properly sizing and formatting images can significantly reduce load time.`,\n      score: calculateScore(totalWasted, 100000, 500000),\n      severity: getSeverityByBytes(totalWasted),\n      savings: { bytes: totalWasted },\n      items: insights.imageIssues.slice(0, 10).map((img) => ({\n        url: img.url,\n        size: img.totalBytes,\n        wastedBytes: img.wastedBytes,\n        metadata: {\n          issueType: img.issueType,\n          recommendation: img.recommendation,\n          snippet: img.snippet,\n        },\n      })),\n      category: \"resource\",\n    });\n  }\n\n  // Legacy JavaScript\n  if (insights?.legacyJavaScript?.length) {\n    const totalWasted = insights.legacyJavaScript.reduce(\n      (sum, l) => sum + l.wastedBytes,\n      0,\n    );\n    items.push({\n      id: \"legacy-javascript\",\n      title: \"Avoid serving legacy JavaScript to modern browsers\",\n      displayValue: `Est savings of ${formatBytes(totalWasted)}`,\n      description:\n        \"Polyfills and transforms are shipped to modern browsers. Remove unnecessary polyfills by updating browser targets.\",\n      score: calculateScore(totalWasted, 30000, 100000),\n      severity: getSeverityByBytes(totalWasted, 30000, 60000, 100000),\n      savings: { bytes: totalWasted },\n      items: insights.legacyJavaScript.map((l) => ({\n        url: l.url,\n        wastedBytes: l.wastedBytes,\n        metadata: { polyfills: l.polyfills },\n      })),\n      category: \"javascript\",\n    });\n  }\n\n  // Sort by severity (critical first)\n  const severityOrder = { critical: 0, serious: 1, moderate: 2, minor: 3 };\n  return items.sort(\n    (a, b) => severityOrder[a.severity] - severityOrder[b.severity],\n  );\n}\n","/**\n * @silverassist/performance-toolkit\n *\n * LCP analysis and framework-specific recommendations.\n *\n * @module report/lcp\n * @author Miguel Colmenares <me@miguelcolmenares.com>\n * @license PolyForm-Noncommercial-1.0.0\n */\n\nimport type {\n  EnhancedLCPElement,\n  LCPBreakdown,\n  LCPRecommendation,\n  PerformanceResult,\n  ProjectContext,\n} from \"../types\";\n\n/**\n * Detects LCP element type from element info\n */\nexport function detectLCPType(\n  lcpElement: PerformanceResult[\"lcpElement\"],\n): EnhancedLCPElement[\"type\"] {\n  if (!lcpElement) return \"unknown\";\n\n  const tag = lcpElement.tagName.toLowerCase();\n  if (tag === \"img\") return \"image\";\n  if (tag === \"video\") return \"video\";\n  if (tag === \"svg\") return \"image\";\n  if (lcpElement.url?.match(/\\.(jpg|jpeg|png|gif|webp|avif|svg)/i))\n    return \"background-image\";\n  if ([\"h1\", \"h2\", \"h3\", \"p\", \"span\", \"div\"].includes(tag)) return \"text\";\n\n  return \"unknown\";\n}\n\n/**\n * Detects loading mechanism from element snippet\n */\nexport function detectLoadingMechanism(\n  lcpElement: PerformanceResult[\"lcpElement\"],\n): EnhancedLCPElement[\"loadingMechanism\"] {\n  if (!lcpElement?.snippet) return \"unknown\";\n\n  const snippet = lcpElement.snippet.toLowerCase();\n  if (snippet.includes('loading=\"lazy\"')) return \"lazy\";\n  if (snippet.includes(\"fetchpriority\") || snippet.includes(\"priority\"))\n    return \"priority\";\n  if (snippet.includes(\"defer\")) return \"deferred\";\n\n  return \"eager\";\n}\n\n/**\n * Generates LCP-specific recommendations based on type and breakdown\n */\nexport function generateLCPRecommendations(\n  type: EnhancedLCPElement[\"type\"],\n  breakdown: LCPBreakdown | undefined,\n  lcpValue: number | undefined,\n  context: ProjectContext | null,\n): LCPRecommendation[] {\n  const recommendations: LCPRecommendation[] = [];\n\n  // Type-specific recommendations\n  if (type === \"image\") {\n    recommendations.push({\n      id: \"lcp-priority-hint\",\n      title: \"Add priority hint to LCP image\",\n      description:\n        'Use fetchpriority=\"high\" on the LCP image to prioritize its loading.',\n      impact: \"high\",\n      effort: \"easy\",\n      codeHints: ['<img src=\"...\" fetchpriority=\"high\" />'],\n    });\n\n    if (context?.framework?.name === \"next\") {\n      recommendations.push({\n        id: \"lcp-next-image-priority\",\n        title: \"Use Next.js Image with priority\",\n        description:\n          \"Use next/image component with priority prop for the LCP image.\",\n        impact: \"high\",\n        effort: \"easy\",\n        codeHints: ['<Image src=\"...\" priority />'],\n      });\n    }\n  }\n\n  // Breakdown-based recommendations\n  if (breakdown) {\n    if (breakdown.ttfb > 800) {\n      recommendations.push({\n        id: \"lcp-reduce-ttfb\",\n        title: \"Reduce server response time (TTFB)\",\n        description: `TTFB is ${breakdown.ttfb}ms. Consider using a CDN, optimizing server logic, or implementing edge caching.`,\n        impact: \"high\",\n        effort: \"moderate\",\n      });\n    }\n\n    if (breakdown.resourceLoadDelay > 500) {\n      recommendations.push({\n        id: \"lcp-preload\",\n        title: \"Preload the LCP resource\",\n        description: `The LCP resource has ${breakdown.resourceLoadDelay}ms load delay. Use <link rel=\"preload\"> to start loading earlier.`,\n        impact: \"medium\",\n        effort: \"easy\",\n        codeHints: ['<link rel=\"preload\" href=\"...\" as=\"image\" />'],\n      });\n    }\n\n    if (breakdown.elementRenderDelay > 300) {\n      recommendations.push({\n        id: \"lcp-reduce-render-delay\",\n        title: \"Reduce render-blocking resources\",\n        description: `Element render is delayed by ${breakdown.elementRenderDelay}ms. Remove or defer render-blocking CSS/JS.`,\n        impact: \"medium\",\n        effort: \"moderate\",\n      });\n    }\n  }\n\n  // General LCP recommendations\n  if (lcpValue && lcpValue > 2500) {\n    recommendations.push({\n      id: \"lcp-critical-css\",\n      title: \"Inline critical CSS\",\n      description:\n        \"Extract and inline the CSS needed for above-the-fold content to avoid render blocking.\",\n      impact: lcpValue > 4000 ? \"high\" : \"medium\",\n      effort: \"moderate\",\n    });\n  }\n\n  return recommendations;\n}\n\n/**\n * Generates enhanced LCP element information with recommendations\n */\nexport function generateEnhancedLCP(\n  result: PerformanceResult,\n  context: ProjectContext | null,\n): EnhancedLCPElement | undefined {\n  const { lcpElement, insights, metrics } = result;\n  if (!lcpElement) return undefined;\n\n  const type = detectLCPType(lcpElement);\n  const recommendations = generateLCPRecommendations(\n    type,\n    insights?.lcpBreakdown,\n    metrics.lcp.value,\n    context,\n  );\n\n  return {\n    ...lcpElement,\n    type,\n    loadingMechanism: detectLoadingMechanism(lcpElement),\n    isAboveTheFold: true, // LCP is by definition above-the-fold\n    recommendations,\n    timing: insights?.lcpBreakdown\n      ? {\n          requestStart: insights.lcpBreakdown.ttfb,\n          loadEnd:\n            insights.lcpBreakdown.ttfb +\n            insights.lcpBreakdown.resourceLoadDelay +\n            insights.lcpBreakdown.resourceLoadDuration,\n          renderTime: insights.lcpBreakdown.elementRenderDelay,\n        }\n      : undefined,\n  };\n}\n","/**\n * @silverassist/performance-toolkit\n *\n * Key opportunities generation with framework-specific guidance.\n *\n * @module report/opportunities\n * @author Miguel Colmenares <me@miguelcolmenares.com>\n * @license PolyForm-Noncommercial-1.0.0\n */\n\nimport type {\n  ActionStep,\n  FrameworkSpecificNote,\n  KeyOpportunity,\n  PerformanceResult,\n  ProjectContext,\n} from \"../types\";\nimport { formatBytes } from \"./utils\";\nimport { detectLCPType } from \"./lcp\";\n\n/**\n * Generates ranked key opportunities with framework-specific guidance\n */\nexport function generateKeyOpportunities(\n  result: PerformanceResult,\n  context: ProjectContext | null,\n): KeyOpportunity[] {\n  const opportunities: KeyOpportunity[] = [];\n  const { insights, metrics } = result;\n\n  // Opportunity 1: LCP Optimization\n  if (metrics.lcp.rating !== \"good\") {\n    opportunities.push(createLCPOpportunity(result, context));\n  }\n\n  // Opportunity 2: JavaScript Optimization\n  const jsWaste =\n    insights?.unusedJavaScript?.reduce((sum, js) => sum + js.wastedBytes, 0) ??\n    0;\n  if (jsWaste > 100000) {\n    opportunities.push(createJavaScriptOpportunity(result, context, jsWaste));\n  }\n\n  // Opportunity 3: Image Optimization\n  const imgWaste =\n    insights?.imageIssues?.reduce((sum, img) => sum + img.wastedBytes, 0) ?? 0;\n  if (imgWaste > 50000) {\n    opportunities.push(createImageOpportunity(result, context, imgWaste));\n  }\n\n  // Opportunity 4: Third-Party Script Management\n  const tpBlocking =\n    insights?.thirdParties?.reduce((sum, tp) => sum + tp.blockingTime, 0) ?? 0;\n  if (tpBlocking > 250) {\n    opportunities.push(\n      createThirdPartyOpportunity(result, context, tpBlocking),\n    );\n  }\n\n  // Opportunity 5: Render-Blocking Resources\n  const rbWaste =\n    insights?.renderBlocking?.reduce((sum, rb) => sum + rb.wastedMs, 0) ?? 0;\n  if (rbWaste > 200) {\n    opportunities.push(createRenderBlockingOpportunity(rbWaste));\n  }\n\n  // Opportunity 6: CLS Improvement\n  if (metrics.cls.rating !== \"good\") {\n    opportunities.push(createCLSOpportunity(result));\n  }\n\n  // Sort by priority and return\n  return opportunities.sort((a, b) => a.priority - b.priority);\n}\n\n/**\n * Creates LCP optimization opportunity\n */\nexport function createLCPOpportunity(\n  result: PerformanceResult,\n  context: ProjectContext | null,\n): KeyOpportunity {\n  const { metrics, lcpElement, insights } = result;\n  const lcpType = lcpElement ? detectLCPType(lcpElement) : \"unknown\";\n\n  const steps: ActionStep[] = [];\n  const frameworkNotes: FrameworkSpecificNote[] = [];\n\n  // Step 1: Identify LCP element\n  steps.push({\n    order: 1,\n    title: \"Identify and understand your LCP element\",\n    instructions: `Your LCP element is a ${lcpType}${lcpElement?.tagName ? ` (${lcpElement.tagName})` : \"\"}. The current LCP time is ${metrics.lcp.displayValue}.`,\n  });\n\n  // Step 2: Add priority hint\n  if (lcpType === \"image\") {\n    steps.push({\n      order: 2,\n      title: \"Add priority hint to LCP image\",\n      instructions:\n        'Add fetchpriority=\"high\" to ensure the browser prioritizes loading this image.',\n      codeExample: {\n        language: \"html\",\n        code: `<img src=\"${lcpElement?.url || \"hero-image.jpg\"}\" fetchpriority=\"high\" alt=\"...\" />`,\n      },\n    });\n\n    // Next.js specific\n    if (context?.framework?.name === \"next\") {\n      frameworkNotes.push({\n        framework: \"Next.js\",\n        note: \"Use the Image component with priority prop instead of native img tag.\",\n        codeExample: `import Image from 'next/image';\\n\\n<Image\\n  src=\"${lcpElement?.url || \"/hero.jpg\"}\"\\n  priority\\n  alt=\"...\"\\n  width={1200}\\n  height={600}\\n/>`,\n        docLink:\n          \"https://nextjs.org/docs/app/api-reference/components/image#priority\",\n      });\n    }\n  }\n\n  // Step 3: Preload if needed\n  if (\n    insights?.lcpBreakdown?.resourceLoadDelay &&\n    insights.lcpBreakdown.resourceLoadDelay > 300\n  ) {\n    steps.push({\n      order: 3,\n      title: \"Preload the LCP resource\",\n      instructions:\n        \"Add a preload link in the document head to start fetching the resource earlier.\",\n      codeExample: {\n        language: \"html\",\n        code: `<link rel=\"preload\" href=\"${lcpElement?.url || \"/hero.jpg\"}\" as=\"${lcpType === \"image\" ? \"image\" : \"fetch\"}\" />`,\n        filePath: \"app/layout.tsx or pages/_document.tsx\",\n      },\n    });\n  }\n\n  // Step 4: TTFB optimization\n  if (insights?.lcpBreakdown?.ttfb && insights.lcpBreakdown.ttfb > 600) {\n    steps.push({\n      order: 4,\n      title: \"Improve server response time\",\n      instructions: `Your TTFB is ${insights.lcpBreakdown.ttfb}ms. Consider implementing caching, using a CDN, or optimizing your server.`,\n      estimatedTime: \"2-4 hours\",\n    });\n  }\n\n  return {\n    id: \"optimize-lcp\",\n    priority: 1,\n    title: \"Optimize Largest Contentful Paint (LCP)\",\n    description: `Your LCP is ${metrics.lcp.displayValue}, rated as \"${metrics.lcp.rating}\". The target is under 2.5 seconds.`,\n    impact: {\n      level: metrics.lcp.value > 4000 ? \"critical\" : \"high\",\n      lcpImprovementMs: Math.max(0, metrics.lcp.value - 2500),\n      scoreImprovement: metrics.lcp.rating === \"poor\" ? 15 : 8,\n    },\n    steps,\n    relatedAudits: [\n      \"largest-contentful-paint\",\n      \"largest-contentful-paint-element\",\n    ],\n    frameworkNotes: frameworkNotes.length > 0 ? frameworkNotes : undefined,\n    resources: [\n      { title: \"Optimize LCP\", url: \"https://web.dev/optimize-lcp/\" },\n      { title: \"LCP Guide\", url: \"https://web.dev/lcp/\" },\n    ],\n  };\n}\n\n/**\n * Creates JavaScript optimization opportunity\n */\nexport function createJavaScriptOpportunity(\n  result: PerformanceResult,\n  context: ProjectContext | null,\n  wastedBytes: number,\n): KeyOpportunity {\n  const steps: ActionStep[] = [];\n  const frameworkNotes: FrameworkSpecificNote[] = [];\n  const firstPartyWaste =\n    result.insights?.unusedJavaScript\n      ?.filter((js) => js.isFirstParty)\n      .reduce((sum, js) => sum + js.wastedBytes, 0) ?? 0;\n\n  steps.push({\n    order: 1,\n    title: \"Audit JavaScript bundles\",\n    instructions:\n      \"Use webpack-bundle-analyzer or source-map-explorer to identify large modules.\",\n    codeExample: {\n      language: \"bash\",\n      code: \"npx source-map-explorer dist/**/*.js\",\n    },\n  });\n\n  if (firstPartyWaste > 50000) {\n    steps.push({\n      order: 2,\n      title: \"Implement code splitting\",\n      instructions:\n        \"Split your JavaScript into smaller chunks that can be loaded on demand.\",\n    });\n\n    if (context?.framework?.name === \"next\") {\n      frameworkNotes.push({\n        framework: \"Next.js\",\n        note: \"Use dynamic imports for components that aren't needed immediately.\",\n        codeExample: `import dynamic from 'next/dynamic';\\n\\nconst HeavyComponent = dynamic(() => import('./HeavyComponent'), {\\n  loading: () => <p>Loading...</p>,\\n  ssr: false, // Optional: disable SSR for client-only components\\n});`,\n        docLink:\n          \"https://nextjs.org/docs/app/building-your-application/optimizing/lazy-loading\",\n      });\n    }\n  }\n\n  steps.push({\n    order: 3,\n    title: \"Review and remove unused dependencies\",\n    instructions:\n      \"Check your package.json for dependencies that are no longer used.\",\n    codeExample: {\n      language: \"bash\",\n      code: \"npx depcheck\",\n    },\n  });\n\n  return {\n    id: \"optimize-javascript\",\n    priority: 2,\n    title: \"Reduce JavaScript bundle size\",\n    description: `${formatBytes(wastedBytes)} of JavaScript is unused. Reducing bundle size improves load time and TBT.`,\n    impact: {\n      level:\n        wastedBytes > 500000\n          ? \"critical\"\n          : wastedBytes > 200000\n            ? \"high\"\n            : \"medium\",\n      sizeSavings: wastedBytes,\n      scoreImprovement: Math.min(15, Math.floor(wastedBytes / 50000)),\n    },\n    steps,\n    relatedAudits: [\n      \"unused-javascript\",\n      \"bootup-time\",\n      \"mainthread-work-breakdown\",\n    ],\n    frameworkNotes: frameworkNotes.length > 0 ? frameworkNotes : undefined,\n    resources: [\n      {\n        title: \"Reduce JavaScript Payloads\",\n        url: \"https://web.dev/reduce-javascript-payloads-with-code-splitting/\",\n      },\n    ],\n  };\n}\n\n/**\n * Creates image optimization opportunity\n */\nexport function createImageOpportunity(\n  result: PerformanceResult,\n  context: ProjectContext | null,\n  wastedBytes: number,\n): KeyOpportunity {\n  const issues = result.insights?.imageIssues ?? [];\n  const formatIssues = issues.filter((i) => i.issueType === \"format\");\n  const sizeIssues = issues.filter((i) => i.issueType === \"oversized\");\n  const offscreenIssues = issues.filter((i) => i.issueType === \"offscreen\");\n\n  const steps: ActionStep[] = [];\n  const frameworkNotes: FrameworkSpecificNote[] = [];\n\n  if (formatIssues.length > 0) {\n    steps.push({\n      order: 1,\n      title: \"Convert images to modern formats\",\n      instructions: `${formatIssues.length} images should be converted to WebP or AVIF format for better compression.`,\n    });\n  }\n\n  if (sizeIssues.length > 0) {\n    steps.push({\n      order: 2,\n      title: \"Serve properly sized images\",\n      instructions: `${sizeIssues.length} images are larger than their display size. Resize images to match their rendered dimensions.`,\n    });\n  }\n\n  if (offscreenIssues.length > 0) {\n    steps.push({\n      order: 3,\n      title: \"Lazy load offscreen images\",\n      instructions: `${offscreenIssues.length} images are below the fold and should be lazy loaded.`,\n      codeExample: {\n        language: \"html\",\n        code: '<img src=\"...\" loading=\"lazy\" alt=\"...\" />',\n      },\n    });\n  }\n\n  // Framework-specific notes\n  if (context?.framework?.name === \"next\") {\n    frameworkNotes.push({\n      framework: \"Next.js\",\n      note: \"Next.js Image component automatically handles format conversion, sizing, and lazy loading.\",\n      codeExample: `import Image from 'next/image';\\n\\n<Image\\n  src=\"/photo.jpg\"\\n  alt=\"Description\"\\n  width={800}\\n  height={600}\\n  // priority // Only for above-the-fold images\\n/>`,\n      docLink:\n        \"https://nextjs.org/docs/app/building-your-application/optimizing/images\",\n    });\n  }\n\n  return {\n    id: \"optimize-images\",\n    priority: 3,\n    title: \"Optimize images\",\n    description: `${formatBytes(wastedBytes)} can be saved by properly optimizing ${issues.length} images.`,\n    impact: {\n      level: wastedBytes > 500000 ? \"high\" : \"medium\",\n      sizeSavings: wastedBytes,\n      lcpImprovementMs: issues.some((i) => i.issueType === \"format\") ? 200 : 0,\n    },\n    steps,\n    relatedAudits: [\n      \"modern-image-formats\",\n      \"uses-responsive-images\",\n      \"offscreen-images\",\n    ],\n    frameworkNotes: frameworkNotes.length > 0 ? frameworkNotes : undefined,\n    resources: [\n      {\n        title: \"Use Modern Image Formats\",\n        url: \"https://web.dev/uses-webp-images/\",\n      },\n      {\n        title: \"Properly Size Images\",\n        url: \"https://web.dev/uses-responsive-images/\",\n      },\n    ],\n  };\n}\n\n/**\n * Creates third-party script opportunity\n */\nexport function createThirdPartyOpportunity(\n  result: PerformanceResult,\n  context: ProjectContext | null,\n  blockingTime: number,\n): KeyOpportunity {\n  const thirdParties = result.insights?.thirdParties ?? [];\n  const topBlockers = thirdParties.slice(0, 3);\n\n  return {\n    id: \"optimize-third-parties\",\n    priority: 4,\n    title: \"Reduce third-party script impact\",\n    description: `Third-party scripts block the main thread for ${Math.round(blockingTime)}ms. Top blockers: ${topBlockers.map((t) => t.entity).join(\", \")}.`,\n    impact: {\n      level: blockingTime > 1000 ? \"high\" : \"medium\",\n      lcpImprovementMs: Math.round(blockingTime * 0.3),\n    },\n    steps: [\n      {\n        order: 1,\n        title: \"Audit third-party scripts\",\n        instructions:\n          \"Review each third-party script and determine if it's truly necessary.\",\n      },\n      {\n        order: 2,\n        title: \"Defer non-critical scripts\",\n        instructions:\n          \"Load analytics and tracking scripts after the page has finished loading.\",\n        codeExample: {\n          language: \"javascript\",\n          code: `// Load analytics after page load\\nwindow.addEventListener('load', () => {\\n  // Initialize analytics\\n});`,\n        },\n      },\n      {\n        order: 3,\n        title: \"Use Partytown for heavy scripts\",\n        instructions:\n          \"Consider using Partytown to run third-party scripts in a web worker.\",\n      },\n    ],\n    relatedAudits: [\"third-party-summary\", \"bootup-time\"],\n    frameworkNotes:\n      context?.framework?.name === \"next\"\n        ? [\n            {\n              framework: \"Next.js\",\n              note: \"Use next/script with appropriate strategy to control loading behavior.\",\n              codeExample: `import Script from 'next/script';\\n\\n<Script\\n  src=\"https://analytics.example.com\"\\n  strategy=\"lazyOnload\" // or \"afterInteractive\"\\n/>`,\n              docLink:\n                \"https://nextjs.org/docs/app/building-your-application/optimizing/scripts\",\n            },\n          ]\n        : undefined,\n  };\n}\n\n/**\n * Creates render-blocking resources opportunity\n */\nexport function createRenderBlockingOpportunity(\n  wastedMs: number,\n): KeyOpportunity {\n  return {\n    id: \"eliminate-render-blocking\",\n    priority: 5,\n    title: \"Eliminate render-blocking resources\",\n    description: `Render-blocking resources delay first paint by ${Math.round(wastedMs)}ms.`,\n    impact: {\n      level: wastedMs > 1000 ? \"high\" : \"medium\",\n      lcpImprovementMs: Math.round(wastedMs * 0.7),\n    },\n    steps: [\n      {\n        order: 1,\n        title: \"Inline critical CSS\",\n        instructions:\n          \"Extract CSS needed for above-the-fold content and inline it in the HTML.\",\n      },\n      {\n        order: 2,\n        title: \"Defer non-critical CSS\",\n        instructions:\n          \"Load non-critical CSS asynchronously using media queries or JavaScript.\",\n        codeExample: {\n          language: \"html\",\n          code: '<link rel=\"stylesheet\" href=\"non-critical.css\" media=\"print\" onload=\"this.media=\\'all\\'\">',\n        },\n      },\n      {\n        order: 3,\n        title: \"Add async/defer to scripts\",\n        instructions:\n          \"Non-critical scripts should use async or defer attributes.\",\n        codeExample: {\n          language: \"html\",\n          code: '<script src=\"app.js\" defer></script>',\n        },\n      },\n    ],\n    relatedAudits: [\"render-blocking-resources\", \"critical-request-chains\"],\n  };\n}\n\n/**\n * Creates CLS improvement opportunity\n */\nexport function createCLSOpportunity(\n  result: PerformanceResult,\n): KeyOpportunity {\n  const { metrics } = result;\n\n  return {\n    id: \"improve-cls\",\n    priority: 6,\n    title: \"Improve Cumulative Layout Shift (CLS)\",\n    description: `Your CLS is ${metrics.cls.displayValue}, rated as \"${metrics.cls.rating}\". Target is under 0.1.`,\n    impact: {\n      level: metrics.cls.value > 0.25 ? \"high\" : \"medium\",\n      scoreImprovement: 5,\n    },\n    steps: [\n      {\n        order: 1,\n        title: \"Set explicit dimensions on images and videos\",\n        instructions:\n          \"Always specify width and height attributes on media elements.\",\n        codeExample: {\n          language: \"html\",\n          code: '<img src=\"...\" width=\"800\" height=\"600\" alt=\"...\" />',\n        },\n      },\n      {\n        order: 2,\n        title: \"Reserve space for dynamic content\",\n        instructions:\n          \"Use CSS to reserve space for ads, embeds, and dynamically injected content.\",\n      },\n      {\n        order: 3,\n        title: \"Avoid inserting content above existing content\",\n        instructions:\n          \"New content should be inserted below the current viewport or with user action.\",\n      },\n      {\n        order: 4,\n        title: \"Use CSS transform for animations\",\n        instructions:\n          \"Prefer transform and opacity for animations instead of properties that trigger layout.\",\n      },\n    ],\n    relatedAudits: [\"cumulative-layout-shift\", \"unsized-images\"],\n    resources: [\n      { title: \"Optimize CLS\", url: \"https://web.dev/optimize-cls/\" },\n    ],\n  };\n}\n","/**\n * @silverassist/performance-toolkit\n *\n * Main report generator orchestrating report generation.\n *\n * @module report/generator\n * @author Miguel Colmenares <me@miguelcolmenares.com>\n * @license PolyForm-Noncommercial-1.0.0\n */\n\nimport type {\n  ActionableReport,\n  DiagnosticItem,\n  KeyOpportunity,\n  NextStep,\n  PerformanceResult,\n  ProjectContext,\n} from \"../types\";\nimport { generateDiagnosticsTable } from \"./diagnostics\";\nimport { generateEnhancedLCP } from \"./lcp\";\nimport { generateKeyOpportunities } from \"./opportunities\";\n\n/**\n * Generates actionable performance reports with framework-specific recommendations\n */\nexport class ActionableReportGenerator {\n  private result: PerformanceResult;\n  private context: ProjectContext | null;\n\n  constructor(result: PerformanceResult, context?: ProjectContext | null) {\n    this.result = result;\n    this.context = context ?? null;\n  }\n\n  /**\n   * Generates a complete actionable report\n   */\n  generate(): ActionableReport {\n    const diagnosticsTable = generateDiagnosticsTable(this.result);\n    const enhancedLCP = generateEnhancedLCP(this.result, this.context);\n    const keyOpportunities = generateKeyOpportunities(\n      this.result,\n      this.context,\n    );\n    const nextSteps = this.generateNextSteps(keyOpportunities);\n    const summary = this.generateSummary(diagnosticsTable, keyOpportunities);\n\n    return {\n      performanceResult: this.result,\n      projectContext: this.context ?? undefined,\n      enhancedLCP,\n      diagnosticsTable,\n      keyOpportunities,\n      nextSteps,\n      summary,\n      generatedAt: new Date().toISOString(),\n    };\n  }\n\n  /**\n   * Generates recommended next steps\n   */\n  private generateNextSteps(opportunities: KeyOpportunity[]): NextStep[] {\n    const steps: NextStep[] = [];\n    const topOpportunities = opportunities.slice(0, 3);\n\n    // Immediate actions from top opportunities\n    for (const opp of topOpportunities) {\n      if (opp.impact.level === \"critical\" || opp.impact.level === \"high\") {\n        steps.push({\n          id: `next-${opp.id}`,\n          title: opp.steps[0]?.title ?? opp.title,\n          description: `Start with the first step of \"${opp.title}\" - this has ${opp.impact.level} impact.`,\n          type: \"code-change\",\n          urgency: opp.impact.level === \"critical\" ? \"immediate\" : \"soon\",\n          relatedOpportunities: [opp.id],\n        });\n      }\n    }\n\n    // Add monitoring step\n    steps.push({\n      id: \"next-setup-monitoring\",\n      title: \"Set up continuous performance monitoring\",\n      description:\n        \"Use this toolkit in your CI/CD pipeline to catch regressions early.\",\n      type: \"monitoring\",\n      urgency: \"when-possible\",\n    });\n\n    // Add testing step\n    if (this.result.scores.performance && this.result.scores.performance < 90) {\n      steps.push({\n        id: \"next-perf-testing\",\n        title: \"Add performance tests to CI pipeline\",\n        description:\n          \"Create performance budgets and fail builds that exceed thresholds.\",\n        type: \"testing\",\n        urgency: \"soon\",\n      });\n    }\n\n    return steps.slice(0, 5);\n  }\n\n  /**\n   * Generates executive summary\n   */\n  private generateSummary(\n    diagnostics: DiagnosticItem[],\n    opportunities: KeyOpportunity[],\n  ): ActionableReport[\"summary\"] {\n    const { scores, insights } = this.result;\n\n    // Determine health status\n    let healthStatus: ActionableReport[\"summary\"][\"healthStatus\"];\n    if ((scores.performance ?? 0) >= 90) {\n      healthStatus = \"healthy\";\n    } else if ((scores.performance ?? 0) >= 50) {\n      healthStatus = \"needs-attention\";\n    } else {\n      healthStatus = \"critical\";\n    }\n\n    // Count quick wins (easy effort, high/medium impact)\n    const quickWins = opportunities.filter((o) =>\n      o.steps.some((s) => s.estimatedTime?.includes(\"minute\") || s.codeExample),\n    ).length;\n\n    // Calculate total potential savings\n    const timeMs =\n      insights?.totalSavings?.timeMs ??\n      diagnostics.reduce((sum, d) => sum + (d.savings?.timeMs ?? 0), 0);\n    const sizeBytes =\n      insights?.totalSavings?.sizeBytes ??\n      diagnostics.reduce((sum, d) => sum + (d.savings?.bytes ?? 0), 0);\n\n    // Get top 3 priorities\n    const topPriorities = opportunities.slice(0, 3).map((o) => o.title);\n\n    return {\n      healthStatus,\n      quickWinsCount: quickWins,\n      potentialSavings: {\n        timeMs: Math.round(timeMs),\n        sizeBytes: Math.round(sizeBytes),\n      },\n      topPriorities,\n    };\n  }\n}\n\n/**\n * Creates an actionable report generator\n */\nexport function createReportGenerator(\n  result: PerformanceResult,\n  context?: ProjectContext | null,\n): ActionableReportGenerator {\n  return new ActionableReportGenerator(result, context);\n}\n\n/**\n * Quick function to generate an actionable report\n */\nexport function generateActionableReport(\n  result: PerformanceResult,\n  context?: ProjectContext | null,\n): ActionableReport {\n  const generator = new ActionableReportGenerator(result, context);\n  return generator.generate();\n}\n","/**\n * @silverassist/performance-toolkit\n *\n * Bundle analyzer for Next.js applications using @next/bundle-analyzer.\n *\n * @module bundle/runner\n * @author Miguel Colmenares <me@miguelcolmenares.com>\n * @license PolyForm-Noncommercial-1.0.0\n */\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport { exec } from \"child_process\";\nimport { promisify } from \"util\";\nimport type {\n  BundleAnalyzerOptions,\n  BundleAnalysisResult,\n  BundleSummary,\n} from \"../types/bundle\";\n\nconst execAsync = promisify(exec);\n\ntype PackageManager = \"npm\" | \"yarn\" | \"pnpm\";\n\n/**\n * Runner for Next.js bundle analysis using @next/bundle-analyzer\n */\nexport class BundleAnalyzerRunner {\n  private projectPath: string;\n  private options: BundleAnalyzerOptions;\n  private onLog?: (message: string) => void;\n  private onError?: (message: string) => void;\n\n  constructor(options: BundleAnalyzerOptions = {}) {\n    this.projectPath = options.projectPath || process.cwd();\n    this.options = options;\n  }\n\n  /**\n   * Set logging callback for CLI usage\n   */\n  setLogCallback(onLog: (message: string) => void): void {\n    this.onLog = onLog;\n  }\n\n  /**\n   * Set error callback for CLI usage\n   */\n  setErrorCallback(onError: (message: string) => void): void {\n    this.onError = onError;\n  }\n\n  /**\n   * Log message (used by CLI layer)\n   */\n  private log(message: string): void {\n    if (this.onLog) {\n      this.onLog(message);\n    }\n  }\n\n  /**\n   * Log error (used by CLI layer)\n   */\n  private logError(message: string): void {\n    if (this.onError) {\n      this.onError(message);\n    }\n  }\n\n  /**\n   * Detect the package manager used in the project\n   */\n  private detectPackageManager(): PackageManager {\n    if (fs.existsSync(path.join(this.projectPath, \"yarn.lock\"))) {\n      return \"yarn\";\n    }\n\n    if (fs.existsSync(path.join(this.projectPath, \"pnpm-lock.yaml\"))) {\n      return \"pnpm\";\n    }\n\n    return \"npm\";\n  }\n\n  /**\n   * Check if @next/bundle-analyzer is installed\n   */\n  private isAnalyzerInstalled(): boolean {\n    const packageJsonPath = path.join(this.projectPath, \"package.json\");\n\n    if (!fs.existsSync(packageJsonPath)) {\n      return false;\n    }\n\n    try {\n      const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n      const deps = {\n        ...packageJson.dependencies,\n        ...packageJson.devDependencies,\n      };\n      return \"@next/bundle-analyzer\" in deps;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Check if this is a Next.js project\n   */\n  private isNextJsProject(): boolean {\n    const packageJsonPath = path.join(this.projectPath, \"package.json\");\n\n    if (!fs.existsSync(packageJsonPath)) {\n      return false;\n    }\n\n    try {\n      const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n      const deps = {\n        ...packageJson.dependencies,\n        ...packageJson.devDependencies,\n      };\n      return \"next\" in deps;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Install @next/bundle-analyzer\n   */\n  private async installAnalyzer(): Promise<boolean> {\n    try {\n      this.log(\"📦 Installing @next/bundle-analyzer...\");\n\n      const packageManager = this.detectPackageManager();\n      const installCmd =\n        packageManager === \"yarn\"\n          ? \"yarn add --dev @next/bundle-analyzer\"\n          : packageManager === \"pnpm\"\n            ? \"pnpm add --save-dev @next/bundle-analyzer\"\n            : \"npm install --save-dev @next/bundle-analyzer\";\n\n      await execAsync(installCmd, { cwd: this.projectPath });\n      this.log(\"✅ @next/bundle-analyzer installed successfully\");\n      return true;\n    } catch (error) {\n      const err = error as {\n        message?: string;\n        stderr?: string;\n        stdout?: string;\n      };\n      this.logError(\"❌ Failed to install @next/bundle-analyzer\");\n\n      if (err?.message) {\n        this.logError(`Error: ${err.message}`);\n      }\n\n      if (err?.stderr) {\n        this.logError(`stderr: ${err.stderr}`);\n      }\n\n      return false;\n    }\n  }\n\n  /**\n   * Backup existing next.config file\n   */\n  private backupNextConfig(): string | null {\n    const configFiles = [\"next.config.js\", \"next.config.mjs\", \"next.config.ts\"];\n\n    for (const configFile of configFiles) {\n      const configPath = path.join(this.projectPath, configFile);\n      if (fs.existsSync(configPath)) {\n        const backupPath = configPath + \".backup\";\n\n        // Check if backup already exists\n        if (fs.existsSync(backupPath)) {\n          throw new Error(\n            `Backup file already exists for ${configFile} at ${backupPath}. ` +\n              \"Please restore or remove this backup file before running the bundle analyzer again.\",\n          );\n        }\n\n        fs.copyFileSync(configPath, backupPath);\n        return configFile;\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * Inject bundle analyzer configuration into next.config\n   */\n  private async injectAnalyzerConfig(configFile: string): Promise<void> {\n    const configPath = path.join(this.projectPath, configFile);\n    let content = fs.readFileSync(configPath, \"utf-8\");\n\n    // Check if already configured by verifying both import/require and wrapper usage\n    const hasAnalyzerImportOrRequire =\n      /import\\s+[^'\"]*['\"]@next\\/bundle-analyzer['\"]/.test(content) ||\n      /\\brequire\\(\\s*['\"]@next\\/bundle-analyzer['\"]\\s*\\)/.test(content);\n    const hasWithBundleAnalyzerWrapper = /withBundleAnalyzer\\s*\\(/.test(\n      content,\n    );\n\n    if (hasAnalyzerImportOrRequire && hasWithBundleAnalyzerWrapper) {\n      this.log(\"ℹ️  Bundle analyzer already configured\");\n      return;\n    }\n\n    const analyzerImport =\n      configFile.endsWith(\".mjs\") || configFile.endsWith(\".ts\")\n        ? `import bundleAnalyzer from '@next/bundle-analyzer';\\n\\n`\n        : `const bundleAnalyzer = require('@next/bundle-analyzer');\\n\\n`;\n\n    const analyzerWrapper = `const withBundleAnalyzer = bundleAnalyzer({\n  enabled: process.env.ANALYZE === 'true',\n});\\n\\n`;\n\n    // Insert at the beginning\n    content = analyzerImport + analyzerWrapper + content;\n\n    // Wrap the export - improved regex to handle multi-line statements\n    if (configFile.endsWith(\".mjs\") || configFile.endsWith(\".ts\")) {\n      content = content.replace(\n        /export\\s+default\\s+([\\s\\S]+?)(?=\\n\\s*$|$)/m,\n        \"export default withBundleAnalyzer($1)\",\n      );\n    } else {\n      content = content.replace(\n        /module\\.exports\\s*=\\s*([\\s\\S]+?)(?=\\n\\s*$|$)/m,\n        \"module.exports = withBundleAnalyzer($1)\",\n      );\n    }\n\n    fs.writeFileSync(configPath, content);\n    this.log(\"✅ Injected bundle analyzer configuration\");\n  }\n\n  /**\n   * Restore original next.config from backup\n   */\n  private restoreNextConfig(configFile: string): void {\n    const configPath = path.join(this.projectPath, configFile);\n    const backupPath = configPath + \".backup\";\n\n    if (fs.existsSync(backupPath)) {\n      fs.copyFileSync(backupPath, configPath);\n      fs.unlinkSync(backupPath);\n      this.log(\"✅ Restored original configuration\");\n    }\n  }\n\n  /**\n   * Run Next.js build with ANALYZE=true\n   */\n  private async runBuild(): Promise<boolean> {\n    try {\n      this.log(\"🔨 Building project with bundle analysis...\");\n\n      const packageManager = this.detectPackageManager();\n      const buildCmd =\n        packageManager === \"yarn\"\n          ? \"yarn build\"\n          : packageManager === \"pnpm\"\n            ? \"pnpm build\"\n            : \"npm run build\";\n\n      await execAsync(buildCmd, {\n        cwd: this.projectPath,\n        env: { ...process.env, ANALYZE: \"true\" },\n      });\n\n      this.log(\"✅ Build completed successfully\");\n      return true;\n    } catch (error) {\n      const err = error as {\n        message?: string;\n        stderr?: string;\n        stdout?: string;\n      };\n      this.logError(\"❌ Build failed\");\n\n      if (err?.message) {\n        this.logError(`Error: ${err.message}`);\n      }\n\n      if (err?.stderr) {\n        this.logError(`stderr: ${err.stderr}`);\n      }\n\n      return false;\n    }\n  }\n\n  /**\n   * Parse bundle stats from generated reports\n   */\n  private async parseBundleStats(): Promise<BundleSummary | undefined> {\n    const statsPath = path.join(this.projectPath, \".next\", \"analyze\");\n\n    if (!fs.existsSync(statsPath)) {\n      return undefined;\n    }\n\n    // This is a simplified version - in production, you'd parse the actual webpack stats\n    const summary: BundleSummary = {\n      totalClientSize: 0,\n      largestChunks: [],\n      largestDependencies: [],\n      recommendations: [\n        \"Check client bundle HTML report for detailed breakdown\",\n        \"Consider code splitting for large chunks\",\n        \"Review third-party dependencies for optimization opportunities\",\n        \"Use dynamic imports for heavy components\",\n      ],\n    };\n\n    return summary;\n  }\n\n  /**\n   * Find generated report files\n   */\n  private findReportFiles(): {\n    client?: string;\n    server?: string;\n    edge?: string;\n  } {\n    const reports: { client?: string; server?: string; edge?: string } = {};\n    const nextDir = path.join(this.projectPath, \".next\");\n\n    const clientReport = path.join(nextDir, \"analyze\", \"client.html\");\n    const serverReport = path.join(nextDir, \"analyze\", \"server.html\");\n    const edgeReport = path.join(nextDir, \"analyze\", \"edge.html\");\n\n    if (fs.existsSync(clientReport)) reports.client = clientReport;\n    if (fs.existsSync(serverReport)) reports.server = serverReport;\n    if (fs.existsSync(edgeReport)) reports.edge = edgeReport;\n\n    return reports;\n  }\n\n  /**\n   * Run bundle analysis\n   */\n  async analyze(): Promise<BundleAnalysisResult> {\n    let installedAnalyzer = false;\n    let configFile: string | null = null;\n\n    try {\n      // Check if this is a Next.js project\n      if (!this.isNextJsProject()) {\n        return {\n          success: false,\n          projectPath: this.projectPath,\n          installedAnalyzer: false,\n          error: \"Not a Next.js project. Bundle analysis requires Next.js.\",\n        };\n      }\n\n      // Check and install analyzer if needed\n      const analyzerInstalled = this.isAnalyzerInstalled();\n      if (!analyzerInstalled) {\n        if (this.options.autoInstall) {\n          const installed = await this.installAnalyzer();\n          if (!installed) {\n            return {\n              success: false,\n              projectPath: this.projectPath,\n              installedAnalyzer: false,\n              error: \"Failed to install @next/bundle-analyzer\",\n            };\n          }\n          installedAnalyzer = true;\n        } else {\n          return {\n            success: false,\n            projectPath: this.projectPath,\n            installedAnalyzer: false,\n            error:\n              \"@next/bundle-analyzer not installed. Run with --auto-install flag or install manually.\",\n          };\n        }\n      }\n\n      // Backup and inject configuration\n      configFile = this.backupNextConfig();\n      if (configFile) {\n        await this.injectAnalyzerConfig(configFile);\n      } else {\n        return {\n          success: false,\n          projectPath: this.projectPath,\n          installedAnalyzer,\n          error: \"No next.config file found\",\n        };\n      }\n\n      // Run build\n      const buildSuccess = await this.runBuild();\n      if (!buildSuccess) {\n        return {\n          success: false,\n          projectPath: this.projectPath,\n          installedAnalyzer,\n          error: \"Build failed\",\n        };\n      }\n\n      // Parse results\n      const reports = this.findReportFiles();\n      const summary = await this.parseBundleStats();\n\n      return {\n        success: true,\n        projectPath: this.projectPath,\n        installedAnalyzer,\n        reports,\n        summary,\n      };\n    } catch (error) {\n      return {\n        success: false,\n        projectPath: this.projectPath,\n        installedAnalyzer,\n        error: error instanceof Error ? error.message : \"Unknown error\",\n      };\n    } finally {\n      // Always restore original config, but don't let restore errors mask the original one\n      if (configFile) {\n        try {\n          this.restoreNextConfig(configFile);\n        } catch (restoreError) {\n          // Log restore error without throwing to preserve any original error\n          this.logError(\n            `Failed to restore original Next.js configuration: ${\n              restoreError instanceof Error\n                ? restoreError.message\n                : restoreError\n            }`,\n          );\n        }\n      }\n    }\n  }\n}\n\n/**\n * Create a bundle analyzer runner\n */\nexport function createBundleAnalyzer(\n  options?: BundleAnalyzerOptions,\n): BundleAnalyzerRunner {\n  return new BundleAnalyzerRunner(options);\n}\n\n/**\n * Quick analysis function\n */\nexport async function analyzeBundle(\n  options?: BundleAnalyzerOptions,\n): Promise<BundleAnalysisResult> {\n  const runner = createBundleAnalyzer(options);\n  return runner.analyze();\n}\n","/**\n * @silverassist/performance-toolkit\n *\n * Export pattern analyzer for Next.js tree-shaking optimization.\n *\n * @module analyzer/analyzer\n * @author Miguel Colmenares <me@miguelcolmenares.com>\n * @license PolyForm-Noncommercial-1.0.0\n */\n\nimport type {\n  ExportAnalyzerOptions,\n  ExportAnalysisResult,\n  ExportAnalysisSummary,\n  ExportIssue,\n  ExportRecommendation,\n  ExportType,\n  FileExportInfo,\n  NextConfigAnalysis,\n  ReExportType,\n} from \"../types\";\n\n/**\n * Export pattern analyzer for detecting suboptimal module export patterns\n * that impact tree-shaking effectiveness in Next.js projects.\n */\nexport class ExportAnalyzer {\n  private options: Required<ExportAnalyzerOptions>;\n  private fs: typeof import(\"fs\") | null = null;\n  private path: typeof import(\"path\") | null = null;\n\n  constructor(options: ExportAnalyzerOptions = {}) {\n    this.options = {\n      projectRoot: options.projectRoot || process.cwd(),\n      includeDirs: options.includeDirs || [\n        \"src\",\n        \"app\",\n        \"pages\",\n        \"components\",\n        \"lib\",\n      ],\n      excludeDirs: options.excludeDirs || [\n        \"node_modules\",\n        \"dist\",\n        \"build\",\n        \".next\",\n        \".turbo\",\n        \"coverage\",\n        \"__tests__\",\n        \".test\",\n        \".spec\",\n      ],\n      extensions: options.extensions || [\".ts\", \".tsx\", \".js\", \".jsx\"],\n      analyzeNextConfig: options.analyzeNextConfig ?? true,\n      minBarrelFileReexports: options.minBarrelFileReexports ?? 3,\n    };\n  }\n\n  /**\n   * Performs complete export pattern analysis\n   */\n  async analyze(): Promise<ExportAnalysisResult> {\n    await this.loadModules();\n\n    const files = await this.scanFiles();\n    const fileAnalyses = await this.analyzeFiles(files);\n\n    const summary = this.createSummary(fileAnalyses);\n    const filesWithIssues = fileAnalyses.filter((f) => f.issues.length > 0);\n\n    const nextConfig = this.options.analyzeNextConfig\n      ? await this.analyzeNextConfig()\n      : undefined;\n\n    const recommendations = this.generateRecommendations(\n      summary,\n      filesWithIssues,\n      nextConfig,\n    );\n\n    // Detect framework info if available\n    const framework = await this.detectFramework();\n\n    return {\n      timestamp: new Date().toISOString(),\n      projectRoot: this.options.projectRoot,\n      framework,\n      summary,\n      filesWithIssues,\n      nextConfig,\n      recommendations,\n    };\n  }\n\n  /**\n   * Dynamically load fs and path modules\n   */\n  private async loadModules(): Promise<void> {\n    try {\n      this.fs = await import(\"fs\");\n      this.path = await import(\"path\");\n    } catch {\n      throw new Error(\n        \"File system access not available in this environment. ExportAnalyzer requires Node.js environment.\",\n      );\n    }\n  }\n\n  /**\n   * Scans project directories for files to analyze\n   */\n  private async scanFiles(): Promise<string[]> {\n    if (!this.fs || !this.path) return [];\n\n    const files: string[] = [];\n\n    for (const dir of this.options.includeDirs) {\n      const dirPath = this.path.join(this.options.projectRoot, dir);\n\n      if (this.fs.existsSync(dirPath)) {\n        const foundFiles = await this.scanDirectory(dirPath);\n        files.push(...foundFiles);\n      }\n    }\n\n    return files;\n  }\n\n  /**\n   * Recursively scans a directory for matching files\n   */\n  private async scanDirectory(dirPath: string): Promise<string[]> {\n    if (!this.fs || !this.path) return [];\n\n    const files: string[] = [];\n\n    try {\n      const entries = this.fs.readdirSync(dirPath, { withFileTypes: true });\n\n      for (const entry of entries) {\n        const fullPath = this.path.join(dirPath, entry.name);\n\n        // Skip excluded directories\n        if (entry.isDirectory()) {\n          if (this.options.excludeDirs.includes(entry.name)) continue;\n          if (entry.name.startsWith(\".\")) continue;\n\n          const subFiles = await this.scanDirectory(fullPath);\n          files.push(...subFiles);\n        } else if (entry.isFile()) {\n          // Check if file has valid extension\n          const ext = this.path.extname(entry.name);\n          if (this.options.extensions.includes(ext)) {\n            files.push(fullPath);\n          }\n        }\n      }\n    } catch {\n      // Directory not accessible, skip\n    }\n\n    return files;\n  }\n\n  /**\n   * Analyzes export patterns in multiple files\n   */\n  private async analyzeFiles(files: string[]): Promise<FileExportInfo[]> {\n    const analyses: FileExportInfo[] = [];\n\n    for (const filePath of files) {\n      const analysis = await this.analyzeFile(filePath);\n      analyses.push(analysis);\n    }\n\n    return analyses;\n  }\n\n  /**\n   * Analyzes export patterns in a single file\n   */\n  private async analyzeFile(filePath: string): Promise<FileExportInfo> {\n    if (!this.fs || !this.path) {\n      throw new Error(\"File system modules not loaded\");\n    }\n\n    const content = this.fs.readFileSync(filePath, \"utf-8\");\n    const relativePath = this.path.relative(this.options.projectRoot, filePath);\n\n    const fileName = this.path.basename(filePath, this.path.extname(filePath));\n    const isBarrelFile = fileName === \"index\";\n\n    // Detect export patterns using regex\n    const defaultExportCount = this.countDefaultExports(content);\n    const namedExportCount = this.countNamedExports(content);\n\n    // Determine primary export type\n    let exportType: ExportType = \"named\";\n    if (defaultExportCount > 0 && namedExportCount > 0) {\n      exportType = \"mixed\";\n    } else if (defaultExportCount > 0) {\n      exportType = \"default\";\n    } else if (content.includes(\"export *\")) {\n      exportType = \"namespace\";\n    }\n\n    // Analyze re-exports for barrel files\n    let reExportType: ReExportType | undefined;\n    let reExportCount: number | undefined;\n\n    if (isBarrelFile) {\n      const reExports = this.analyzeReExports(content);\n      reExportType = reExports.type;\n      reExportCount = reExports.count;\n    }\n\n    // Detect issues\n    const issues = this.detectIssues(\n      content,\n      exportType,\n      isBarrelFile,\n      reExportType,\n    );\n\n    return {\n      path: relativePath,\n      exportType,\n      defaultExportCount,\n      namedExportCount,\n      isBarrelFile,\n      reExportType,\n      reExportCount,\n      issues,\n    };\n  }\n\n  /**\n   * Counts default exports in file content\n   */\n  private countDefaultExports(content: string): number {\n    // Match: export default ...\n    const patterns = [\n      /export\\s+default\\s+/g,\n      /export\\s*\\{\\s*\\w+\\s+as\\s+default\\s*\\}/g,\n    ];\n\n    let count = 0;\n    for (const pattern of patterns) {\n      const matches = content.match(pattern);\n      if (matches) count += matches.length;\n    }\n\n    return count;\n  }\n\n  /**\n   * Counts named exports in file content\n   */\n  private countNamedExports(content: string): number {\n    const patterns = [\n      // export function/const/class Name\n      /export\\s+(function|const|let|var|class|interface|type|enum)\\s+\\w+/g,\n      // export { Name1, Name2 } (but NOT re-exports with 'from')\n      // Use simple character class with bounded length to prevent ReDoS\n      /export\\s*\\{[^}]{1,1000}\\}(?!\\s*from)/g,\n    ];\n\n    let count = 0;\n    for (const pattern of patterns) {\n      const matches = content.match(pattern);\n      if (matches) count += matches.length;\n    }\n\n    return count;\n  }\n\n  /**\n   * Analyzes re-export patterns in barrel files\n   */\n  private analyzeReExports(content: string): {\n    type: ReExportType;\n    count: number;\n  } {\n    const defaultAsNamedPattern =\n      /export\\s*\\{\\s*default\\s+as\\s+\\w+\\s*\\}\\s*from/g;\n    // Named pattern should NOT match 'default as' patterns\n    // Using bounded character class [^}]{1,1000} to prevent ReDoS\n    // Then filter out 'default as' matches programmatically\n    const namedPattern = /export\\s*\\{[^}]{1,1000}\\}\\s*from/g;\n    const namespacePattern = /export\\s*\\*\\s*from/g;\n\n    const defaultAsNamed = content.match(defaultAsNamedPattern)?.length || 0;\n    // Filter out 'default as' patterns from named matches\n    const namedMatches = content.match(namedPattern) || [];\n    const named = namedMatches.filter((m) => !m.includes(\"default as\")).length;\n    const namespace = content.match(namespacePattern)?.length || 0;\n\n    let type: ReExportType = \"named\";\n    if (defaultAsNamed > 0 && named > 0) {\n      type = \"mixed\";\n    } else if (defaultAsNamed > 0) {\n      type = \"default-as-named\";\n    } else if (namespace > 0) {\n      type = \"namespace\";\n    }\n\n    const count = defaultAsNamed + named + namespace;\n\n    return { type, count };\n  }\n\n  /**\n   * Detects export pattern issues\n   */\n  private detectIssues(\n    content: string,\n    exportType: ExportType,\n    isBarrelFile: boolean,\n    reExportType?: ReExportType,\n  ): ExportIssue[] {\n    const issues: ExportIssue[] = [];\n\n    // Issue 1: Default exports in barrel files\n    if (isBarrelFile && exportType === \"default\") {\n      issues.push({\n        type: \"default-in-barrel\",\n        severity: \"warning\",\n        message:\n          \"Barrel file (index) uses default export, which can prevent tree-shaking\",\n        suggestion:\n          'Use named exports instead: \"export { MyComponent }\" or \"export function MyComponent()\"',\n      });\n    }\n\n    // Issue 2: Default re-exports in barrel files\n    if (isBarrelFile && reExportType === \"default-as-named\") {\n      issues.push({\n        type: \"default-reexport\",\n        severity: \"warning\",\n        message:\n          \"Re-exporting default exports as named (export { default as Name }) is suboptimal for tree-shaking\",\n        suggestion:\n          \"Change source files to use named exports, then re-export: \\\"export { Name } from './file'\\\"\",\n      });\n    }\n\n    // Issue 3: Mixed exports (less critical)\n    if (exportType === \"mixed\") {\n      issues.push({\n        type: \"mixed-exports\",\n        severity: \"info\",\n        message:\n          \"File contains both default and named exports, which can reduce tree-shaking predictability\",\n        suggestion:\n          \"Consider using only named exports for better tree-shaking reliability\",\n      });\n    }\n\n    // Issue 4: Namespace re-exports (can prevent tree-shaking)\n    if (isBarrelFile && reExportType === \"namespace\") {\n      issues.push({\n        type: \"namespace-reexport\",\n        severity: \"warning\",\n        message:\n          'Using \"export * from\" prevents static analysis and may include unused exports',\n        suggestion:\n          \"Use explicit named re-exports: \\\"export { Name1, Name2 } from './file'\\\"\",\n      });\n    }\n\n    return issues;\n  }\n\n  /**\n   * Creates summary statistics from file analyses\n   */\n  private createSummary(analyses: FileExportInfo[]): ExportAnalysisSummary {\n    return {\n      totalFiles: analyses.length,\n      defaultExportFiles: analyses.filter(\n        (a) => a.exportType === \"default\" || a.exportType === \"mixed\",\n      ).length,\n      namedExportFiles: analyses.filter((a) => a.exportType === \"named\").length,\n      mixedExportFiles: analyses.filter((a) => a.exportType === \"mixed\").length,\n      barrelFiles: analyses.filter((a) => a.isBarrelFile).length,\n      problematicBarrelFiles: analyses.filter(\n        (a) =>\n          a.isBarrelFile &&\n          (a.reExportType === \"default-as-named\" ||\n            a.reExportType === \"namespace\"),\n      ).length,\n      totalIssues: analyses.reduce((sum, a) => sum + a.issues.length, 0),\n      issuesBySeverity: {\n        warning: analyses.reduce(\n          (sum, a) =>\n            sum + a.issues.filter((i) => i.severity === \"warning\").length,\n          0,\n        ),\n        info: analyses.reduce(\n          (sum, a) =>\n            sum + a.issues.filter((i) => i.severity === \"info\").length,\n          0,\n        ),\n      },\n    };\n  }\n\n  /**\n   * Analyzes next.config.js/mjs for optimizePackageImports\n   */\n  private async analyzeNextConfig(): Promise<NextConfigAnalysis> {\n    if (!this.fs || !this.path) {\n      return { configFound: false, hasOptimizePackageImports: false };\n    }\n\n    const configFiles = [\"next.config.mjs\", \"next.config.js\", \"next.config.ts\"];\n    let configPath: string | undefined;\n    let content: string | undefined;\n\n    for (const fileName of configFiles) {\n      const filePath = this.path.join(this.options.projectRoot, fileName);\n      if (this.fs.existsSync(filePath)) {\n        configPath = fileName;\n        content = this.fs.readFileSync(filePath, \"utf-8\");\n        break;\n      }\n    }\n\n    if (!content || !configPath) {\n      return {\n        configFound: false,\n        hasOptimizePackageImports: false,\n      };\n    }\n\n    // Check for optimizePackageImports configuration\n    const hasOptimizePackageImports = content.includes(\n      \"optimizePackageImports\",\n    );\n\n    let optimizedPackages: string[] = [];\n    if (hasOptimizePackageImports) {\n      // Try to extract package names (simplified regex approach)\n      const match = content.match(\n        /optimizePackageImports\\s*:\\s*\\[([\\s\\S]*?)\\]/,\n      );\n      if (match) {\n        const packageList = match[1];\n        const packages = packageList.match(/['\"`]([^'\"`]+)['\"`]/g);\n        if (packages) {\n          optimizedPackages = packages.map((p) => p.replace(/['\"`]/g, \"\"));\n        }\n      }\n    }\n\n    // Suggest common internal package patterns if not configured\n    const suggestedPackages: string[] = [];\n    if (!hasOptimizePackageImports) {\n      if (this.fs.existsSync(this.path.join(this.options.projectRoot, \"src\"))) {\n        suggestedPackages.push(\"@/components\", \"@/lib\", \"@/utils\");\n      }\n    }\n\n    return {\n      configFound: true,\n      configPath,\n      hasOptimizePackageImports,\n      optimizedPackages:\n        optimizedPackages.length > 0 ? optimizedPackages : undefined,\n      suggestedPackages:\n        suggestedPackages.length > 0 ? suggestedPackages : undefined,\n    };\n  }\n\n  /**\n   * Detects Next.js framework info\n   */\n  private async detectFramework(): Promise<\n    { name: string; version: string } | undefined\n  > {\n    if (!this.fs || !this.path) return undefined;\n\n    try {\n      const packagePath = this.path.join(\n        this.options.projectRoot,\n        \"package.json\",\n      );\n      if (!this.fs.existsSync(packagePath)) return undefined;\n\n      const content = this.fs.readFileSync(packagePath, \"utf-8\");\n      const pkg = JSON.parse(content) as {\n        dependencies?: Record<string, string>;\n        devDependencies?: Record<string, string>;\n      };\n\n      const nextVersion =\n        pkg.dependencies?.[\"next\"] || pkg.devDependencies?.[\"next\"];\n\n      if (nextVersion) {\n        return {\n          name: \"Next.js\",\n          version: nextVersion.replace(/^[\\^~]/, \"\"),\n        };\n      }\n    } catch {\n      // Failed to parse package.json\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Generates actionable recommendations based on analysis results\n   */\n  private generateRecommendations(\n    summary: ExportAnalysisSummary,\n    filesWithIssues: FileExportInfo[],\n    nextConfig?: NextConfigAnalysis,\n  ): ExportRecommendation[] {\n    const recommendations: ExportRecommendation[] = [];\n\n    // Recommendation 1: Fix barrel files with default re-exports\n    if (summary.problematicBarrelFiles > 0) {\n      const affectedFiles = filesWithIssues\n        .filter(\n          (f) =>\n            f.isBarrelFile &&\n            (f.reExportType === \"default-as-named\" ||\n              f.reExportType === \"namespace\"),\n        )\n        .map((f) => f.path);\n\n      recommendations.push({\n        priority: \"high\",\n        category: \"barrel-files\",\n        title: \"Convert barrel files to use named re-exports\",\n        description: `Found ${summary.problematicBarrelFiles} barrel file(s) using default re-exports or namespace exports, which reduces tree-shaking effectiveness. Convert to named exports for better optimization.`,\n        impact: {\n          bundleSize: \"0-5%\",\n          treeShaking: \"high\",\n          buildPerformance: \"neutral\",\n        },\n        examples: {\n          before:\n            \"// ❌ Problematic\\nexport { default as Button } from './button';\\nexport * from './utils';\",\n          after:\n            \"// ✅ Optimal\\nexport { Button } from './button';\\nexport { util1, util2 } from './utils';\",\n        },\n        affectedFiles,\n      });\n    }\n\n    // Recommendation 2: Convert default exports to named exports\n    const defaultExportPercentage =\n      summary.totalFiles > 0\n        ? Math.round((summary.defaultExportFiles / summary.totalFiles) * 100)\n        : 0;\n\n    if (defaultExportPercentage > 30) {\n      recommendations.push({\n        priority: \"medium\",\n        category: \"default-exports\",\n        title: \"Migrate from default exports to named exports\",\n        description: `${defaultExportPercentage}% of files use default exports, which work less predictably with tree-shaking than named exports.`,\n        impact: {\n          bundleSize: \"1-3%\",\n          treeShaking: \"medium\",\n          buildPerformance: \"neutral\",\n        },\n        examples: {\n          before:\n            \"// ❌ Default export\\nexport default function Button() { ... }\",\n          after: \"// ✅ Named export\\nexport function Button() { ... }\",\n        },\n      });\n    }\n\n    // Recommendation 3: Configure optimizePackageImports\n    if (\n      nextConfig?.configFound &&\n      !nextConfig.hasOptimizePackageImports &&\n      nextConfig.suggestedPackages\n    ) {\n      recommendations.push({\n        priority: \"high\",\n        category: \"config-optimization\",\n        title: \"Enable optimizePackageImports in next.config\",\n        description:\n          \"Next.js can automatically optimize package imports for better tree-shaking. Add your internal packages to the configuration.\",\n        impact: {\n          bundleSize: \"2-8%\",\n          treeShaking: \"high\",\n          buildPerformance: \"improved\",\n        },\n        examples: {\n          before:\n            \"// next.config.mjs\\nexport default {\\n  // no optimization\\n};\",\n          after: `// next.config.mjs\\nexport default {\\n  experimental: {\\n    optimizePackageImports: ${JSON.stringify(nextConfig.suggestedPackages, null, 6)}\\n  }\\n};`,\n        },\n      });\n    }\n\n    // Recommendation 4: General guidance if issues found\n    if (summary.totalIssues > 0 && recommendations.length === 0) {\n      recommendations.push({\n        priority: \"low\",\n        category: \"general\",\n        title: \"Review export patterns for consistency\",\n        description: `Found ${summary.totalIssues} export pattern issue(s). While not critical, addressing these can improve tree-shaking reliability and code maintainability.`,\n        impact: {\n          bundleSize: \"0-2%\",\n          treeShaking: \"low\",\n          buildPerformance: \"neutral\",\n        },\n      });\n    }\n\n    return recommendations;\n  }\n}\n\n/**\n * Creates an export analyzer instance\n */\nexport function createExportAnalyzer(\n  options?: ExportAnalyzerOptions,\n): ExportAnalyzer {\n  return new ExportAnalyzer(options);\n}\n\n/**\n * Quick function to analyze export patterns in a project\n */\nexport async function analyzeExports(\n  options?: ExportAnalyzerOptions,\n): Promise<ExportAnalysisResult> {\n  const analyzer = new ExportAnalyzer(options);\n  return analyzer.analyze();\n}\n","/**\n * @silverassist/performance-toolkit\n *\n * PageSpeed Insights and Lighthouse CI integration for performance monitoring\n * across SilverAssist projects (FamilyAssets, CareConnect, AgingAdvocate, OSA).\n *\n * @module @silverassist/performance-toolkit\n * @author Miguel Colmenares <me@miguelcolmenares.com>\n * @license PolyForm-Noncommercial-1.0.0\n * @see {@link https://github.com/SilverAssist/performance-toolkit}\n *\n * @example PageSpeed API usage\n * ```ts\n * import { analyzeUrl } from '@silverassist/performance-toolkit';\n *\n * const result = await analyzeUrl('https://www.familyassets.com', {\n *   strategy: 'mobile',\n *   apiKey: process.env.PAGESPEED_API_KEY,\n * });\n * console.log(result.scores.performance); // 85\n * console.log(result.metrics.lcp.displayValue); // \"2.5 s\"\n * ```\n *\n * @example Lighthouse CI usage\n * ```ts\n * import { createPSIRunner, getDefaultThresholds } from '@silverassist/performance-toolkit';\n *\n * const runner = createPSIRunner(\n *   ['https://www.familyassets.com/assisted-living'],\n *   process.env.PAGESPEED_API_KEY\n * ).withAssertions(getDefaultThresholds());\n *\n * const exitCode = await runner.run();\n * ```\n */\n\n// PageSpeed Insights exports\nexport {\n  PageSpeedClient,\n  createPageSpeedClient,\n  analyzeUrl,\n} from \"./pagespeed\";\n\n// Lighthouse CI exports\nexport {\n  LighthouseRunner,\n  createNodeRunner,\n  createPSIRunner,\n  createHybridRunners,\n  getDefaultThresholds,\n} from \"./lighthouse\";\n\n// Project Context Detection exports\nexport {\n  ProjectContextDetector,\n  createContextDetector,\n  detectProjectContext,\n} from \"./context\";\n\n// Actionable Report Generation exports\nexport {\n  ActionableReportGenerator,\n  createReportGenerator,\n  generateActionableReport,\n} from \"./report\";\n\n// Bundle Analysis exports\nexport {\n  BundleAnalyzerRunner,\n  createBundleAnalyzer,\n  analyzeBundle,\n} from \"./bundle\";\n\n// Export Pattern Analyzer exports\nexport {\n  ExportAnalyzer,\n  createExportAnalyzer,\n  analyzeExports,\n} from \"./analyzer\";\n\n// Type exports\nexport type {\n  // Core types\n  CoreWebVitals,\n  MetricValue,\n  Strategy,\n  Category,\n  // PageSpeed types\n  PageSpeedOptions,\n  PageSpeedResponse,\n  LoadingExperience,\n  LighthouseResult,\n  LighthouseCategories,\n  LighthouseCategory,\n  LighthouseAudit,\n  AuditDetails,\n  // Result types\n  PerformanceResult,\n  CategoryScores,\n  LCPElement,\n  LCPBreakdown,\n  Opportunity,\n  Diagnostic,\n  // Detailed Insights types (for AI agents)\n  DetailedInsights,\n  CacheIssue,\n  ImageIssue,\n  UnusedCodeIssue,\n  LegacyJSIssue,\n  ThirdPartyIssue,\n  LongTask,\n  RenderBlockingResource,\n  // Lighthouse CI types\n  LHCIMethod,\n  LHCIOptions,\n  LHCIAssertions,\n  LHCIConfig,\n  // Configuration types\n  PerformanceThresholds,\n  ProjectConfig,\n  ToolkitConfig,\n  // CLI types\n  CLIOptions,\n  CLIResult,\n  ThresholdViolation,\n  // Diagnostics & Enhanced LCP types\n  DiagnosticItem,\n  DiagnosticDetailItem,\n  EnhancedLCPElement,\n  LCPRecommendation,\n  // Project Context types\n  ProjectContext,\n  FrameworkInfo,\n  // Actionable Report types\n  KeyOpportunity,\n  ActionStep,\n  FrameworkSpecificNote,\n  NextStep,\n  ActionableReport,\n  // Bundle types\n  BundleAnalyzerOptions,\n  BundleAnalysisResult,\n  BundleSummary,\n  ChunkInfo,\n  DependencyInfo,\n  // Export Analyzer types\n  ExportType,\n  ReExportType,\n  FileExportInfo,\n  ExportIssue,\n  ExportAnalysisSummary,\n  NextConfigAnalysis,\n  ExportAnalysisResult,\n  ExportRecommendation,\n  ExportAnalyzerOptions,\n} from \"./types\";\n\n/**\n * Package version\n */\nexport const VERSION = \"0.4.0\";\n\n/**\n * Supported SilverAssist projects\n */\nexport const PROJECTS = {\n  FA: \"FamilyAssets\",\n  CC: \"CareConnect\",\n  AA: \"AgingAdvocate\",\n  OSA: \"OSA\",\n} as const;\n\n/**\n * Default Core Web Vitals thresholds (based on Google's guidelines)\n */\nexport const CWV_THRESHOLDS = {\n  LCP: {\n    good: 2500,\n    needsImprovement: 4000,\n  },\n  FCP: {\n    good: 1800,\n    needsImprovement: 3000,\n  },\n  CLS: {\n    good: 0.1,\n    needsImprovement: 0.25,\n  },\n  TBT: {\n    good: 200,\n    needsImprovement: 600,\n  },\n} as const;\n"]}