next-api-analyzer
Version:
Next.js API routes analyzer for security, performance, and maintainability
1 lines • 9.29 kB
Source Map (JSON)
{"version":3,"sources":["../src/lib/cache-manager.ts","../src/index.ts"],"sourcesContent":["import fs from \"fs/promises\"\nimport path from \"path\"\nimport crypto from \"crypto\"\nimport { logger } from \"../utils/logger\"\nimport type { CacheConfig } from \"../types\"\n\nexport interface CacheEntry<T> {\n data: T\n timestamp: number\n ttl: number\n}\n\nexport class CacheManager {\n private memoryCache = new Map<string, CacheEntry<any>>()\n private config: CacheConfig\n\n constructor(config: CacheConfig) {\n this.config = config\n this.startCleanupTimer()\n }\n\n async get<T>(key: string): Promise<T | null> {\n if (!this.config.enabled) return null\n\n try {\n const memoryEntry = this.memoryCache.get(key)\n if (memoryEntry && this.isValid(memoryEntry)) {\n return memoryEntry.data\n }\n\n const diskEntry = await this.getDiskCache<T>(key)\n if (diskEntry && this.isValid(diskEntry)) {\n this.memoryCache.set(key, diskEntry)\n return diskEntry.data\n }\n\n return null\n } catch (error) {\n logger.warn(`Cache get error for key ${key}:`, error)\n return null\n }\n }\n\n async set<T>(key: string, data: T, ttl?: number): Promise<void> {\n if (!this.config.enabled) return\n\n try {\n const entry: CacheEntry<T> = {\n data,\n timestamp: Date.now(),\n ttl: ttl || this.config.ttl,\n }\n\n this.memoryCache.set(key, entry)\n await this.setDiskCache(key, entry)\n } catch (error) {\n logger.warn(`Cache set error for key ${key}:`, error)\n }\n }\n\n generateKey(...parts: string[]): string {\n return crypto.createHash(\"md5\").update(parts.join(\":\")).digest(\"hex\")\n }\n\n private isValid<T>(entry: CacheEntry<T>): boolean {\n return Date.now() - entry.timestamp < entry.ttl\n }\n\n private async getDiskCache<T>(key: string): Promise<CacheEntry<T> | null> {\n try {\n const filePath = path.join(this.config.directory, `${key}.json`)\n const content = await fs.readFile(filePath, \"utf-8\")\n return JSON.parse(content)\n } catch {\n return null\n }\n }\n\n private async setDiskCache<T>(key: string, entry: CacheEntry<T>): Promise<void> {\n try {\n const filePath = path.join(this.config.directory, `${key}.json`)\n await fs.mkdir(path.dirname(filePath), { recursive: true })\n await fs.writeFile(filePath, JSON.stringify(entry), \"utf-8\")\n } catch (error) {\n logger.debug(`Disk cache write error for ${key}:`, error)\n }\n }\n\n private startCleanupTimer(): void {\n setInterval(() => {\n for (const [key, entry] of this.memoryCache.entries()) {\n if (!this.isValid(entry)) {\n this.memoryCache.delete(key)\n }\n }\n }, 60000)\n }\n}","import { NextApiAnalyzer, withApiTracking, analyzeApiRoutes } from \"./lib/api-analyzer\"\nexport { NextApiAnalyzer, withApiTracking, analyzeApiRoutes }\n\nimport { PluginManager, OpenApiPlugin, TestCoveragePlugin } from \"./lib/plugin-system\"\nexport { PluginManager, OpenApiPlugin, TestCoveragePlugin }\n\nimport { CacheManager } from \"./lib/cache-manager\"\nexport { CacheManager }\n\nimport type { AnalyzerConfig, ApiAnalysisResult } from \"./types\"\nexport * from \"./types\"\n\nimport * as defaultConfig from \"./config/default-config\"\nexport { defaultConfig }\n\nimport * as logger from \"./utils/logger\"\nimport * as fileUtils from \"./utils/file-utils\"\nexport { logger, fileUtils }\n\nimport * as securityAnalyzer from \"./analyzers/security-analyzer\"\nimport * as performanceAnalyzer from \"./analyzers/performance-analyzer\"\nexport { securityAnalyzer, performanceAnalyzer }\n\nimport { program } from \"./bin/api-analyzer\"\nexport { program }\n\nexport const VERSION = \"3.1.0\"\n\nexport const ENTERPRISE_CONFIG: Partial<AnalyzerConfig> = {\n enableTrends: true,\n enablePerformanceAnalysis: true,\n enableSecurityAnalysis: true,\n parallel: true,\n maxConcurrency: 8,\n thresholds: {\n security: 95,\n performance: 90,\n maintainability: 85,\n testCoverage: 90,\n complexity: 6,\n },\n cache: {\n enabled: true,\n ttl: 3600000,\n directory: \".cache/enterprise-analyzer\",\n },\n}\n\nexport const SECURITY_FOCUSED_CONFIG: Partial<AnalyzerConfig> = {\n enableSecurityAnalysis: true,\n enablePerformanceAnalysis: false,\n thresholds: {\n security: 90,\n performance: 50,\n maintainability: 50,\n testCoverage: 70,\n complexity: 10,\n },\n}\n\nexport const PERFORMANCE_FOCUSED_CONFIG: Partial<AnalyzerConfig> = {\n enablePerformanceAnalysis: true,\n enableSecurityAnalysis: false,\n thresholds: {\n security: 50,\n performance: 85,\n maintainability: 80,\n testCoverage: 60,\n complexity: 8,\n },\n}\n\nexport function createSecurityAnalyzer(config?: Partial<AnalyzerConfig>): NextApiAnalyzer {\n return new NextApiAnalyzer({ ...SECURITY_FOCUSED_CONFIG, ...config })\n}\n\nexport function createPerformanceAnalyzer(config?: Partial<AnalyzerConfig>): NextApiAnalyzer {\n return new NextApiAnalyzer({ ...PERFORMANCE_FOCUSED_CONFIG, ...config })\n}\n\nexport function createEnterpriseAnalyzer(config?: Partial<AnalyzerConfig>): NextApiAnalyzer {\n return new NextApiAnalyzer({ ...ENTERPRISE_CONFIG, ...config })\n}\n\nexport async function quickSecurityAudit(apiDir?: string): Promise<ApiAnalysisResult> {\n const analyzer = createSecurityAnalyzer({ apiDir })\n return analyzer.analyzeRoutes()\n}\n\nexport async function quickPerformanceAudit(apiDir?: string): Promise<ApiAnalysisResult> {\n const analyzer = createPerformanceAnalyzer({ apiDir })\n return analyzer.analyzeRoutes()\n}\n\nexport async function quickEnterpriseAudit(apiDir?: string): Promise<ApiAnalysisResult> {\n const analyzer = createEnterpriseAnalyzer({ apiDir })\n return analyzer.analyzeRoutes()\n}"],"mappings":"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","names":[]}