{"version":3,"sources":["../../src/analyzer/analyzer.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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"]}