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