@fairfox/polly 0.7.2 → 0.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/background/index.d.ts +1 -1
- package/dist/src/background/index.js +10 -3
- package/dist/src/background/index.js.map +9 -9
- package/dist/src/background/message-router.js +10 -3
- package/dist/src/background/message-router.js.map +8 -8
- package/dist/src/index.d.ts +9 -9
- package/dist/src/index.js +74 -67
- package/dist/src/index.js.map +12 -12
- package/dist/src/shared/adapters/chrome/context-menus.chrome.d.ts +1 -1
- package/dist/src/shared/adapters/chrome/tabs.chrome.d.ts +2 -2
- package/dist/src/shared/adapters/context-menus.adapter.d.ts +1 -1
- package/dist/src/shared/adapters/index.d.ts +4 -4
- package/dist/src/shared/adapters/index.js +9 -2
- package/dist/src/shared/adapters/index.js.map +6 -6
- package/dist/src/shared/adapters/tabs.adapter.d.ts +2 -2
- package/dist/src/shared/lib/context-helpers.js +10 -3
- package/dist/src/shared/lib/context-helpers.js.map +8 -8
- package/dist/src/shared/lib/message-bus.js +10 -3
- package/dist/src/shared/lib/message-bus.js.map +7 -7
- package/dist/src/shared/lib/state.js +10 -3
- package/dist/src/shared/lib/state.js.map +8 -8
- package/dist/src/shared/state/app-state.js +10 -3
- package/dist/src/shared/state/app-state.js.map +8 -8
- package/dist/tools/init/src/cli.js +17 -2
- package/dist/tools/init/src/cli.js.map +4 -4
- package/dist/tools/init/templates/pwa/package.json.template +3 -3
- package/dist/tools/teach/src/cli.js +2712 -2442
- package/dist/tools/teach/src/cli.js.map +11 -11
- package/dist/tools/teach/src/index.js +1379 -1379
- package/dist/tools/teach/src/index.js.map +10 -10
- package/dist/tools/test/src/adapters/index.d.ts +8 -8
- package/dist/tools/test/src/adapters/index.js +3 -2
- package/dist/tools/test/src/adapters/index.js.map +6 -6
- package/dist/tools/test/src/index.d.ts +3 -3
- package/dist/tools/test/src/index.js +3 -2
- package/dist/tools/test/src/index.js.map +6 -6
- package/dist/tools/verify/src/cli.js +142 -41
- package/dist/tools/verify/src/cli.js.map +8 -8
- package/dist/tools/visualize/src/cli.js +18 -3
- package/dist/tools/visualize/src/cli.js.map +4 -4
- package/package.json +26 -15
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../tools/analysis/src/extract/project-detector.ts", "../tools/analysis/src/extract/
|
|
3
|
+
"sources": ["../tools/analysis/src/extract/project-detector.ts", "../tools/analysis/src/extract/adr.ts", "../tools/analysis/src/extract/architecture.ts", "../tools/analysis/src/extract/contexts.ts", "../tools/analysis/src/extract/flows.ts", "../tools/analysis/src/extract/handlers.ts", "../tools/analysis/src/extract/relationships.ts", "../tools/analysis/src/extract/integrations.ts", "../tools/analysis/src/extract/manifest.ts", "../tools/analysis/src/extract/index.ts", "../tools/analysis/src/extract/types.ts", "../tools/visualize/src/types/structurizr.ts", "../tools/visualize/src/codegen/structurizr.ts", "../tools/teach/src/cli.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"// Project type detection and configuration\n// Detects project type and infers entry points from tsconfig.json, package.json, etc.\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { ProjectConfig } from \"../types/architecture\";\n\n/**\n * Detect project type and generate configuration\n * Falls back to tsconfig.json when manifest.json is not available\n */\nexport class ProjectDetector {\n private projectRoot: string;\n\n constructor(projectRoot: string) {\n this.projectRoot = projectRoot;\n }\n\n /**\n * Detect project type and return configuration\n */\n detect(): ProjectConfig {\n // Check for Chrome extension manifest\n const manifestPath = path.join(this.projectRoot, \"manifest.json\");\n if (fs.existsSync(manifestPath)) {\n return this.detectChromeExtension(manifestPath);\n }\n\n // Check for PWA manifest\n const pwaManifestPath = path.join(this.projectRoot, \"public\", \"manifest.json\");\n if (fs.existsSync(pwaManifestPath)) {\n return this.detectPWA(pwaManifestPath);\n }\n\n // Check for Electron\n const packageJsonPath = path.join(this.projectRoot, \"package.json\");\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n\n if (packageJson.dependencies?.electron || packageJson.devDependencies?.electron) {\n return this.detectElectron(packageJson);\n }\n\n // Check for WebSocket/server patterns in dependencies\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n if (\n deps?.ws ||\n deps?.[\"socket.io\"] ||\n deps?.elysia ||\n deps?.express ||\n deps?.fastify ||\n deps?.hono ||\n deps?.koa\n ) {\n return this.detectWebSocketApp(packageJson);\n }\n\n // Also check with content analysis even without explicit dependencies\n // (Bun has built-in WebSocket support, no dependencies needed)\n const serverResult = this.detectWebSocketApp(packageJson);\n if (Object.keys(serverResult.entryPoints).length > 0) {\n return serverResult;\n }\n } else {\n // No package.json - try WebSocket/server detection anyway\n const serverResult = this.detectWebSocketApp({});\n if (Object.keys(serverResult.entryPoints).length > 0) {\n return serverResult;\n }\n }\n\n // Fallback: Generic TypeScript project\n return this.detectGenericProject();\n }\n\n /**\n * Detect Chrome extension from manifest.json\n */\n private detectChromeExtension(manifestPath: string): ProjectConfig {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, \"utf-8\"));\n const entryPoints: Record<string, string> = {};\n\n this.detectBackgroundEntry(manifest, entryPoints);\n this.detectContentScriptEntry(manifest, entryPoints);\n this.detectPopupEntry(manifest, entryPoints);\n this.detectOptionsEntry(manifest, entryPoints);\n\n return {\n type: \"chrome-extension\",\n entryPoints,\n metadata: {\n name: manifest.name,\n version: manifest.version,\n description: manifest.description,\n },\n };\n }\n\n /**\n * Detect background script entry point\n */\n private detectBackgroundEntry(\n manifest: Record<string, unknown>,\n entryPoints: Record<string, string>\n ): void {\n const background = manifest.background;\n if (!background) return;\n\n const file = background.service_worker || background.scripts?.[0] || background.page;\n if (file) {\n entryPoints[\"background\"] = this.findSourceFile(file);\n }\n }\n\n /**\n * Detect content script entry point\n */\n private detectContentScriptEntry(\n manifest: Record<string, unknown>,\n entryPoints: Record<string, string>\n ): void {\n const contentScripts = manifest.content_scripts;\n if (!contentScripts || contentScripts.length === 0) return;\n\n const firstScript = contentScripts[0].js?.[0];\n if (firstScript) {\n entryPoints[\"content\"] = this.findSourceFile(firstScript);\n }\n }\n\n /**\n * Detect popup entry point\n */\n private detectPopupEntry(\n manifest: Record<string, unknown>,\n entryPoints: Record<string, string>\n ): void {\n const popup = manifest.action?.default_popup || manifest.browser_action?.default_popup;\n if (!popup) return;\n\n const jsFile = this.findAssociatedJS(path.join(this.projectRoot, popup));\n if (jsFile) {\n entryPoints[\"popup\"] = jsFile;\n }\n }\n\n /**\n * Detect options page entry point\n */\n private detectOptionsEntry(\n manifest: Record<string, unknown>,\n entryPoints: Record<string, string>\n ): void {\n const options = manifest.options_ui?.page || manifest.options_page;\n if (!options) return;\n\n const jsFile = this.findAssociatedJS(path.join(this.projectRoot, options));\n if (jsFile) {\n entryPoints[\"options\"] = jsFile;\n }\n }\n\n /**\n * Detect PWA from manifest.json\n */\n private detectPWA(manifestPath: string): ProjectConfig {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, \"utf-8\"));\n const entryPoints: Record<string, string> = {};\n\n // Look for service worker\n const swCandidates = [\n \"src/service-worker.ts\",\n \"src/sw.ts\",\n \"public/service-worker.js\",\n \"public/sw.js\",\n ];\n\n for (const candidate of swCandidates) {\n const fullPath = path.join(this.projectRoot, candidate);\n if (fs.existsSync(fullPath)) {\n entryPoints[\"worker\"] = fullPath;\n break;\n }\n }\n\n // Look for main client entry\n const clientCandidates = [\n \"src/main.ts\",\n \"src/index.ts\",\n \"src/app.ts\",\n \"src/main.tsx\",\n \"src/index.tsx\",\n ];\n\n for (const candidate of clientCandidates) {\n const fullPath = path.join(this.projectRoot, candidate);\n if (fs.existsSync(fullPath)) {\n entryPoints[\"client\"] = fullPath;\n break;\n }\n }\n\n return {\n type: \"pwa\",\n entryPoints,\n contextMapping: {\n worker: \"Service Worker\",\n client: \"Client App\",\n },\n metadata: {\n name: manifest.name || manifest.short_name,\n version: \"1.0.0\",\n description: manifest.description,\n },\n };\n }\n\n /**\n * Detect Electron app\n */\n private detectElectron(packageJson: Record<string, unknown>): ProjectConfig {\n const entryPoints: Record<string, string> = {};\n\n // Main process\n const mainCandidates = [\n packageJson.main,\n \"src/main/index.ts\",\n \"src/electron/main.ts\",\n \"electron/main.ts\",\n \"main.ts\",\n ].filter((x): x is string => Boolean(x));\n\n for (const candidate of mainCandidates) {\n const fullPath = path.join(this.projectRoot, candidate);\n if (fs.existsSync(fullPath) || fs.existsSync(fullPath.replace(/\\.js$/, \".ts\"))) {\n entryPoints[\"main\"] = fs.existsSync(fullPath) ? fullPath : fullPath.replace(/\\.js$/, \".ts\");\n break;\n }\n }\n\n // Renderer process\n const rendererCandidates = [\n \"src/renderer/index.tsx\",\n \"src/renderer/index.ts\",\n \"src/index.tsx\",\n \"src/index.ts\",\n ];\n\n for (const candidate of rendererCandidates) {\n const fullPath = path.join(this.projectRoot, candidate);\n if (fs.existsSync(fullPath)) {\n entryPoints[\"renderer\"] = fullPath;\n break;\n }\n }\n\n return {\n type: \"electron\",\n entryPoints,\n contextMapping: {\n main: \"Main Process\",\n renderer: \"Renderer Process\",\n },\n metadata: {\n name: packageJson.name,\n version: packageJson.version,\n description: packageJson.description,\n },\n };\n }\n\n /**\n * Detect WebSocket/server app with content analysis and confidence scoring\n */\n private detectWebSocketApp(packageJson: Record<string, unknown>): ProjectConfig {\n const entryPoints: Record<string, string> = {};\n const contextMapping: Record<string, string> = {};\n\n // Server entry point with content analysis\n const serverCandidates = [\n \"src/server.ts\",\n \"src/server.js\",\n \"src/index.ts\",\n \"src/index.js\",\n \"src/main.ts\",\n \"src/main.js\",\n \"src/app.ts\",\n \"src/app.js\",\n \"server.ts\",\n \"server.js\",\n \"index.ts\",\n \"index.js\",\n ];\n\n const scoredServers = this.scoreServerCandidates(serverCandidates);\n if (scoredServers.length > 0) {\n const best = scoredServers[0];\n if (best) {\n entryPoints[\"server\"] = best.path;\n\n // Add context based on detected frameworks\n if (best.hasWebSocket) {\n contextMapping[\"server\"] = \"WebSocket Server\";\n } else if (best.hasHTTP) {\n contextMapping[\"server\"] = \"HTTP Server\";\n } else {\n contextMapping[\"server\"] = \"Server\";\n }\n }\n }\n\n // Client entry point (if exists)\n const clientCandidates = [\n \"src/client/index.ts\",\n \"src/client/index.js\",\n \"src/client.ts\",\n \"src/client.js\",\n \"client/index.ts\",\n \"client/index.js\",\n ];\n\n for (const candidate of clientCandidates) {\n const fullPath = path.join(this.projectRoot, candidate);\n if (fs.existsSync(fullPath)) {\n entryPoints[\"client\"] = fullPath;\n contextMapping[\"client\"] = \"Client\";\n break;\n }\n }\n\n return {\n type: \"websocket-app\",\n entryPoints,\n contextMapping:\n Object.keys(contextMapping).length > 0\n ? contextMapping\n : {\n server: \"Server\",\n client: \"Client\",\n },\n metadata: {\n name: packageJson.name,\n version: packageJson.version,\n description: packageJson.description,\n },\n };\n }\n\n /**\n * Score server candidates based on content analysis\n * Returns sorted array with highest confidence first\n */\n private scoreServerCandidates(candidates: string[]): Array<{\n path: string;\n score: number;\n hasWebSocket: boolean;\n hasHTTP: boolean;\n framework: string | null;\n }> {\n const scored: Array<{\n path: string;\n score: number;\n hasWebSocket: boolean;\n hasHTTP: boolean;\n framework: string | null;\n }> = [];\n\n for (const candidate of candidates) {\n const fullPath = path.join(this.projectRoot, candidate);\n if (!fs.existsSync(fullPath)) continue;\n\n try {\n const content = fs.readFileSync(fullPath, \"utf-8\");\n const analysis = this.analyzeServerCandidate(content, candidate);\n\n if (analysis.score > 0) {\n scored.push({\n path: fullPath,\n score: analysis.score,\n hasWebSocket: analysis.hasWebSocket,\n hasHTTP: analysis.hasHTTP,\n framework: analysis.framework,\n });\n }\n } catch (_error) {\n // Ignore file read errors for candidates that don't exist\n }\n }\n\n // Sort by score descending\n return scored.sort((a, b) => b.score - a.score);\n }\n\n /**\n * Analyze server candidate content and return scoring details\n */\n private analyzeServerCandidate(\n content: string,\n candidate: string\n ): {\n score: number;\n hasWebSocket: boolean;\n hasHTTP: boolean;\n framework: string | null;\n } {\n const patterns = this.getServerPatterns();\n const frameworkAnalysis = this.detectFrameworksInContent(content, patterns);\n\n const entryPointScore = this.scoreEntryPointIndicators(content);\n const fileNameScore = this.scoreFileName(candidate);\n\n return {\n score: frameworkAnalysis.score + entryPointScore + fileNameScore,\n hasWebSocket: frameworkAnalysis.hasWebSocket,\n hasHTTP: frameworkAnalysis.hasHTTP,\n framework: frameworkAnalysis.framework,\n };\n }\n\n /**\n * Get regex patterns for server framework detection\n */\n private getServerPatterns() {\n return {\n // Bun WebSocket server\n bunWebSocket: /Bun\\.serve\\s*\\([^)]*websocket\\s*:/i,\n bunHTTP: /Bun\\.serve\\s*\\(/i,\n\n // Node ws library\n wsServer: /new\\s+WebSocket\\.Server/i,\n wsImport: /from\\s+['\"]ws['\"]/,\n\n // Socket.io\n socketIO: /io\\s*\\(|require\\s*\\(\\s*['\"]socket\\.io['\"]\\s*\\)/i,\n\n // Elysia\n elysia: /new\\s+Elysia\\s*\\(|\\.ws\\s*\\(/i,\n elysiaImport: /from\\s+['\"]elysia['\"]/,\n\n // Express\n express: /express\\s*\\(\\)|app\\.listen/i,\n expressWs: /expressWs\\s*\\(/i,\n\n // Generic HTTP server\n httpServer: /createServer|app\\.listen|server\\.listen/i,\n\n // Generic WebSocket patterns\n webSocket: /WebSocket|websocket|\\.ws\\s*\\(|wss\\s*:/i,\n };\n }\n\n /**\n * Detect frameworks in content and calculate score\n */\n private detectFrameworksInContent(\n content: string,\n patterns: ReturnType<typeof this.getServerPatterns>\n ): {\n score: number;\n hasWebSocket: boolean;\n hasHTTP: boolean;\n framework: string | null;\n } {\n let score = 0;\n let hasWebSocket = false;\n let hasHTTP = false;\n let framework: string | null = null;\n\n const bunScore = this.scoreBunFramework(content, patterns);\n score += bunScore.score;\n hasWebSocket = hasWebSocket || bunScore.hasWebSocket;\n hasHTTP = hasHTTP || bunScore.hasHTTP;\n framework = framework || bunScore.framework;\n\n const wsScore = this.scoreWebSocketLibraries(content, patterns);\n score += wsScore.score;\n hasWebSocket = hasWebSocket || wsScore.hasWebSocket;\n framework = framework || wsScore.framework;\n\n const httpScore = this.scoreHTTPFrameworks(content, patterns);\n score += httpScore.score;\n hasWebSocket = hasWebSocket || httpScore.hasWebSocket;\n hasHTTP = hasHTTP || httpScore.hasHTTP;\n framework = framework || httpScore.framework;\n\n const genericScore = this.scoreGenericPatterns(content, patterns, hasWebSocket, hasHTTP);\n score += genericScore.score;\n hasWebSocket = hasWebSocket || genericScore.hasWebSocket;\n hasHTTP = hasHTTP || genericScore.hasHTTP;\n\n return { score, hasWebSocket, hasHTTP, framework };\n }\n\n /**\n * Score Bun framework patterns\n */\n private scoreBunFramework(\n content: string,\n patterns: ReturnType<typeof this.getServerPatterns>\n ): {\n score: number;\n hasWebSocket: boolean;\n hasHTTP: boolean;\n framework: string | null;\n } {\n if (patterns.bunWebSocket.test(content)) {\n return { score: 15, hasWebSocket: true, hasHTTP: true, framework: \"Bun\" };\n }\n\n if (patterns.bunHTTP.test(content)) {\n return { score: 10, hasWebSocket: false, hasHTTP: true, framework: \"Bun\" };\n }\n\n return { score: 0, hasWebSocket: false, hasHTTP: false, framework: null };\n }\n\n /**\n * Score WebSocket library patterns\n */\n private scoreWebSocketLibraries(\n content: string,\n patterns: ReturnType<typeof this.getServerPatterns>\n ): {\n score: number;\n hasWebSocket: boolean;\n framework: string | null;\n } {\n let score = 0;\n let hasWebSocket = false;\n let framework: string | null = null;\n\n if (patterns.wsServer.test(content) || patterns.wsImport.test(content)) {\n score += 12;\n hasWebSocket = true;\n framework = \"ws\";\n }\n\n if (patterns.socketIO.test(content)) {\n score += 12;\n hasWebSocket = true;\n framework = framework || \"socket.io\";\n }\n\n return { score, hasWebSocket, framework };\n }\n\n /**\n * Score HTTP framework patterns\n */\n private scoreHTTPFrameworks(\n content: string,\n patterns: ReturnType<typeof this.getServerPatterns>\n ): {\n score: number;\n hasWebSocket: boolean;\n hasHTTP: boolean;\n framework: string | null;\n } {\n let score = 0;\n let hasWebSocket = false;\n let hasHTTP = false;\n let framework: string | null = null;\n\n if (patterns.elysia.test(content) || patterns.elysiaImport.test(content)) {\n score += 10;\n hasHTTP = true;\n framework = \"Elysia\";\n }\n\n if (patterns.elysiaImport.test(content) && patterns.webSocket.test(content)) {\n score += 8;\n hasWebSocket = true;\n }\n\n if (patterns.express.test(content)) {\n score += 8;\n hasHTTP = true;\n framework = framework || \"Express\";\n }\n\n if (patterns.expressWs.test(content)) {\n score += 5;\n hasWebSocket = true;\n }\n\n return { score, hasWebSocket, hasHTTP, framework };\n }\n\n /**\n * Score generic server patterns\n */\n private scoreGenericPatterns(\n content: string,\n patterns: ReturnType<typeof this.getServerPatterns>,\n hasWebSocket: boolean,\n hasHTTP: boolean\n ): {\n score: number;\n hasWebSocket: boolean;\n hasHTTP: boolean;\n } {\n let score = 0;\n let newHasWebSocket = hasWebSocket;\n let newHasHTTP = hasHTTP;\n\n if (patterns.httpServer.test(content) && !hasHTTP) {\n score += 5;\n newHasHTTP = true;\n }\n\n if (patterns.webSocket.test(content) && !hasWebSocket) {\n score += 3;\n newHasWebSocket = true;\n }\n\n return { score, hasWebSocket: newHasWebSocket, hasHTTP: newHasHTTP };\n }\n\n /**\n * Score entry point indicators in content\n */\n private scoreEntryPointIndicators(content: string): number {\n let score = 0;\n\n if (/\\.listen\\s*\\(/.test(content)) {\n score += 5;\n }\n\n if (/export\\s+default/.test(content)) {\n score += 3;\n }\n\n return score;\n }\n\n /**\n * Score based on file name patterns\n */\n private scoreFileName(candidate: string): number {\n let score = 0;\n\n if (candidate.includes(\"server\")) {\n score += 3;\n }\n\n if (candidate === \"src/index.ts\" || candidate === \"src/index.js\") {\n score += 2;\n }\n\n return score;\n }\n\n /**\n * Fallback: Generic TypeScript project\n * Uses tsconfig.json to find entry points\n */\n private detectGenericProject(): ProjectConfig {\n const entryPoints: Record<string, string> = {};\n\n // Try to find tsconfig.json\n const tsConfigPath = path.join(this.projectRoot, \"tsconfig.json\");\n if (fs.existsSync(tsConfigPath)) {\n try {\n const tsConfig = JSON.parse(fs.readFileSync(tsConfigPath, \"utf-8\"));\n\n // Check for entry points in various locations\n if (tsConfig.files && Array.isArray(tsConfig.files)) {\n tsConfig.files.forEach((file: string, idx: number) => {\n const fullPath = path.join(this.projectRoot, file);\n if (fs.existsSync(fullPath)) {\n entryPoints[`module${idx + 1}`] = fullPath;\n }\n });\n }\n } catch (_error) {\n // Ignore tsconfig.json parse errors\n }\n }\n\n // If no entry points found, scan src directory\n if (Object.keys(entryPoints).length === 0) {\n const commonEntries = [\"src/index.ts\", \"src/main.ts\", \"src/app.ts\", \"index.ts\", \"main.ts\"];\n\n for (const candidate of commonEntries) {\n const fullPath = path.join(this.projectRoot, candidate);\n if (fs.existsSync(fullPath)) {\n entryPoints[\"main\"] = fullPath;\n break;\n }\n }\n }\n\n // Get metadata from package.json\n const packageJsonPath = path.join(this.projectRoot, \"package.json\");\n let metadata: ProjectConfig[\"metadata\"] = { name: \"Unknown Project\" };\n\n if (fs.existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n metadata = {\n name: packageJson.name,\n version: packageJson.version,\n description: packageJson.description,\n };\n } catch (_error) {\n // Ignore package.json parse errors\n }\n }\n\n return {\n type: \"generic\",\n entryPoints,\n metadata,\n };\n }\n\n /**\n * Find source file from manifest reference\n */\n private findSourceFile(manifestPath: string): string {\n const candidates = [\n path.join(this.projectRoot, manifestPath),\n path.join(this.projectRoot, manifestPath.replace(/\\.js$/, \".ts\")),\n path.join(this.projectRoot, \"src\", manifestPath),\n path.join(this.projectRoot, \"src\", manifestPath.replace(/\\.js$/, \".ts\")),\n path.join(this.projectRoot, \"src\", manifestPath.replace(/\\.js$/, \".tsx\")),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return path.join(this.projectRoot, manifestPath);\n }\n\n /**\n * Find associated JavaScript/TypeScript file for an HTML file\n */\n private findAssociatedJS(htmlPath: string): string | null {\n if (!fs.existsSync(htmlPath)) {\n return null;\n }\n\n // Read HTML and look for script tags\n const html = fs.readFileSync(htmlPath, \"utf-8\");\n const scriptMatch = html.match(/<script[^>]+src=[\"']([^\"']+)[\"']/i);\n\n if (scriptMatch?.[1]) {\n const scriptPath = scriptMatch[1];\n const fullPath = path.resolve(path.dirname(htmlPath), scriptPath);\n\n if (fs.existsSync(fullPath)) return fullPath;\n if (fs.existsSync(fullPath.replace(/\\.js$/, \".ts\"))) {\n return fullPath.replace(/\\.js$/, \".ts\");\n }\n if (fs.existsSync(fullPath.replace(/\\.js$/, \".tsx\"))) {\n return fullPath.replace(/\\.js$/, \".tsx\");\n }\n }\n\n // Fallback: convention-based files\n const baseName = path.basename(htmlPath, \".html\");\n const dir = path.dirname(htmlPath);\n\n const candidates = [\n path.join(dir, `${baseName}.ts`),\n path.join(dir, `${baseName}.tsx`),\n path.join(dir, `${baseName}.js`),\n path.join(dir, \"index.ts\"),\n path.join(dir, \"index.tsx\"),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n }\n}\n\n/**\n * Detect project configuration from project root\n */\nexport function detectProjectConfig(projectRoot: string): ProjectConfig {\n const detector = new ProjectDetector(projectRoot);\n return detector.detect();\n}\n",
|
|
6
|
-
"// Type extraction from TypeScript using ts-morph\n\nimport { Project, type SourceFile, type Type } from \"ts-morph\";\nimport type { CodebaseAnalysis, FieldAnalysis, TypeInfo } from \"../types\";\nimport { HandlerExtractor } from \"./handlers\";\n\nexport class TypeExtractor {\n private project: Project;\n\n constructor(tsConfigPath: string) {\n this.project = new Project({\n tsConfigFilePath: tsConfigPath,\n });\n }\n\n /**\n * Analyze the codebase and extract state types and message types\n */\n async analyzeCodebase(stateFilePath?: string): Promise<CodebaseAnalysis> {\n // Find state type\n const stateType = stateFilePath ? this.extractStateType(stateFilePath) : this.findStateType();\n\n // Find message types\n const messageTypes = this.findMessageTypes();\n\n // Analyze fields\n const fields = stateType ? this.analyzeFields(stateType) : [];\n\n // Extract message handlers\n const handlerAnalysis = this.extractHandlerAnalysis();\n\n // Filter message types and handlers to only include valid TLA+ identifiers\n const validMessageTypes = this.filterAndLogMessageTypes(\n messageTypes,\n handlerAnalysis.messageTypes\n );\n const validHandlers = this.filterAndLogHandlers(handlerAnalysis.handlers);\n\n return {\n stateType,\n messageTypes: validMessageTypes,\n fields,\n handlers: validHandlers,\n };\n }\n\n /**\n * Extract handler analysis from the project\n */\n private extractHandlerAnalysis() {\n const configFilePath = this.project.getCompilerOptions()[\"configFilePath\"];\n const tsConfigPath = typeof configFilePath === \"string\" ? configFilePath : \"tsconfig.json\";\n const handlerExtractor = new HandlerExtractor(tsConfigPath);\n return handlerExtractor.extractHandlers();\n }\n\n /**\n * Filter and log message types, keeping only valid TLA+ identifiers\n */\n private filterAndLogMessageTypes(\n messageTypes: string[],\n handlerMessageTypes: Set<string>\n ): string[] {\n const allMessageTypes = Array.from(new Set([...messageTypes, ...handlerMessageTypes]));\n const validMessageTypes: string[] = [];\n const invalidMessageTypes: string[] = [];\n\n for (const msgType of allMessageTypes) {\n if (this.isValidTLAIdentifier(msgType)) {\n validMessageTypes.push(msgType);\n } else {\n invalidMessageTypes.push(msgType);\n }\n }\n\n this.logInvalidMessageTypes(invalidMessageTypes);\n return validMessageTypes;\n }\n\n /**\n * Log warnings about invalid message types\n */\n private logInvalidMessageTypes(invalidMessageTypes: string[]): void {\n if (invalidMessageTypes.length === 0 || !process.env[\"POLLY_DEBUG\"]) return;\n\n console.log(`[WARN] Filtered out ${invalidMessageTypes.length} invalid message type(s):`);\n for (const invalid of invalidMessageTypes) {\n console.log(`[WARN] - \"${invalid}\" (not a valid TLA+ identifier)`);\n }\n }\n\n /**\n * Filter and log handlers, keeping only those with valid TLA+ identifier message types\n */\n private filterAndLogHandlers(\n handlers: Array<{ messageType: string; location: { file: string; line: number } }>\n ) {\n const validHandlers = handlers.filter((h) => this.isValidTLAIdentifier(h.messageType));\n\n this.logInvalidHandlers(handlers, validHandlers);\n return validHandlers;\n }\n\n /**\n * Log warnings about filtered handlers\n */\n private logInvalidHandlers(\n allHandlers: Array<{ messageType: string; location: { file: string; line: number } }>,\n validHandlers: Array<{ messageType: string }>\n ): void {\n const filteredHandlerCount = allHandlers.length - validHandlers.length;\n if (filteredHandlerCount === 0 || !process.env[\"POLLY_DEBUG\"]) return;\n\n console.log(\n `[WARN] Filtered out ${filteredHandlerCount} handler(s) with invalid message types:`\n );\n for (const handler of allHandlers) {\n if (!this.isValidTLAIdentifier(handler.messageType)) {\n console.log(\n `[WARN] - Handler for \"${handler.messageType}\" at ${handler.location.file}:${handler.location.line}`\n );\n }\n }\n }\n\n /**\n * Check if a string is a valid TLA+ identifier\n * TLA+ identifiers must:\n * - Start with a letter (a-zA-Z)\n * - Contain only letters, digits, and underscores\n * - Not be empty\n */\n private isValidTLAIdentifier(s: string): boolean {\n if (!s || s.length === 0) {\n return false;\n }\n // TLA+ identifiers: start with letter, contain only alphanumeric + underscore\n return /^[a-zA-Z][a-zA-Z0-9_]*$/.test(s);\n }\n\n /**\n * Extract state type from a specific file\n */\n private extractStateType(filePath: string): TypeInfo | null {\n const sourceFile = this.project.getSourceFile(filePath);\n if (!sourceFile) {\n return null;\n }\n\n // Look for type alias named \"AppState\" or similar\n const typeAlias =\n sourceFile.getTypeAlias(\"AppState\") ||\n sourceFile.getTypeAlias(\"State\") ||\n sourceFile.getTypeAliases()[0];\n\n if (!typeAlias) {\n return null;\n }\n\n const type = typeAlias.getType();\n return this.convertType(type, typeAlias.getName());\n }\n\n /**\n * Find state type by searching common patterns\n */\n private findStateType(): TypeInfo | null {\n // Search for files with \"state\" in the name\n const stateFiles = this.project.getSourceFiles(\"**/state*.ts\");\n\n for (const file of stateFiles) {\n const typeAlias = file.getTypeAlias(\"AppState\") || file.getTypeAlias(\"State\");\n\n if (typeAlias) {\n const type = typeAlias.getType();\n return this.convertType(type, typeAlias.getName());\n }\n }\n\n return null;\n }\n\n /**\n * Find message types by searching for type unions\n * Handles:\n * - Simple string literal unions\n * - Discriminated unions ({ type: 'foo' } | { type: 'bar' })\n * - Type aliases across files\n * - Template literal types (with warning)\n * - Conditional types (conservatively)\n * - Mapped types\n */\n private findMessageTypes(): string[] {\n const messageTypes: string[] = [];\n const warnings: string[] = [];\n\n // Search for files with \"message\" in the name\n const messageFiles = this.project.getSourceFiles(\"**/message*.ts\");\n\n for (const file of messageFiles) {\n // Look for type aliases that might contain message types\n for (const typeAlias of file.getTypeAliases()) {\n const extractedTypes = this.extractMessageTypesFromType(\n typeAlias.getType(),\n typeAlias.getName(),\n file,\n warnings\n );\n messageTypes.push(...extractedTypes);\n }\n }\n\n // Log warnings about unbounded types\n if (warnings.length > 0 && process.env[\"POLLY_DEBUG\"]) {\n console.log(\"[WARN] Message type extraction warnings:\");\n for (const warning of warnings) {\n console.log(`[WARN] ${warning}`);\n }\n }\n\n return [...new Set(messageTypes)]; // Dedupe\n }\n\n /**\n * Extract message types from a TypeScript type\n * Recursively handles unions, discriminated unions, aliases, etc.\n */\n private extractMessageTypesFromType(\n type: Type,\n typeName: string,\n sourceFile: SourceFile,\n warnings: string[]\n ): string[] {\n if (type.isUnion()) {\n return this.extractFromUnionType(type, typeName, sourceFile, warnings);\n }\n\n if (type.getAliasSymbol()) {\n return this.extractFromTypeAlias(type, typeName, sourceFile, warnings);\n }\n\n if (type.isConditionalType?.()) {\n return this.extractFromConditionalType(type, warnings);\n }\n\n if (type.getText().includes(\"[K in \")) {\n return this.extractFromMappedType(type, sourceFile, warnings);\n }\n\n if (type.getText().includes(\"`\")) {\n this.warnTemplateLiteral(type, warnings);\n return [];\n }\n\n return [];\n }\n\n /**\n * Extract message types from union type\n */\n private extractFromUnionType(\n type: Type,\n typeName: string,\n sourceFile: SourceFile,\n warnings: string[]\n ): string[] {\n const messageTypes: string[] = [];\n const unionTypes = type.getUnionTypes();\n\n for (const unionType of unionTypes) {\n const extracted = this.extractFromUnionMember(unionType, typeName, sourceFile, warnings);\n messageTypes.push(...extracted);\n }\n\n return messageTypes;\n }\n\n /**\n * Extract message types from a single union member\n */\n private extractFromUnionMember(\n unionType: Type,\n typeName: string,\n sourceFile: SourceFile,\n warnings: string[]\n ): string[] {\n if (unionType.isObject()) {\n return this.extractFromDiscriminatedUnion(unionType, sourceFile, warnings);\n }\n\n if (unionType.isStringLiteral()) {\n return [unionType.getLiteralValue() as string];\n }\n\n if (unionType.getAliasSymbol()) {\n const aliasedType = unionType.getAliasSymbol()?.getDeclaredType();\n if (aliasedType) {\n return this.extractMessageTypesFromType(aliasedType, typeName, sourceFile, warnings);\n }\n }\n\n return [];\n }\n\n /**\n * Extract message types from discriminated union\n */\n private extractFromDiscriminatedUnion(\n unionType: Type,\n sourceFile: SourceFile,\n warnings: string[]\n ): string[] {\n const typeProperty = unionType.getProperty(\"type\");\n if (!typeProperty) {\n return [];\n }\n\n const typeType = typeProperty.getTypeAtLocation(sourceFile);\n\n if (typeType.isStringLiteral()) {\n return [typeType.getLiteralValue() as string];\n }\n\n if (typeType.getText().includes(\"`\")) {\n warnings.push(\n `Template literal type in discriminant: ${typeType.getText()} - may be unbounded`\n );\n }\n\n return [];\n }\n\n /**\n * Extract message types from type alias\n */\n private extractFromTypeAlias(\n type: Type,\n typeName: string,\n sourceFile: SourceFile,\n warnings: string[]\n ): string[] {\n const aliasedType = type.getAliasSymbol()?.getDeclaredType();\n if (!aliasedType || aliasedType === type) {\n return [];\n }\n\n return this.extractMessageTypesFromType(aliasedType, typeName, sourceFile, warnings);\n }\n\n /**\n * Extract message types from conditional type\n */\n private extractFromConditionalType(type: Type, warnings: string[]): string[] {\n warnings.push(`Conditional type detected: ${type.getText()} - extracting conservatively`);\n\n const messageTypes: string[] = [];\n const typeText = type.getText();\n const parts = typeText.split(\"?\");\n\n if (parts.length < 2) {\n return messageTypes;\n }\n\n const branches = parts[1].split(\":\");\n for (const branch of branches) {\n const extracted = this.extractStringLiteralFromBranch(branch);\n if (extracted) {\n messageTypes.push(extracted);\n }\n }\n\n return messageTypes;\n }\n\n /**\n * Extract string literal from conditional branch\n */\n private extractStringLiteralFromBranch(branch: string): string | null {\n const trimmed = branch.trim();\n const match = trimmed.match(/^[\"'](\\w+)[\"']$/);\n return match?.[1] ?? null;\n }\n\n /**\n * Extract message types from mapped type\n */\n private extractFromMappedType(type: Type, sourceFile: SourceFile, warnings: string[]): string[] {\n warnings.push(`Mapped type detected: ${type.getText()} - attempting to extract keys`);\n\n const match = type.getText().match(/\\[K in ([^\\]]+)\\]/);\n if (!match?.[1]) {\n return [];\n }\n\n const keyTypeName = match[1].trim();\n const keyTypeAlias = sourceFile.getTypeAlias?.(keyTypeName);\n\n if (!keyTypeAlias) {\n return [];\n }\n\n const keyType = keyTypeAlias.getType();\n return this.extractMessageTypesFromType(keyType, keyTypeName, sourceFile, warnings);\n }\n\n /**\n * Warn about template literal types\n */\n private warnTemplateLiteral(type: Type, warnings: string[]): void {\n warnings.push(\n `Template literal type: ${type.getText()} - this creates an unbounded set and cannot be fully extracted`\n );\n }\n\n /**\n * Convert ts-morph Type to our TypeInfo\n */\n private convertType(type: Type, name: string): TypeInfo {\n const nullable = type.isNullable();\n\n if (type.isBoolean() || type.isBooleanLiteral()) {\n return { name, kind: \"boolean\", nullable };\n }\n\n if (type.isUnion()) {\n return this.convertUnionType(type, name, nullable);\n }\n\n if (type.isString() || type.isStringLiteral()) {\n return { name, kind: \"string\", nullable };\n }\n\n if (type.isNumber() || type.isNumberLiteral()) {\n return { name, kind: \"number\", nullable };\n }\n\n if (type.isArray()) {\n return this.convertArrayType(type, name, nullable);\n }\n\n const collectionType = this.tryConvertCollectionType(type, name, nullable);\n if (collectionType) {\n return collectionType;\n }\n\n if (type.isObject()) {\n return this.convertObjectType(type, name, nullable);\n }\n\n if (type.isNull()) {\n return { name, kind: \"null\", nullable: true };\n }\n\n return { name, kind: \"unknown\", nullable };\n }\n\n /**\n * Convert union type to TypeInfo\n */\n private convertUnionType(type: Type, name: string, nullable: boolean): TypeInfo {\n const unionTypes = type.getUnionTypes();\n\n // Check for string literal union (enum)\n const allStringLiterals = unionTypes.every((t) => t.isStringLiteral());\n if (allStringLiterals) {\n const enumValues = unionTypes.map((t) => t.getLiteralValue() as string);\n return { name, kind: \"enum\", nullable, enumValues };\n }\n\n // Check for nullable type (T | null | undefined)\n const nonNullTypes = unionTypes.filter((t) => !t.isNull() && !t.isUndefined());\n\n if (nonNullTypes.length === 1) {\n const firstType = nonNullTypes[0];\n if (firstType) {\n const baseType = this.convertType(firstType, name);\n return { ...baseType, nullable: true };\n }\n }\n\n // Generic union\n return {\n name,\n kind: \"union\",\n nullable,\n unionTypes: unionTypes.map((t, i) => this.convertType(t, `${name}_${i}`)),\n };\n }\n\n /**\n * Convert array type to TypeInfo\n */\n private convertArrayType(type: Type, name: string, nullable: boolean): TypeInfo {\n const elementType = type.getArrayElementType();\n return {\n name,\n kind: \"array\",\n nullable,\n elementType: elementType\n ? this.convertType(elementType, `${name}_element`)\n : { name: \"unknown\", kind: \"unknown\", nullable: false },\n };\n }\n\n /**\n * Try to convert Map or Set type to TypeInfo\n */\n private tryConvertCollectionType(type: Type, name: string, nullable: boolean): TypeInfo | null {\n const symbol = type.getSymbol();\n if (!symbol) return null;\n\n const symbolName = symbol.getName();\n\n if (symbolName === \"Map\") {\n const typeArgs = type.getTypeArguments();\n return {\n name,\n kind: \"map\",\n nullable,\n valueType: typeArgs?.[1] ? this.convertType(typeArgs[1], `${name}_value`) : undefined,\n };\n }\n\n if (symbolName === \"Set\") {\n const typeArgs = type.getTypeArguments();\n return {\n name,\n kind: \"set\",\n nullable,\n elementType: typeArgs?.[0] ? this.convertType(typeArgs[0], `${name}_element`) : undefined,\n };\n }\n\n return null;\n }\n\n /**\n * Convert object type to TypeInfo\n */\n private convertObjectType(type: Type, name: string, nullable: boolean): TypeInfo {\n const properties: Record<string, TypeInfo> = {};\n const sourceFile = this.project.getSourceFiles()[0];\n\n if (sourceFile) {\n for (const prop of type.getProperties()) {\n const propName = prop.getName();\n const propType = prop.getTypeAtLocation(sourceFile);\n properties[propName] = this.convertType(propType, propName);\n }\n }\n\n return { name, kind: \"object\", nullable, properties };\n }\n\n /**\n * Analyze fields and determine confidence/bounds\n */\n private analyzeFields(stateType: TypeInfo, prefix = \"\"): FieldAnalysis[] {\n const fields: FieldAnalysis[] = [];\n\n if (stateType.kind === \"object\" && stateType.properties) {\n for (const [key, propType] of Object.entries(stateType.properties)) {\n const path = prefix ? `${prefix}.${key}` : key;\n\n // Recursively analyze nested objects (but not Map/Set - they're leaf nodes)\n if (propType.kind === \"object\") {\n // Don't add intermediate objects as fields, just recurse into them\n fields.push(...this.analyzeFields(propType, path));\n } else {\n // This is a leaf field (or Map/Set), add it for configuration\n const analysis = this.analyzeField(path, propType);\n fields.push(analysis);\n }\n }\n }\n\n return fields;\n }\n\n /**\n * Analyze a single field and determine configuration needs\n */\n private analyzeField(path: string, type: TypeInfo): FieldAnalysis {\n const analysis: FieldAnalysis = {\n path,\n type,\n confidence: \"low\",\n evidence: [],\n suggestions: [],\n bounds: {},\n };\n\n if (type.kind === \"boolean\") return this.analyzeBooleanField(analysis);\n if (type.kind === \"enum\") return this.analyzeEnumField(analysis, type);\n if (type.kind === \"array\") return this.analyzeArrayField(analysis);\n if (type.kind === \"number\") return this.analyzeNumberField(analysis);\n if (type.kind === \"string\") return this.analyzeStringField(analysis);\n if (type.kind === \"map\" || type.kind === \"set\") return this.analyzeMapSetField(analysis);\n\n return analysis;\n }\n\n private analyzeBooleanField(analysis: FieldAnalysis): FieldAnalysis {\n analysis.confidence = \"high\";\n analysis.evidence.push(\"Boolean type - auto-configured\");\n return analysis;\n }\n\n private analyzeEnumField(analysis: FieldAnalysis, type: TypeInfo): FieldAnalysis {\n if (type.enumValues) {\n analysis.confidence = \"high\";\n analysis.evidence.push(`Enum with ${type.enumValues.length} values`);\n if (analysis.bounds) {\n analysis.bounds.values = type.enumValues;\n }\n }\n return analysis;\n }\n\n private analyzeArrayField(analysis: FieldAnalysis): FieldAnalysis {\n analysis.confidence = \"low\";\n analysis.suggestions.push(\"Choose maxLength: 5 (fast), 10 (balanced), or 20 (thorough)\");\n if (analysis.bounds) {\n analysis.bounds.maxLength = undefined;\n }\n\n const foundBound = this.findArrayBound();\n if (foundBound && analysis.bounds) {\n analysis.confidence = \"medium\";\n analysis.evidence.push(`Found array check: ${foundBound.evidence}`);\n analysis.bounds.maxLength = foundBound.value;\n }\n\n return analysis;\n }\n\n private analyzeNumberField(analysis: FieldAnalysis): FieldAnalysis {\n analysis.confidence = \"low\";\n analysis.suggestions.push(\"Provide min and max values based on your application logic\");\n if (analysis.bounds) {\n analysis.bounds.min = undefined;\n analysis.bounds.max = undefined;\n }\n\n const foundBound = this.findNumberBound();\n if (foundBound && analysis.bounds) {\n analysis.confidence = \"high\";\n analysis.evidence.push(`Found comparison: ${foundBound.evidence}`);\n analysis.bounds = { ...analysis.bounds, ...foundBound.bounds };\n }\n\n return analysis;\n }\n\n private analyzeStringField(analysis: FieldAnalysis): FieldAnalysis {\n analysis.confidence = \"low\";\n analysis.suggestions.push(\n 'Provide 2-3 example values: [\"value1\", \"value2\", \"value3\"]',\n \"Or use { abstract: true } for symbolic verification\"\n );\n if (analysis.bounds) {\n analysis.bounds.values = undefined;\n }\n return analysis;\n }\n\n private analyzeMapSetField(analysis: FieldAnalysis): FieldAnalysis {\n analysis.confidence = \"low\";\n analysis.suggestions.push(\"Provide maxSize (recommended: 3-5)\");\n if (analysis.bounds) {\n analysis.bounds.maxSize = undefined;\n }\n return analysis;\n }\n\n /**\n * Try to find array bounds by searching for length checks\n */\n private findArrayBound(): { value: number; evidence: string } | null {\n // TODO: Search source code for patterns like:\n // - if (array.length < N)\n // - array.slice(0, N)\n // This would require analyzing the actual usage in code\n return null;\n }\n\n /**\n * Try to find number bounds by searching for comparisons\n */\n private findNumberBound(): { bounds: { min?: number; max?: number }; evidence: string } | null {\n // TODO: Search source code for patterns like:\n // - if (counter < 100)\n // - if (value >= 0 && value <= 100)\n // This would require analyzing the actual usage in code\n return null;\n }\n}\n\nexport async function analyzeCodebase(options: {\n tsConfigPath: string;\n stateFilePath?: string;\n}): Promise<CodebaseAnalysis> {\n const extractor = new TypeExtractor(options.tsConfigPath);\n return extractor.analyzeCodebase(options.stateFilePath);\n}\n",
|
|
7
|
-
"// Handler extraction from TypeScript code\n// Extracts message handlers and their state mutations\n\nimport {\n type ArrowFunction,\n type CallExpression,\n type FunctionExpression,\n type Identifier,\n type IfStatement,\n Node,\n type ObjectLiteralExpression,\n Project,\n type PropertyAccessExpression,\n type SourceFile,\n type Statement,\n type SwitchStatement,\n SyntaxKind,\n type VariableDeclaration,\n} from \"ts-morph\";\nimport type {\n ComponentRelationship,\n MessageHandler,\n StateAssignment,\n VerificationCondition,\n} from \"../types\";\nimport { RelationshipExtractor } from \"./relationships\";\n\nexport interface HandlerAnalysis {\n handlers: MessageHandler[];\n messageTypes: Set<string>;\n}\n\nexport class HandlerExtractor {\n private project: Project;\n private typeGuardCache: WeakMap<SourceFile, Map<string, string>>;\n private relationshipExtractor: RelationshipExtractor;\n\n constructor(tsConfigPath: string) {\n this.project = new Project({\n tsConfigFilePath: tsConfigPath,\n });\n this.typeGuardCache = new WeakMap();\n this.relationshipExtractor = new RelationshipExtractor();\n }\n\n /**\n * Extract all message handlers from the codebase\n */\n extractHandlers(): HandlerAnalysis {\n const handlers: MessageHandler[] = [];\n const messageTypes = new Set<string>();\n const invalidMessageTypes = new Set<string>();\n\n // Find all source files\n const sourceFiles = this.project.getSourceFiles();\n this.debugLogSourceFiles(sourceFiles);\n\n for (const sourceFile of sourceFiles) {\n const fileHandlers = this.extractFromFile(sourceFile);\n handlers.push(...fileHandlers);\n this.categorizeHandlerMessageTypes(fileHandlers, messageTypes, invalidMessageTypes);\n }\n\n this.debugLogExtractionResults(handlers.length, invalidMessageTypes.size);\n\n return {\n handlers,\n messageTypes,\n };\n }\n\n private debugLogSourceFiles(sourceFiles: SourceFile[]): void {\n if (!process.env[\"POLLY_DEBUG\"]) return;\n\n console.log(`[DEBUG] Loaded ${sourceFiles.length} source files`);\n if (sourceFiles.length <= 20) {\n for (const sf of sourceFiles) {\n console.log(`[DEBUG] - ${sf.getFilePath()}`);\n }\n }\n }\n\n private categorizeHandlerMessageTypes(\n handlers: MessageHandler[],\n messageTypes: Set<string>,\n invalidMessageTypes: Set<string>\n ): void {\n for (const handler of handlers) {\n if (this.isValidTLAIdentifier(handler.messageType)) {\n messageTypes.add(handler.messageType);\n } else {\n invalidMessageTypes.add(handler.messageType);\n }\n }\n }\n\n private debugLogExtractionResults(handlerCount: number, invalidCount: number): void {\n if (!process.env[\"POLLY_DEBUG\"]) return;\n\n console.log(`[DEBUG] Total handlers extracted: ${handlerCount}`);\n if (invalidCount > 0) {\n console.log(`[DEBUG] Filtered ${invalidCount} invalid message type(s) from handlers`);\n }\n }\n\n /**\n * Check if a string is a valid TLA+ identifier\n * TLA+ identifiers must:\n * - Start with a letter (a-zA-Z)\n * - Contain only letters, digits, and underscores\n * - Not be empty\n */\n private isValidTLAIdentifier(s: string): boolean {\n if (!s || s.length === 0) {\n return false;\n }\n // TLA+ identifiers: start with letter, contain only alphanumeric + underscore\n return /^[a-zA-Z][a-zA-Z0-9_]*$/.test(s);\n }\n\n /**\n * Extract handlers from a single source file\n */\n private extractFromFile(sourceFile: SourceFile): MessageHandler[] {\n const handlers: MessageHandler[] = [];\n const filePath = sourceFile.getFilePath();\n const context = this.inferContext(filePath);\n\n sourceFile.forEachDescendant((node) => {\n this.processNodeForHandlers(node, context, filePath, handlers);\n });\n\n return handlers;\n }\n\n /**\n * Process a single node to find handler patterns\n */\n private processNodeForHandlers(\n node: Node,\n context: string,\n filePath: string,\n handlers: MessageHandler[]\n ): void {\n if (Node.isCallExpression(node)) {\n this.processCallExpressionHandler(node, context, filePath, handlers);\n }\n\n if (Node.isSwitchStatement(node)) {\n const switchHandlers = this.extractSwitchCaseHandlers(node, context, filePath);\n handlers.push(...switchHandlers);\n }\n\n if (Node.isVariableDeclaration(node)) {\n const mapHandlers = this.extractHandlerMapPattern(node, context, filePath);\n handlers.push(...mapHandlers);\n }\n\n if (Node.isIfStatement(node) && !this.isElseIfStatement(node)) {\n const typeGuardHandlers = this.extractTypeGuardHandlers(node, context, filePath);\n handlers.push(...typeGuardHandlers);\n }\n }\n\n /**\n * Process call expression to find .on() or .addEventListener() handlers\n */\n private processCallExpressionHandler(\n node: CallExpression,\n context: string,\n filePath: string,\n handlers: MessageHandler[]\n ): void {\n const expression = node.getExpression();\n\n if (Node.isPropertyAccessExpression(expression)) {\n const methodName = expression.getName();\n\n if (methodName === \"on\" || methodName === \"addEventListener\") {\n const handler = this.extractHandler(node, context, filePath);\n if (handler) {\n handlers.push(handler);\n }\n }\n }\n }\n\n /**\n * Check if a node is an else-if statement\n */\n private isElseIfStatement(node: Node): boolean {\n const parent = node.getParent();\n return parent !== undefined && Node.isIfStatement(parent);\n }\n\n /**\n * Extract handler details from a .on() call expression\n */\n private extractHandler(\n callExpr: CallExpression,\n context: string,\n filePath: string\n ): MessageHandler | null {\n const args = callExpr.getArguments();\n\n if (args.length < 2) {\n return null;\n }\n\n // First argument should be the message type (string literal)\n const messageTypeArg = args[0];\n let messageType: string | null = null;\n\n if (Node.isStringLiteral(messageTypeArg)) {\n messageType = messageTypeArg.getLiteralValue();\n } else if (Node.isTemplateExpression(messageTypeArg)) {\n // Handle template literals if needed\n messageType = messageTypeArg.getText().replace(/[`'\"]/g, \"\");\n }\n\n if (!messageType) {\n return null;\n }\n\n // Second argument is the handler function\n const handlerArg = args[1];\n const assignments: StateAssignment[] = [];\n const preconditions: VerificationCondition[] = [];\n const postconditions: VerificationCondition[] = [];\n\n // Parse the handler function for state assignments and verification conditions\n if (Node.isArrowFunction(handlerArg) || Node.isFunctionExpression(handlerArg)) {\n this.extractAssignments(handlerArg, assignments);\n this.extractVerificationConditions(handlerArg, preconditions, postconditions);\n\n // Check for async mutations (potential race conditions)\n this.checkAsyncMutations(handlerArg, messageType);\n }\n\n const line = callExpr.getStartLineNumber();\n\n // Extract relationships from handler code\n const sourceFile = callExpr.getSourceFile();\n const handlerName = `${messageType}_handler`;\n let relationships: ComponentRelationship[] | undefined;\n\n if (Node.isArrowFunction(handlerArg) || Node.isFunctionExpression(handlerArg)) {\n const detectedRelationships = this.relationshipExtractor.extractFromHandler(\n handlerArg,\n sourceFile,\n handlerName\n );\n if (detectedRelationships.length > 0) {\n relationships = detectedRelationships;\n }\n }\n\n return {\n messageType,\n node: context, // Renamed from 'context' to 'node' for generalization\n assignments,\n preconditions,\n postconditions,\n location: {\n file: filePath,\n line,\n },\n relationships,\n };\n }\n\n /**\n * Extract state assignments from a handler function\n * Handles:\n * - Simple assignments: state.field = value\n * - Compound operators: state.count += 1\n * - Array mutations: state.items.push(item)\n * - Array indexing: state.items[0] = value\n */\n private extractAssignments(\n funcNode: ArrowFunction | FunctionExpression,\n assignments: StateAssignment[]\n ): void {\n funcNode.forEachDescendant((node: Node) => {\n if (Node.isBinaryExpression(node)) {\n this.extractBinaryExpressionAssignment(node, assignments);\n }\n\n if (Node.isCallExpression(node)) {\n this.extractArrayMutationAssignment(node, assignments);\n }\n });\n }\n\n /**\n * Extract assignments from binary expressions (=, +=, -=, etc.)\n */\n private extractBinaryExpressionAssignment(node: Node, assignments: StateAssignment[]): void {\n if (!Node.isBinaryExpression(node)) return;\n\n const operator = node.getOperatorToken().getText();\n\n if (operator === \"=\") {\n this.extractSimpleOrElementAccessAssignment(node, assignments);\n } else if ([\"+=\", \"-=\", \"*=\", \"/=\", \"%=\"].includes(operator)) {\n this.extractCompoundAssignment(node, assignments);\n }\n }\n\n /**\n * Extract simple or element access assignments (state.field = value or state.items[0] = value)\n */\n private extractSimpleOrElementAccessAssignment(node: Node, assignments: StateAssignment[]): void {\n if (!Node.isBinaryExpression(node)) return;\n\n const left = node.getLeft();\n const right = node.getRight();\n\n if (Node.isPropertyAccessExpression(left)) {\n this.extractPropertyAccessAssignment(left, right, assignments);\n } else if (Node.isElementAccessExpression(left)) {\n this.extractElementAccessAssignment(left, right, assignments);\n }\n }\n\n /**\n * Extract property access assignment (state.field = value)\n */\n private extractPropertyAccessAssignment(\n left: Node,\n right: Node,\n assignments: StateAssignment[]\n ): void {\n if (!Node.isPropertyAccessExpression(left)) return;\n\n const fieldPath = this.getPropertyPath(left);\n if (fieldPath.startsWith(\"state.\")) {\n const field = fieldPath.substring(6);\n const value = this.extractValue(right);\n if (value !== undefined) {\n assignments.push({ field, value });\n }\n }\n }\n\n /**\n * Extract element access assignment (state.items[index] = value)\n */\n private extractElementAccessAssignment(\n left: Node,\n right: Node,\n assignments: StateAssignment[]\n ): void {\n if (!Node.isElementAccessExpression(left)) return;\n\n const expr = left.getExpression();\n if (!Node.isPropertyAccessExpression(expr)) return;\n\n const fieldPath = this.getPropertyPath(expr);\n if (!fieldPath.startsWith(\"state.\")) return;\n\n const field = fieldPath.substring(6);\n const indexExpr = left.getArgumentExpression();\n const index = indexExpr ? indexExpr.getText() : \"0\";\n const value = this.extractValue(right);\n\n if (value !== undefined) {\n const tlaIndex = this.isNumericLiteral(index)\n ? (Number.parseInt(index) + 1).toString()\n : `${index} + 1`;\n assignments.push({\n field: `${field}[${tlaIndex}]`,\n value,\n });\n }\n }\n\n /**\n * Extract compound assignments (+=, -=, *=, /=, %=)\n */\n private extractCompoundAssignment(node: Node, assignments: StateAssignment[]): void {\n if (!Node.isBinaryExpression(node)) return;\n\n const operator = node.getOperatorToken().getText();\n const left = node.getLeft();\n const right = node.getRight();\n\n if (Node.isPropertyAccessExpression(left)) {\n const fieldPath = this.getPropertyPath(left);\n if (fieldPath.startsWith(\"state.\")) {\n const field = fieldPath.substring(6);\n const rightValue = right.getText();\n const tlaOp = operator.slice(0, -1); // Remove '=' suffix\n assignments.push({\n field,\n value: `@ ${tlaOp} ${rightValue}`,\n });\n }\n }\n }\n\n /**\n * Extract array mutation assignments (push, pop, shift, unshift, splice)\n */\n private extractArrayMutationAssignment(node: Node, assignments: StateAssignment[]): void {\n if (!Node.isCallExpression(node)) return;\n\n const expr = node.getExpression();\n if (!Node.isPropertyAccessExpression(expr)) return;\n\n const methodName = expr.getName();\n const object = expr.getExpression();\n\n if (Node.isPropertyAccessExpression(object)) {\n const fieldPath = this.getPropertyPath(object);\n if (fieldPath.startsWith(\"state.\")) {\n const field = fieldPath.substring(6);\n const args = node.getArguments().map((arg) => arg.getText());\n const tlaValue = this.translateArrayMethod(methodName, args, fieldPath);\n\n if (tlaValue) {\n assignments.push({ field, value: tlaValue });\n }\n }\n }\n }\n\n /**\n * Translate array mutation methods to TLA+ operators\n */\n private translateArrayMethod(\n methodName: string,\n args: string[],\n fieldPath: string\n ): string | null {\n switch (methodName) {\n case \"push\":\n return args.length === 1 ? `Append(@, ${args[0]})` : null;\n\n case \"pop\":\n return \"SubSeq(@, 1, Len(@)-1)\";\n\n case \"shift\":\n return \"Tail(@)\";\n\n case \"unshift\":\n return args.length === 1 ? `<<${args[0]}>> \\\\o @` : null;\n\n case \"splice\":\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Warning: splice() mutation on ${fieldPath} not fully translated`);\n }\n return null;\n\n default:\n return null;\n }\n }\n\n /**\n * Check for async mutations that could cause race conditions\n * Warns when async handlers have state mutations after await expressions\n */\n private checkAsyncMutations(\n funcNode: ArrowFunction | FunctionExpression,\n messageType: string\n ): void {\n // Check if function is async\n const isAsync =\n funcNode.hasModifier?.(SyntaxKind.AsyncKeyword) ||\n funcNode.getModifiers?.()?.some((m: Node) => m.getKind() === SyntaxKind.AsyncKeyword);\n\n if (!isAsync) {\n return; // Not async, no race conditions possible\n }\n\n // Find all await expressions\n const awaitExpressions: Node[] = [];\n funcNode.forEachDescendant((node: Node) => {\n if (Node.isAwaitExpression(node)) {\n awaitExpressions.push(node);\n }\n });\n\n if (awaitExpressions.length === 0) {\n return; // No awaits, no interleaving possible\n }\n\n // Find all state mutations\n const mutations: Array<{ field: string; line: number; afterAwait: boolean }> = [];\n const body = funcNode.getBody();\n\n if (!body) {\n return;\n }\n\n // Get position of first await\n const firstAwaitPos = awaitExpressions[0].getStart();\n\n // Track mutations and whether they occur after await\n funcNode.forEachDescendant((node: Node) => {\n if (Node.isBinaryExpression(node)) {\n this.checkBinaryExpressionMutation(node, firstAwaitPos, mutations);\n }\n\n if (Node.isCallExpression(node)) {\n this.checkCallExpressionMutation(node, firstAwaitPos, mutations);\n }\n });\n\n // Filter to mutations after await\n const mutationsAfterAwait = mutations.filter((m) => m.afterAwait);\n\n if (mutationsAfterAwait.length > 0 && process.env[\"POLLY_DEBUG\"]) {\n console.log(\n `[DEBUG] Warning: Async handler for '${messageType}' has ${mutationsAfterAwait.length} state mutation(s) after await`\n );\n console.log(\n \"[DEBUG] This may cause race conditions if multiple messages are processed concurrently\"\n );\n console.log(\n `[DEBUG] Mutations: ${mutationsAfterAwait.map((m) => `${m.field} (line ${m.line})`).join(\", \")}`\n );\n }\n }\n\n /**\n * Extract verification conditions (requires/ensures) from a handler function\n */\n private extractVerificationConditions(\n funcNode: ArrowFunction | FunctionExpression,\n preconditions: VerificationCondition[],\n postconditions: VerificationCondition[]\n ): void {\n const body = funcNode.getBody();\n const statements = Node.isBlock(body) ? body.getStatements() : [body];\n\n for (const statement of statements) {\n this.processStatementForConditions(statement, preconditions, postconditions);\n }\n }\n\n /**\n * Process a statement to extract verification conditions\n */\n private processStatementForConditions(\n statement: Node | Statement,\n preconditions: VerificationCondition[],\n postconditions: VerificationCondition[]\n ): void {\n if (!Node.isExpressionStatement(statement)) return;\n\n const expr = statement.getExpression();\n if (!Node.isCallExpression(expr)) return;\n\n const callee = expr.getExpression();\n if (!Node.isIdentifier(callee)) return;\n\n const functionName = callee.getText();\n\n if (functionName === \"requires\") {\n const condition = this.extractCondition(expr);\n if (condition) {\n preconditions.push(condition);\n }\n } else if (functionName === \"ensures\") {\n const condition = this.extractCondition(expr);\n if (condition) {\n postconditions.push(condition);\n }\n }\n }\n\n /**\n * Extract condition from a requires() or ensures() call\n */\n private extractCondition(callExpr: CallExpression): VerificationCondition | null {\n const args = callExpr.getArguments();\n\n if (args.length === 0) {\n return null;\n }\n\n // First argument is the condition expression\n const conditionArg = args[0];\n const expression = conditionArg.getText();\n\n // Second argument (optional) is the message\n let message: string | undefined;\n if (args.length >= 2 && Node.isStringLiteral(args[1])) {\n message = args[1].getLiteralValue();\n }\n\n const line = callExpr.getStartLineNumber();\n const column = callExpr.getStartLinePos();\n\n return {\n expression,\n message,\n location: {\n line,\n column,\n },\n };\n }\n\n /**\n * Get the full property access path (e.g., \"state.user.loggedIn\")\n */\n private getPropertyPath(node: PropertyAccessExpression | Node): string {\n const parts: string[] = [];\n\n let current = node;\n while (Node.isPropertyAccessExpression(current)) {\n parts.unshift(current.getName());\n current = current.getExpression();\n }\n\n // Add the base identifier\n if (Node.isIdentifier(current)) {\n parts.unshift(current.getText());\n }\n\n return parts.join(\".\");\n }\n\n /**\n * Extract a literal value from an expression\n */\n private extractValue(node: Node): string | boolean | number | null | undefined {\n if (Node.isStringLiteral(node)) {\n return node.getLiteralValue();\n }\n\n if (Node.isNumericLiteral(node)) {\n return node.getLiteralValue();\n }\n\n if (node.getKind() === SyntaxKind.TrueKeyword) {\n return true;\n }\n\n if (node.getKind() === SyntaxKind.FalseKeyword) {\n return false;\n }\n\n if (node.getKind() === SyntaxKind.NullKeyword) {\n return null;\n }\n\n // For complex expressions, return undefined (can't extract)\n return undefined;\n }\n\n /**\n * Check if a string represents a numeric literal\n */\n private isNumericLiteral(str: string): boolean {\n return /^\\d+$/.test(str);\n }\n\n /**\n * Extract handlers from switch/case message router patterns\n * Detects: switch(message.type) { case 'EVENT': handler(); }\n */\n private extractSwitchCaseHandlers(\n switchNode: SwitchStatement,\n context: string,\n filePath: string\n ): MessageHandler[] {\n const handlers: MessageHandler[] = [];\n\n try {\n // Check if switching on message.type or similar\n const expression = switchNode.getExpression();\n const expressionText = expression.getText();\n\n // Look for patterns like: message.type, data.type, msg.type, event.type\n if (!/\\.(type|kind|event|action)/.test(expressionText)) {\n return handlers;\n }\n\n // Extract handlers from each case clause\n const caseClauses = switchNode.getClauses();\n for (const clause of caseClauses) {\n if (Node.isCaseClause(clause)) {\n const caseExpr = clause.getExpression();\n\n // Extract message type from case expression\n let messageType: string | null = null;\n if (Node.isStringLiteral(caseExpr)) {\n messageType = caseExpr.getLiteralValue();\n }\n\n if (messageType) {\n const line = clause.getStartLineNumber();\n\n handlers.push({\n messageType,\n node: context,\n assignments: [],\n preconditions: [],\n postconditions: [],\n location: { file: filePath, line },\n });\n }\n }\n }\n } catch (_error) {\n // Skip malformed switch statements\n }\n\n return handlers;\n }\n\n /**\n * Extract handlers from handler map patterns\n * Detects: const handlers = { 'EVENT': handlerFn, ... }\n */\n private extractHandlerMapPattern(\n varDecl: VariableDeclaration,\n context: string,\n filePath: string\n ): MessageHandler[] {\n const handlers: MessageHandler[] = [];\n\n try {\n const initializer = varDecl.getInitializer();\n if (!this.isHandlerMapInitializer(initializer, varDecl)) {\n return handlers;\n }\n\n // Extract handlers from object properties\n const properties = initializer.getProperties();\n for (const prop of properties) {\n const handler = this.extractHandlerFromProperty(prop, context, filePath);\n if (handler) {\n handlers.push(handler);\n }\n }\n } catch (_error) {\n // Skip malformed object literals\n }\n\n return handlers;\n }\n\n /**\n * Check if initializer is a valid handler map\n */\n private isHandlerMapInitializer(\n initializer: Node | undefined,\n varDecl: VariableDeclaration\n ): initializer is ObjectLiteralExpression {\n if (!initializer || !Node.isObjectLiteralExpression(initializer)) {\n return false;\n }\n\n // Check if variable name suggests it's a handler map\n const varName = varDecl.getName().toLowerCase();\n return /(handler|listener|callback|event)s?/.test(varName);\n }\n\n /**\n * Extract handler from a property assignment in a handler map\n */\n private extractHandlerFromProperty(\n prop: Node,\n context: string,\n filePath: string\n ): MessageHandler | null {\n if (!Node.isPropertyAssignment(prop)) {\n return null;\n }\n\n const nameNode = prop.getNameNode();\n const messageType = this.getMessageTypeFromPropertyName(nameNode);\n\n if (!messageType) {\n return null;\n }\n\n const line = prop.getStartLineNumber();\n return {\n messageType,\n node: context,\n assignments: [],\n preconditions: [],\n postconditions: [],\n location: { file: filePath, line },\n };\n }\n\n /**\n * Extract message type from property name node\n */\n private getMessageTypeFromPropertyName(nameNode: Node): string | null {\n if (Node.isStringLiteral(nameNode)) {\n return nameNode.getLiteralValue();\n }\n if (Node.isIdentifier(nameNode)) {\n return nameNode.getText();\n }\n return null;\n }\n\n /**\n * Extract handlers from type guard if/else-if patterns\n * Detects: if (isQueryMessage(msg)) { handleQuery(msg); }\n */\n private extractTypeGuardHandlers(\n ifNode: Node,\n context: string,\n filePath: string\n ): MessageHandler[] {\n const handlers: MessageHandler[] = [];\n\n try {\n const sourceFile = ifNode.getSourceFile();\n const typeGuards = this.getOrComputeTypeGuards(sourceFile);\n\n this.debugLogTypeGuards(sourceFile, typeGuards);\n this.processIfElseChain(ifNode as IfStatement, typeGuards, context, filePath, handlers);\n } catch (error) {\n this.debugLogError(error);\n }\n\n return handlers;\n }\n\n /**\n * Get cached type guards or compute if not cached\n */\n private getOrComputeTypeGuards(sourceFile: SourceFile): Map<string, string> {\n let typeGuards = this.typeGuardCache.get(sourceFile);\n if (!typeGuards) {\n typeGuards = this.findTypePredicateFunctions(sourceFile);\n this.typeGuardCache.set(sourceFile, typeGuards);\n }\n return typeGuards;\n }\n\n /**\n * Debug log type guards found in source file\n */\n private debugLogTypeGuards(sourceFile: SourceFile, typeGuards: Map<string, string>): void {\n if (!process.env[\"POLLY_DEBUG\"]) return;\n\n console.log(`[DEBUG] File: ${sourceFile.getBaseName()}`);\n console.log(`[DEBUG] Local type guards found: ${typeGuards.size}`);\n\n if (typeGuards.size > 0) {\n for (const [name, type] of typeGuards.entries()) {\n console.log(`[DEBUG] - ${name} → ${type}`);\n }\n }\n }\n\n /**\n * Process if-else-if chain to extract handlers\n */\n private processIfElseChain(\n currentIf: IfStatement,\n typeGuards: Map<string, string>,\n context: string,\n filePath: string,\n handlers: MessageHandler[]\n ): void {\n let ifStatement = currentIf;\n while (ifStatement) {\n const handler = this.extractHandlerFromIfClause(ifStatement, typeGuards, context, filePath);\n\n if (handler) {\n handlers.push(handler);\n this.debugLogFoundHandler(handler);\n }\n\n // Check for else-if\n const elseStatement = ifStatement.getElseStatement();\n if (elseStatement && Node.isIfStatement(elseStatement)) {\n ifStatement = elseStatement;\n } else {\n break;\n }\n }\n }\n\n /**\n * Debug log found handler\n */\n private debugLogFoundHandler(handler: MessageHandler): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Found handler: ${handler.messageType} at line ${handler.location.line}`);\n }\n }\n\n /**\n * Debug log error\n */\n private debugLogError(error: unknown): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Error in extractTypeGuardHandlers: ${error}`);\n }\n }\n\n /**\n * Extract handler from a single if clause\n */\n private extractHandlerFromIfClause(\n ifNode: Node,\n typeGuards: Map<string, string>,\n context: string,\n filePath: string\n ): MessageHandler | null {\n try {\n const ifStmt = ifNode as IfStatement;\n const condition = ifStmt.getExpression();\n\n if (!Node.isCallExpression(condition)) {\n return null;\n }\n\n const funcExpr = condition.getExpression();\n const funcName = Node.isIdentifier(funcExpr) ? funcExpr.getText() : undefined;\n\n this.debugLogProcessingFunction(funcName);\n\n const messageType = this.resolveMessageType(funcExpr, funcName, typeGuards);\n if (!messageType) {\n this.debugLogUnresolvedMessageType(funcName);\n return null;\n }\n\n const line = ifStmt.getStartLineNumber();\n const relationships = this.extractRelationshipsFromIfBlock(ifStmt, messageType);\n\n return {\n messageType,\n node: context,\n assignments: [],\n preconditions: [],\n postconditions: [],\n location: { file: filePath, line },\n relationships,\n };\n } catch (_error) {\n return null;\n }\n }\n\n /**\n * Debug log processing function\n */\n private debugLogProcessingFunction(funcName: string | undefined): void {\n if (process.env[\"POLLY_DEBUG\"] && funcName) {\n console.log(`[DEBUG] Processing if condition with function: ${funcName}`);\n }\n }\n\n /**\n * Debug log unresolved message type\n */\n private debugLogUnresolvedMessageType(funcName: string | undefined): void {\n if (process.env[\"POLLY_DEBUG\"] && funcName) {\n console.log(`[DEBUG] Could not resolve message type for: ${funcName}`);\n }\n }\n\n /**\n * Resolve message type from function expression\n */\n private resolveMessageType(\n funcExpr: Node,\n funcName: string | undefined,\n typeGuards: Map<string, string>\n ): string | undefined {\n if (funcName && typeGuards.has(funcName)) {\n const guardType = typeGuards.get(funcName);\n if (guardType) {\n this.debugLogFoundInLocalTypeGuards(funcName, guardType);\n return guardType;\n }\n }\n\n if (Node.isIdentifier(funcExpr)) {\n this.debugLogTryingImportResolution(funcName);\n return this.resolveImportedTypeGuard(funcExpr) ?? undefined;\n }\n\n return undefined;\n }\n\n /**\n * Debug log found in local type guards\n */\n private debugLogFoundInLocalTypeGuards(funcName: string, messageType: string): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Found in local type guards: ${funcName} → ${messageType}`);\n }\n }\n\n /**\n * Debug log trying import resolution\n */\n private debugLogTryingImportResolution(funcName: string | undefined): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Not found locally, trying import resolution for: ${funcName}`);\n }\n }\n\n /**\n * Extract relationships from if block\n */\n private extractRelationshipsFromIfBlock(\n ifStmt: IfStatement,\n messageType: string\n ): ComponentRelationship[] | undefined {\n const thenStatement = ifStmt.getThenStatement();\n if (!thenStatement) {\n return undefined;\n }\n\n const sourceFile = ifStmt.getSourceFile();\n const handlerName = `${messageType}_handler`;\n const detectedRelationships = this.relationshipExtractor.extractFromHandler(\n thenStatement,\n sourceFile,\n handlerName\n );\n\n return detectedRelationships.length > 0 ? detectedRelationships : undefined;\n }\n\n /**\n * Find all type predicate functions in a source file\n * Returns a map of function name → message type\n * Uses AST-based detection for consistency with imported type guard resolution\n */\n private findTypePredicateFunctions(sourceFile: SourceFile): Map<string, string> {\n const typeGuards = new Map<string, string>();\n\n sourceFile.forEachDescendant((node) => {\n this.processTypePredicate(node, typeGuards);\n });\n\n return typeGuards;\n }\n\n /**\n * Process a node that might be a type predicate function\n */\n private processTypePredicate(node: Node, typeGuards: Map<string, string>): void {\n if (!this.isFunctionNode(node)) {\n return;\n }\n\n const returnTypeNode = node.getReturnTypeNode();\n if (!returnTypeNode || !Node.isTypePredicate(returnTypeNode)) {\n return;\n }\n\n const functionName = this.extractFunctionName(node);\n if (!functionName) {\n return;\n }\n\n const messageType = this.extractMessageTypeFromTypePredicateFunction(node, returnTypeNode);\n if (messageType) {\n typeGuards.set(functionName, messageType);\n }\n }\n\n /**\n * Extract function name from function node\n */\n private extractFunctionName(\n node: FunctionDeclaration | FunctionExpression | ArrowFunction\n ): string | undefined {\n if (Node.isFunctionDeclaration(node)) {\n return node.getName();\n }\n\n if (Node.isFunctionExpression(node) || Node.isArrowFunction(node)) {\n return this.extractFunctionNameFromVariable(node);\n }\n\n return undefined;\n }\n\n /**\n * Extract function name from variable declaration\n */\n private extractFunctionNameFromVariable(\n node: FunctionExpression | ArrowFunction\n ): string | undefined {\n const parent = node.getParent();\n if (Node.isVariableDeclaration(parent)) {\n return parent.getName();\n }\n return undefined;\n }\n\n /**\n * Extract message type from type predicate function\n */\n private extractMessageTypeFromTypePredicateFunction(\n node: FunctionDeclaration | FunctionExpression | ArrowFunction,\n returnTypeNode: Node\n ): string | null {\n const typeNode = returnTypeNode.getTypeNode();\n\n if (typeNode) {\n const typeName = typeNode.getText();\n const messageType = this.extractMessageTypeFromTypeName(typeName);\n if (messageType) {\n return messageType;\n }\n }\n\n return this.extractMessageTypeFromFunctionBodyText(node);\n }\n\n /**\n * Extract message type from function body text\n */\n private extractMessageTypeFromFunctionBodyText(\n node: FunctionDeclaration | FunctionExpression | ArrowFunction\n ): string | null {\n const body = node.getBody();\n if (!body) {\n return null;\n }\n\n const bodyText = body.getText();\n const typeValueMatch = bodyText.match(/\\.type\\s*===?\\s*['\"](\\w+)['\"]/);\n\n if (typeValueMatch) {\n return typeValueMatch[1] ?? null;\n }\n\n return null;\n }\n\n /**\n * Resolve type guard from imported function\n * Uses ts-morph symbol resolution to find definition across files\n * Checks AST structure, not resolved types (which can lose type predicate info)\n */\n private resolveImportedTypeGuard(identifier: Identifier): string | null {\n try {\n const funcName = identifier.getText();\n const definitions = identifier.getDefinitionNodes();\n\n if (definitions.length === 0) {\n this.debugLogNoDefinitions(funcName);\n return null;\n }\n\n for (const def of definitions) {\n const messageType = this.tryExtractTypeGuardFromDefinition(def, funcName);\n if (messageType) {\n return messageType;\n }\n }\n } catch (error) {\n this.debugLogResolutionError(error);\n }\n\n return null;\n }\n\n /**\n * Try to extract type guard from a single function definition\n */\n private tryExtractTypeGuardFromDefinition(def: Node, funcName: string): string | null {\n if (!this.isFunctionNode(def)) {\n return null;\n }\n\n const returnTypeNode = def.getReturnTypeNode();\n this.debugLogReturnTypeInfo(funcName, def, returnTypeNode);\n\n const typePredicateResult = this.extractFromTypePredicate(returnTypeNode, funcName);\n if (typePredicateResult) {\n return typePredicateResult;\n }\n\n return this.extractFromFunctionBody(def, funcName);\n }\n\n /**\n * Check if node is a function type\n */\n private isFunctionNode(\n node: Node\n ): node is FunctionDeclaration | FunctionExpression | ArrowFunction {\n return (\n Node.isFunctionDeclaration(node) ||\n Node.isFunctionExpression(node) ||\n Node.isArrowFunction(node)\n );\n }\n\n /**\n * Extract message type from type predicate node\n */\n private extractFromTypePredicate(\n returnTypeNode: Node | undefined,\n funcName: string\n ): string | null {\n if (!returnTypeNode || !Node.isTypePredicate(returnTypeNode)) {\n return null;\n }\n\n const typeNode = returnTypeNode.getTypeNode();\n if (!typeNode) {\n return null;\n }\n\n const typeName = typeNode.getText();\n const messageType = this.extractMessageTypeFromTypeName(typeName);\n\n if (messageType) {\n this.debugLogTypePredicateResolution(funcName, messageType);\n return messageType;\n }\n\n return null;\n }\n\n /**\n * Extract message type from function body\n */\n private extractFromFunctionBody(\n def: FunctionDeclaration | FunctionExpression | ArrowFunction,\n funcName: string\n ): string | null {\n const body = def.getBody();\n if (!body) {\n return null;\n }\n\n const bodyText = body.getText();\n const typeValueMatch = bodyText.match(/\\.type\\s*===?\\s*['\"](\\w+)['\"]/);\n\n if (typeValueMatch) {\n const messageType = typeValueMatch[1] ?? null;\n this.debugLogBodyResolution(funcName, messageType);\n return messageType;\n }\n\n return null;\n }\n\n /**\n * Debug: Log no definitions found\n */\n private debugLogNoDefinitions(funcName: string): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] No definitions found for imported function: ${funcName}`);\n }\n }\n\n /**\n * Debug: Log return type info\n */\n private debugLogReturnTypeInfo(\n funcName: string,\n def: FunctionDeclaration | FunctionExpression | ArrowFunction,\n returnTypeNode: Node | undefined\n ): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n const returnType = def.getReturnType().getText();\n console.log(`[DEBUG] Function ${funcName} return type (resolved): ${returnType}`);\n console.log(`[DEBUG] Has return type node: ${!!returnTypeNode}`);\n console.log(\n `[DEBUG] Is type predicate node: ${returnTypeNode && Node.isTypePredicate(returnTypeNode)}`\n );\n }\n }\n\n /**\n * Debug: Log type predicate resolution\n */\n private debugLogTypePredicateResolution(funcName: string, messageType: string): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Resolved ${funcName} → ${messageType} (from AST type predicate)`);\n }\n }\n\n /**\n * Debug: Log body resolution\n */\n private debugLogBodyResolution(funcName: string, messageType: string | null): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Resolved ${funcName} → ${messageType} (from body)`);\n }\n }\n\n /**\n * Debug: Log resolution error\n */\n private debugLogResolutionError(error: unknown): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Error resolving imported type guard: ${error}`);\n }\n }\n\n /**\n * Extract message type from TypeScript type name\n * Examples:\n * QueryMessage → query\n * CommandMessage → command\n * SubscribeMessage → subscribe\n */\n private extractMessageTypeFromTypeName(typeName: string): string {\n // Remove common suffixes and convert to lowercase\n const messageType = typeName\n .replace(/Message$/, \"\")\n .replace(/Event$/, \"\")\n .replace(/Request$/, \"\")\n .replace(/Command$/, \"\")\n .replace(/Query$/, \"\")\n .toLowerCase();\n\n return messageType;\n }\n\n /**\n * Infer the context (background, content, popup, etc.) from file path\n */\n private inferContext(filePath: string): string {\n const path = filePath.toLowerCase();\n\n // Check contexts in priority order\n return (\n this.inferElectronContext(path) ||\n this.inferWorkerContext(path) ||\n this.inferServerAppContext(path) ||\n this.inferChromeExtensionContext(path) ||\n \"unknown\"\n );\n }\n\n /**\n * Infer Electron context (main, renderer, preload)\n */\n private inferElectronContext(path: string): string | null {\n if (\n path.includes(\"main.ts\") ||\n path.includes(\"main.js\") ||\n path.includes(\"/main/\") ||\n path.includes(\"\\\\main\\\\\")\n ) {\n return \"main\";\n }\n\n if (\n path.includes(\"/renderer/\") ||\n path.includes(\"\\\\renderer\\\\\") ||\n path.includes(\"renderer.ts\") ||\n path.includes(\"renderer.js\")\n ) {\n return \"renderer\";\n }\n\n if (path.includes(\"preload.ts\") || path.includes(\"preload.js\")) {\n return \"preload\";\n }\n\n return null;\n }\n\n /**\n * Infer Worker/PWA context\n */\n private inferWorkerContext(path: string): string | null {\n if (path.includes(\"service-worker\") || path.includes(\"sw.ts\") || path.includes(\"sw.js\")) {\n return \"worker\";\n }\n\n if (path.includes(\"/worker/\") || path.includes(\"\\\\worker\\\\\")) {\n return \"worker\";\n }\n\n return null;\n }\n\n /**\n * Infer WebSocket/server app context\n */\n private inferServerAppContext(path: string): string | null {\n if (\n path.includes(\"/server/\") ||\n path.includes(\"\\\\server\\\\\") ||\n path.includes(\"/server.\") ||\n path.includes(\"server.ts\") ||\n path.includes(\"server.js\")\n ) {\n return \"server\";\n }\n\n if (path.includes(\"/client/\") || path.includes(\"\\\\client\\\\\") || path.includes(\"/client.\")) {\n return \"client\";\n }\n\n return null;\n }\n\n /**\n * Infer Chrome extension context\n */\n private inferChromeExtensionContext(path: string): string | null {\n if (path.includes(\"/background/\") || path.includes(\"\\\\background\\\\\")) {\n return \"background\";\n }\n\n if (path.includes(\"/content/\") || path.includes(\"\\\\content\\\\\")) {\n return \"content\";\n }\n\n if (path.includes(\"/popup/\") || path.includes(\"\\\\popup\\\\\")) {\n return \"popup\";\n }\n\n if (path.includes(\"/devtools/\") || path.includes(\"\\\\devtools\\\\\")) {\n return \"devtools\";\n }\n\n if (path.includes(\"/options/\") || path.includes(\"\\\\options\\\\\")) {\n return \"options\";\n }\n\n if (path.includes(\"/offscreen/\") || path.includes(\"\\\\offscreen\\\\\")) {\n return \"offscreen\";\n }\n\n return null;\n }\n\n /**\n * Check binary expression for state mutations\n */\n private checkBinaryExpressionMutation(\n node: Node,\n firstAwaitPos: number,\n mutations: Array<{ field: string; line: number; afterAwait: boolean }>\n ): void {\n if (!Node.isBinaryExpression(node)) return;\n\n const operator = node.getOperatorToken().getText();\n if (operator !== \"=\" && ![\"+=\", \"-=\", \"*=\", \"/=\", \"%=\"].includes(operator)) return;\n\n const left = node.getLeft();\n if (!Node.isPropertyAccessExpression(left) && !Node.isElementAccessExpression(left)) return;\n\n const fieldPath = Node.isPropertyAccessExpression(left)\n ? this.getPropertyPath(left)\n : this.getPropertyPath(left.getExpression());\n\n if (fieldPath.startsWith(\"state.\")) {\n const field = fieldPath.substring(6);\n const line = node.getStartLineNumber();\n const afterAwait = node.getStart() > firstAwaitPos;\n mutations.push({ field, line, afterAwait });\n }\n }\n\n /**\n * Check call expression for array mutation methods\n */\n private checkCallExpressionMutation(\n node: Node,\n firstAwaitPos: number,\n mutations: Array<{ field: string; line: number; afterAwait: boolean }>\n ): void {\n if (!Node.isCallExpression(node)) return;\n\n const expr = node.getExpression();\n if (!Node.isPropertyAccessExpression(expr)) return;\n\n const methodName = expr.getName();\n const object = expr.getExpression();\n\n if (!Node.isPropertyAccessExpression(object)) return;\n\n const fieldPath = this.getPropertyPath(object);\n if (!fieldPath.startsWith(\"state.\")) return;\n\n if ([\"push\", \"pop\", \"shift\", \"unshift\", \"splice\"].includes(methodName)) {\n const field = fieldPath.substring(6);\n const line = node.getStartLineNumber();\n const afterAwait = node.getStart() > firstAwaitPos;\n mutations.push({ field, line, afterAwait });\n }\n }\n}\n\nexport function extractHandlers(tsConfigPath: string): HandlerAnalysis {\n const extractor = new HandlerExtractor(tsConfigPath);\n return extractor.extractHandlers();\n}\n",
|
|
8
|
-
"// Component relationship extraction from TypeScript code\n// Detects function calls, imports, and dependencies between components\n\nimport {\n type ArrowFunction,\n type CallExpression,\n type FunctionDeclaration,\n type FunctionExpression,\n Node,\n type SourceFile,\n} from \"ts-morph\";\n\n/**\n * Represents a relationship between components detected from code analysis\n */\nexport interface DetectedRelationship {\n /** Source component (handler, service, etc.) */\n from: string;\n /** Target component being called/used */\n to: string;\n /** Description of the relationship */\n description: string;\n /** Technology/method used (e.g., \"Function Call\", \"Import\", \"SQL\", \"HTTP\") */\n technology?: string;\n /** Confidence level of this detection */\n confidence: \"high\" | \"medium\" | \"low\";\n /** Evidence supporting this detection */\n evidence: string[];\n}\n\n/**\n * Extracts component relationships from handler code\n */\nexport class RelationshipExtractor {\n /**\n * Extract relationships from a function/handler body\n */\n extractFromHandler(\n handlerNode: Node,\n sourceFile: SourceFile,\n handlerName: string\n ): DetectedRelationship[] {\n const relationships: DetectedRelationship[] = [];\n const visited = new Set<string>(); // Prevent infinite recursion\n\n this.extractFromNode(handlerNode, sourceFile, handlerName, relationships, visited);\n\n return this.deduplicateRelationships(relationships);\n }\n\n /**\n * Recursively extract relationships from a node and follow function calls\n */\n private extractFromNode(\n node: Node,\n sourceFile: SourceFile,\n handlerName: string,\n relationships: DetectedRelationship[],\n visited: Set<string>\n ): void {\n node.forEachDescendant((descendant) => {\n this.processDescendantNode(descendant, sourceFile, handlerName, relationships, visited);\n });\n }\n\n /**\n * Process a single descendant node for relationship extraction\n */\n private processDescendantNode(\n descendant: Node,\n sourceFile: SourceFile,\n handlerName: string,\n relationships: DetectedRelationship[],\n visited: Set<string>\n ): void {\n if (Node.isCallExpression(descendant)) {\n this.processCallExpression(descendant, sourceFile, handlerName, relationships, visited);\n }\n\n if (Node.isAwaitExpression(descendant)) {\n const rel = this.extractFromDatabaseCall(descendant, handlerName);\n if (rel) {\n relationships.push(rel);\n }\n }\n\n if (Node.isCallExpression(descendant) && descendant.getExpression().getText() === \"fetch\") {\n const rel = this.extractFromFetchCall(descendant, handlerName);\n if (rel) {\n relationships.push(rel);\n }\n }\n }\n\n /**\n * Process a call expression for relationship extraction\n */\n private processCallExpression(\n callExpr: CallExpression,\n sourceFile: SourceFile,\n handlerName: string,\n relationships: DetectedRelationship[],\n visited: Set<string>\n ): void {\n const expr = callExpr.getExpression();\n\n if (Node.isIdentifier(expr)) {\n this.processIdentifierCall(expr, sourceFile, handlerName, relationships, visited);\n return;\n }\n\n if (Node.isPropertyAccessExpression(expr)) {\n const rel = this.extractFromPropertyAccess(expr, handlerName);\n if (rel) {\n relationships.push(rel);\n return;\n }\n }\n\n const rel = this.extractFromFunctionCall(callExpr, handlerName, sourceFile);\n if (rel) {\n relationships.push(rel);\n }\n }\n\n /**\n * Process an identifier call (local or imported function)\n */\n private processIdentifierCall(\n identifier: Identifier,\n sourceFile: SourceFile,\n handlerName: string,\n relationships: DetectedRelationship[],\n visited: Set<string>\n ): void {\n const functionName = identifier.getText();\n const resolved = this.resolveFunctionDeclaration(functionName, sourceFile);\n\n if (resolved && !visited.has(functionName)) {\n this.followFunctionCall(\n functionName,\n resolved.functionDecl,\n resolved.sourceFile,\n handlerName,\n relationships,\n visited\n );\n return;\n }\n\n if (!resolved) {\n this.tryAddServiceCallRelationship(functionName, handlerName, relationships);\n }\n }\n\n /**\n * Resolve function declaration from name\n */\n private resolveFunctionDeclaration(\n functionName: string,\n sourceFile: SourceFile\n ): { functionDecl: FunctionDeclaration; sourceFile: SourceFile } | null {\n let functionDecl = sourceFile.getFunction(functionName);\n let targetSourceFile = sourceFile;\n\n if (!functionDecl) {\n const resolved = this.resolveImportedFunction(functionName, sourceFile);\n if (resolved) {\n functionDecl = resolved.functionDecl;\n targetSourceFile = resolved.sourceFile;\n }\n }\n\n if (!functionDecl) {\n return null;\n }\n\n return { functionDecl, sourceFile: targetSourceFile };\n }\n\n /**\n * Follow a function call recursively\n */\n private followFunctionCall(\n functionName: string,\n functionDecl: FunctionDeclaration,\n targetSourceFile: SourceFile,\n handlerName: string,\n relationships: DetectedRelationship[],\n visited: Set<string>\n ): void {\n visited.add(functionName);\n\n const body = functionDecl.getBody();\n if (body) {\n this.extractFromNode(body, targetSourceFile, handlerName, relationships, visited);\n }\n }\n\n /**\n * Try to add a service call relationship based on function name\n */\n private tryAddServiceCallRelationship(\n functionName: string,\n handlerName: string,\n relationships: DetectedRelationship[]\n ): void {\n const componentFromName = this.inferComponentFromFunctionName(functionName);\n if (componentFromName) {\n relationships.push({\n from: this.toComponentId(handlerName),\n to: componentFromName,\n description: `Calls ${functionName}()`,\n technology: \"Function Call\",\n confidence: \"medium\",\n evidence: [`Function call: ${functionName}`],\n });\n }\n }\n\n /**\n * Extract relationship from a function call\n */\n private extractFromFunctionCall(\n callExpr: CallExpression,\n handlerName: string,\n sourceFile: SourceFile\n ): DetectedRelationship | null {\n const expr = callExpr.getExpression();\n const exprText = expr.getText();\n\n // Skip common utility functions and built-ins\n const skipList = [\n \"console.\",\n \"JSON.\",\n \"Math.\",\n \"Object.\",\n \"Array.\",\n \"String.\",\n \"Number.\",\n \"Date.\",\n \"Promise.\",\n \"setTimeout\",\n \"setInterval\",\n \"clearTimeout\",\n \"clearInterval\",\n ];\n\n if (skipList.some((skip) => exprText.startsWith(skip))) {\n return null;\n }\n\n // Extract function name\n let functionName = exprText;\n let targetComponent: string | null = null;\n\n // Handle property access (e.g., db.getConnection() -> db_client)\n if (Node.isPropertyAccessExpression(expr)) {\n const objectExpr = expr.getExpression();\n const objectName = objectExpr.getText();\n const methodName = expr.getName();\n\n // Map common patterns to component names\n targetComponent = this.inferComponentFromCall(objectName);\n\n if (!targetComponent) {\n return null;\n }\n\n functionName = methodName;\n } else {\n // Direct function call - try to resolve from imports\n targetComponent = this.resolveComponentFromImport(exprText, sourceFile);\n\n if (!targetComponent) {\n return null;\n }\n }\n\n return {\n from: this.toComponentId(handlerName),\n to: targetComponent,\n description: `Calls ${functionName}()`,\n technology: \"Function Call\",\n confidence: \"high\",\n evidence: [`Function call: ${exprText}`],\n };\n }\n\n /**\n * Extract relationship from property access chain\n * Handles both simple (obj.method) and nested (obj.prop.method) patterns\n */\n private extractFromPropertyAccess(\n propAccess: Node,\n handlerName: string\n ): DetectedRelationship | null {\n if (!Node.isPropertyAccessExpression(propAccess)) {\n return null;\n }\n\n const fullChain = propAccess.getText();\n const methodName = propAccess.getName();\n\n // Extract the root object from potentially nested property access\n // e.g., repositories.users.create -> repositories\n let rootObject = propAccess.getExpression();\n while (Node.isPropertyAccessExpression(rootObject)) {\n rootObject = rootObject.getExpression();\n }\n\n const objectName = rootObject.getText();\n\n // Map object name to component name\n const targetComponent = this.inferComponentFromCall(objectName);\n\n if (!targetComponent) {\n return null;\n }\n\n return {\n from: this.toComponentId(handlerName),\n to: targetComponent,\n description: `Calls ${methodName}()`,\n technology: \"Function Call\",\n confidence: \"high\",\n evidence: [`Property access: ${fullChain}`],\n };\n }\n\n /**\n * Extract relationship from database call\n */\n private extractFromDatabaseCall(\n awaitExpr: Node,\n handlerName: string\n ): DetectedRelationship | null {\n if (!Node.isAwaitExpression(awaitExpr)) {\n return null;\n }\n\n const innerExpr = awaitExpr.getExpression();\n if (!Node.isCallExpression(innerExpr)) {\n return null;\n }\n\n const callExpr = innerExpr.getExpression().getText();\n\n // Detect database patterns\n if (\n callExpr.includes(\"db.query\") ||\n callExpr.includes(\"db.execute\") ||\n callExpr.includes(\"db.select\") ||\n callExpr.includes(\"db.insert\") ||\n callExpr.includes(\"db.update\") ||\n callExpr.includes(\"db.delete\")\n ) {\n const operation = this.inferDatabaseOperation(callExpr);\n\n return {\n from: this.toComponentId(handlerName),\n to: \"database\",\n description: operation,\n technology: \"SQL\",\n confidence: \"high\",\n evidence: [`Database call: ${callExpr}`],\n };\n }\n\n return null;\n }\n\n /**\n * Extract relationship from fetch/HTTP call\n */\n private extractFromFetchCall(\n callExpr: CallExpression,\n handlerName: string\n ): DetectedRelationship | null {\n const args = callExpr.getArguments();\n if (args.length === 0 || !args[0]) {\n return null;\n }\n\n const urlArg = args[0].getText();\n\n // Try to extract API name from URL\n let apiName = \"external_api\";\n if (urlArg.includes(\"openai\")) {\n apiName = \"openai_api\";\n } else if (urlArg.includes(\"anthropic\")) {\n apiName = \"anthropic_api\";\n }\n\n return {\n from: this.toComponentId(handlerName),\n to: apiName,\n description: \"Calls external API\",\n technology: \"HTTP/REST\",\n confidence: \"high\",\n evidence: [`fetch() call to: ${urlArg}`],\n };\n }\n\n /**\n * Infer component name from object.method pattern\n */\n private inferComponentFromCall(objectName: string): string | null {\n const mappings: Record<string, string> = {\n db: \"db_client\",\n database: \"database\",\n repos: \"repositories\",\n repository: \"repositories\",\n repositories: \"repositories\",\n cache: \"cache\",\n storage: \"storage\",\n ai: \"ai_service\",\n auth: \"auth_service\",\n authservice: \"auth_service\",\n user: \"user_service\",\n userservice: \"user_service\",\n logger: \"logger\",\n queue: \"queue_service\",\n };\n\n const normalized = objectName.toLowerCase();\n return mappings[normalized] || null;\n }\n\n /**\n * Infer component name from function name patterns\n * Detects patterns like getDatabase(), createRepositories(), etc.\n */\n private inferComponentFromFunctionName(functionName: string): string | null {\n const normalized = functionName.toLowerCase();\n\n // Pattern 1: getXxx() or createXxx()\n if (normalized.startsWith(\"get\") || normalized.startsWith(\"create\")) {\n const prefixLength = normalized.startsWith(\"get\") ? 3 : 6;\n const suffix = functionName.substring(prefixLength);\n return this.matchComponentPattern(suffix);\n }\n\n // Pattern 2: initXxx() or setupXxx()\n if (normalized.startsWith(\"init\") || normalized.startsWith(\"setup\")) {\n const prefixLength = normalized.startsWith(\"init\") ? 4 : 5;\n const suffix = functionName.substring(prefixLength);\n return this.matchInitPattern(suffix);\n }\n\n return null;\n }\n\n /**\n * Match component patterns for get/create functions\n */\n private matchComponentPattern(suffix: string): string | null {\n const suffixLower = suffix.toLowerCase();\n\n const componentPatterns = [\n {\n patterns: [\"database\", \"db\", \"dbconnection\", \"connection\"],\n component: \"db_client\",\n },\n {\n patterns: [\"repositories\", \"repos\", \"repository\"],\n component: \"repositories\",\n },\n {\n patterns: [\"cache\"],\n component: \"cache\",\n },\n {\n patterns: [\"storage\"],\n component: \"storage\",\n },\n {\n patterns: [\"ai\", \"llm\"],\n component: \"ai_service\",\n },\n {\n patterns: [\"logger\"],\n component: \"logger\",\n },\n ];\n\n for (const { patterns, component } of componentPatterns) {\n if (patterns.some((pattern) => suffixLower.includes(pattern) || suffixLower === pattern)) {\n return component;\n }\n }\n\n // Service patterns (special case with extraction)\n if (suffixLower.includes(\"service\")) {\n const serviceMatch = suffix.match(/^(.+?)Service/i);\n if (serviceMatch) {\n return this.toComponentId(`${serviceMatch[1]}_service`);\n }\n return \"service\";\n }\n\n return null;\n }\n\n /**\n * Match patterns for init/setup functions\n */\n private matchInitPattern(suffix: string): string | null {\n const suffixLower = suffix.toLowerCase();\n\n if (suffixLower.includes(\"database\") || suffixLower === \"db\") {\n return \"db_client\";\n }\n if (suffixLower.includes(\"cache\")) {\n return \"cache\";\n }\n\n return null;\n }\n\n /**\n * Resolve component from import statement\n */\n private resolveComponentFromImport(functionName: string, sourceFile: SourceFile): string | null {\n for (const importDecl of sourceFile.getImportDeclarations()) {\n const namedImports = importDecl.getNamedImports();\n\n for (const namedImport of namedImports) {\n if (namedImport.getName() === functionName) {\n const modulePath = importDecl.getModuleSpecifierValue();\n const component = this.inferComponentFromModulePath(modulePath);\n if (component) return component;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Infer component from module path\n */\n private inferComponentFromModulePath(modulePath: string): string | null {\n if (modulePath.includes(\"/db/\") || modulePath.includes(\"/database/\")) {\n return \"db_client\";\n }\n if (modulePath.includes(\"/repos\") || modulePath.includes(\"/repositories\")) {\n return \"repositories\";\n }\n if (modulePath.includes(\"/service\") || modulePath.includes(\"/services\")) {\n const match = modulePath.match(/\\/([^/]+)\\.ts$/);\n if (match?.[1]) {\n return this.toComponentId(match[1]);\n }\n }\n return null;\n }\n\n /**\n * Resolve imported function to its declaration in another file\n * This enables cross-file relationship detection for architectures where\n * handlers are separated from routing logic\n */\n private resolveImportedFunction(\n functionName: string,\n sourceFile: SourceFile\n ): {\n functionDecl: FunctionDeclaration | ArrowFunction | FunctionExpression;\n sourceFile: SourceFile;\n } | null {\n try {\n for (const importDecl of sourceFile.getImportDeclarations()) {\n const namedImports = importDecl.getNamedImports();\n\n for (const namedImport of namedImports) {\n if (namedImport.getName() === functionName) {\n const moduleSpecifier = importDecl.getModuleSpecifierSourceFile();\n if (!moduleSpecifier) continue;\n\n const result = this.findFunctionInModule(functionName, moduleSpecifier);\n if (result) return result;\n }\n }\n }\n } catch (_error) {\n // Silently fail on resolution errors (e.g., missing files, parse errors)\n // This ensures the extractor is resilient to incomplete projects\n return null;\n }\n\n return null;\n }\n\n /**\n * Find function declaration or arrow function in a module\n */\n private findFunctionInModule(\n functionName: string,\n moduleSpecifier: SourceFile\n ): {\n functionDecl: FunctionDeclaration | ArrowFunction | FunctionExpression;\n sourceFile: SourceFile;\n } | null {\n // Find the function in the imported file\n const functionDecl = moduleSpecifier.getFunction(functionName);\n if (functionDecl) {\n return {\n functionDecl,\n sourceFile: moduleSpecifier,\n };\n }\n\n // Also check for exported arrow functions or const declarations\n const variableDecl = moduleSpecifier.getVariableDeclaration(functionName);\n if (variableDecl) {\n const initializer = variableDecl.getInitializer();\n if (\n initializer &&\n (Node.isArrowFunction(initializer) || Node.isFunctionExpression(initializer))\n ) {\n return {\n functionDecl: initializer,\n sourceFile: moduleSpecifier,\n };\n }\n }\n\n return null;\n }\n\n /**\n * Infer database operation type\n */\n private inferDatabaseOperation(callExpr: string): string {\n if (callExpr.includes(\"query\") || callExpr.includes(\"select\")) {\n return \"Reads from database\";\n }\n if (\n callExpr.includes(\"execute\") ||\n callExpr.includes(\"insert\") ||\n callExpr.includes(\"update\") ||\n callExpr.includes(\"delete\")\n ) {\n return \"Writes to database\";\n }\n return \"Accesses database\";\n }\n\n /**\n * Convert name to component ID format\n */\n private toComponentId(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_|_$/g, \"\");\n }\n\n /**\n * Remove duplicate relationships\n */\n private deduplicateRelationships(relationships: DetectedRelationship[]): DetectedRelationship[] {\n const seen = new Set<string>();\n const unique: DetectedRelationship[] = [];\n\n for (const rel of relationships) {\n const key = `${rel.from}->${rel.to}`;\n if (!seen.has(key)) {\n seen.add(key);\n unique.push(rel);\n }\n }\n\n return unique;\n }\n}\n",
|
|
9
|
-
"// Manifest.json parser for Chrome extensions\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { ManifestInfo } from \"../types/architecture\";\n\n/**\n * Parse manifest.json and extract context information\n */\nexport class ManifestParser {\n private manifestPath: string;\n private manifestData: Record<string, unknown> | null;\n private baseDir: string;\n\n constructor(projectRoot: string, optional = false) {\n this.baseDir = projectRoot;\n this.manifestPath = path.join(projectRoot, \"manifest.json\");\n\n if (!fs.existsSync(this.manifestPath)) {\n if (optional) {\n this.manifestData = null;\n return;\n }\n throw new Error(`manifest.json not found at ${this.manifestPath}`);\n }\n\n try {\n const content = fs.readFileSync(this.manifestPath, \"utf-8\");\n this.manifestData = JSON.parse(content);\n } catch (error) {\n throw new Error(`Failed to parse manifest.json: ${error}`);\n }\n }\n\n /**\n * Check if manifest.json exists and was loaded\n */\n hasManifest(): boolean {\n return this.manifestData !== null;\n }\n\n /**\n * Parse manifest and extract all information\n */\n parse(): ManifestInfo {\n if (!this.manifestData) {\n throw new Error(\n \"Cannot parse manifest: manifest.json not loaded. Use hasManifest() to check availability.\"\n );\n }\n\n const manifest = this.manifestData;\n\n return {\n name: manifest.name || \"Unknown Extension\",\n version: manifest.version || \"0.0.0\",\n description: manifest.description,\n manifestVersion: manifest.manifest_version || 2,\n background: this.parseBackground(),\n contentScripts: this.parseContentScripts(),\n popup: this.parsePopup(),\n options: this.parseOptions(),\n devtools: this.parseDevtools(),\n permissions: manifest.permissions || [],\n hostPermissions: manifest.host_permissions || [],\n };\n }\n\n /**\n * Get context entry points from manifest\n */\n getContextEntryPoints(): Record<string, string> {\n if (!this.manifestData) {\n return {};\n }\n\n const entryPoints: Record<string, string> = {};\n\n this.addBackgroundEntryPoint(entryPoints);\n this.addContentScriptEntryPoint(entryPoints);\n this.addPopupEntryPoint(entryPoints);\n this.addOptionsEntryPoint(entryPoints);\n this.addDevtoolsEntryPoint(entryPoints);\n\n return entryPoints;\n }\n\n private addBackgroundEntryPoint(entryPoints: Record<string, string>): void {\n const background = this.parseBackground();\n if (!background) return;\n\n const entryFile = background.files[0];\n if (entryFile) {\n entryPoints[\"background\"] = this.findSourceFile(entryFile);\n }\n }\n\n private addContentScriptEntryPoint(entryPoints: Record<string, string>): void {\n const contentScripts = this.parseContentScripts();\n if (!contentScripts || contentScripts.length === 0) return;\n\n const firstScript = contentScripts[0]?.js[0];\n if (firstScript) {\n entryPoints[\"content\"] = this.findSourceFile(firstScript);\n }\n }\n\n private addPopupEntryPoint(entryPoints: Record<string, string>): void {\n const popup = this.parsePopup();\n if (!popup) return;\n\n const htmlPath = path.join(this.baseDir, popup.html);\n const jsPath = this.findAssociatedJS(htmlPath);\n if (jsPath) {\n entryPoints[\"popup\"] = jsPath;\n }\n }\n\n private addOptionsEntryPoint(entryPoints: Record<string, string>): void {\n const options = this.parseOptions();\n if (!options) return;\n\n const htmlPath = path.join(this.baseDir, options.page);\n const jsPath = this.findAssociatedJS(htmlPath);\n if (jsPath) {\n entryPoints[\"options\"] = jsPath;\n }\n }\n\n private addDevtoolsEntryPoint(entryPoints: Record<string, string>): void {\n const devtools = this.parseDevtools();\n if (!devtools) return;\n\n const htmlPath = path.join(this.baseDir, devtools.page);\n const jsPath = this.findAssociatedJS(htmlPath);\n if (jsPath) {\n entryPoints[\"devtools\"] = jsPath;\n }\n }\n\n /**\n * Parse background configuration\n */\n private parseBackground(): ManifestInfo[\"background\"] {\n if (!this.manifestData) return undefined;\n\n const bg = this.manifestData.background;\n if (!bg) return undefined;\n\n // Manifest V3 - service worker\n if (bg.service_worker) {\n return {\n type: \"service_worker\",\n files: [bg.service_worker],\n };\n }\n\n // Manifest V2 - scripts\n if (bg.scripts) {\n return {\n type: \"script\",\n files: bg.scripts,\n };\n }\n\n // Manifest V2 - page\n if (bg.page) {\n return {\n type: \"script\",\n files: [bg.page],\n };\n }\n\n return undefined;\n }\n\n /**\n * Parse content scripts configuration\n */\n private parseContentScripts(): ManifestInfo[\"contentScripts\"] {\n if (!this.manifestData) return undefined;\n\n const cs = this.manifestData.content_scripts;\n if (!cs || !Array.isArray(cs)) return undefined;\n\n return cs.map((script) => ({\n matches: script.matches || [],\n js: script.js || [],\n css: script.css,\n }));\n }\n\n /**\n * Parse popup configuration\n */\n private parsePopup(): ManifestInfo[\"popup\"] {\n if (!this.manifestData) return undefined;\n\n const action = this.manifestData.action || this.manifestData.browser_action;\n if (!action) return undefined;\n\n if (action.default_popup) {\n return {\n html: action.default_popup,\n default: true,\n };\n }\n\n return undefined;\n }\n\n /**\n * Parse options configuration\n */\n private parseOptions(): ManifestInfo[\"options\"] {\n if (!this.manifestData) return undefined;\n\n const options = this.manifestData.options_ui || this.manifestData.options_page;\n if (!options) return undefined;\n\n if (typeof options === \"string\") {\n return {\n page: options,\n openInTab: false,\n };\n }\n\n return {\n page: options.page,\n openInTab: options.open_in_tab,\n };\n }\n\n /**\n * Parse devtools configuration\n */\n private parseDevtools(): ManifestInfo[\"devtools\"] {\n if (!this.manifestData) return undefined;\n\n const devtools = this.manifestData.devtools_page;\n if (!devtools) return undefined;\n\n return {\n page: devtools,\n };\n }\n\n /**\n * Find source file from manifest reference\n * Tries multiple locations: exact path, src/ directory, .ts extension\n */\n private findSourceFile(manifestPath: string): string {\n const candidates = [\n // Exact path from manifest\n path.join(this.baseDir, manifestPath),\n // Same path with .ts extension\n path.join(this.baseDir, manifestPath.replace(/\\.js$/, \".ts\")),\n // In src/ directory\n path.join(this.baseDir, \"src\", manifestPath),\n path.join(this.baseDir, \"src\", manifestPath.replace(/\\.js$/, \".ts\")),\n // In src/ with .tsx extension\n path.join(this.baseDir, \"src\", manifestPath.replace(/\\.js$/, \".tsx\")),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n // Fallback to manifest path (will error later if not found)\n return path.join(this.baseDir, manifestPath);\n }\n\n /**\n * Find associated JavaScript/TypeScript file for an HTML file\n */\n private findAssociatedJS(htmlPath: string): string | null {\n if (!fs.existsSync(htmlPath)) {\n return null;\n }\n\n // Read HTML and look for script tags\n const html = fs.readFileSync(htmlPath, \"utf-8\");\n const scriptMatch = html.match(/<script[^>]+src=[\"']([^\"']+)[\"']/i);\n\n if (scriptMatch?.[1]) {\n const scriptPath = scriptMatch[1];\n const fullPath = path.resolve(path.dirname(htmlPath), scriptPath);\n\n // Try with and without .js/.ts extension\n if (fs.existsSync(fullPath)) return fullPath;\n if (fs.existsSync(fullPath.replace(/\\.js$/, \".ts\"))) {\n return fullPath.replace(/\\.js$/, \".ts\");\n }\n if (fs.existsSync(fullPath.replace(/\\.js$/, \".tsx\"))) {\n return fullPath.replace(/\\.js$/, \".tsx\");\n }\n }\n\n // Fallback: look for convention-based files\n const baseName = path.basename(htmlPath, \".html\");\n const dir = path.dirname(htmlPath);\n\n const candidates = [\n path.join(dir, `${baseName}.ts`),\n path.join(dir, `${baseName}.tsx`),\n path.join(dir, `${baseName}.js`),\n path.join(dir, \"index.ts\"),\n path.join(dir, \"index.tsx\"),\n path.join(dir, \"index.js\"),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n }\n}\n\n/**\n * Parse manifest.json and extract information\n */\nexport function parseManifest(projectRoot: string): ManifestInfo {\n const parser = new ManifestParser(projectRoot);\n return parser.parse();\n}\n\n/**\n * Get context entry points from manifest.json\n */\nexport function getContextEntryPoints(projectRoot: string): Record<string, string> {\n const parser = new ManifestParser(projectRoot);\n return parser.getContextEntryPoints();\n}\n",
|
|
6
|
+
"// ADR (Architecture Decision Record) extractor\n// Parses ADRs from markdown files following Michael Nygard's format\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { ADR, ADRCollection, ADRLink, ADRStatus } from \"../types/adr\";\n\nexport class ADRExtractor {\n private projectRoot: string;\n\n constructor(projectRoot: string) {\n this.projectRoot = projectRoot;\n }\n\n /**\n * Extract ADRs from docs/adr directory\n */\n extract(): ADRCollection {\n const adrDir = this.findADRDirectory();\n\n if (!adrDir || !fs.existsSync(adrDir)) {\n return {\n adrs: [],\n directory: adrDir || path.join(this.projectRoot, \"docs\", \"adr\"),\n };\n }\n\n const files = fs\n .readdirSync(adrDir)\n .filter((file) => file.endsWith(\".md\"))\n .map((file) => path.join(adrDir, file));\n\n const adrs: ADR[] = [];\n\n for (const file of files) {\n try {\n const adr = this.parseADR(file);\n if (adr) {\n adrs.push(adr);\n }\n } catch (error) {\n // Skip malformed ADR files\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Failed to parse ADR file ${file}: ${error}`);\n }\n }\n }\n\n // Sort by ID\n adrs.sort((a, b) => a.id.localeCompare(b.id));\n\n return {\n adrs,\n directory: adrDir,\n };\n }\n\n /**\n * Find ADR directory\n */\n private findADRDirectory(): string | null {\n const candidates = [\n path.join(this.projectRoot, \"docs\", \"adr\"),\n path.join(this.projectRoot, \"docs\", \"architecture\", \"decisions\"),\n path.join(this.projectRoot, \"adr\"),\n path.join(this.projectRoot, \"architecture\", \"decisions\"),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n }\n\n /**\n * Parse ADR from markdown file\n */\n private parseADR(filePath: string): ADR | null {\n const content = fs.readFileSync(filePath, \"utf-8\");\n const fileName = path.basename(filePath, \".md\");\n\n // Extract ID from filename (e.g., \"0001-use-preact.md\" → \"0001\")\n const idMatch = fileName.match(/^(\\d+)/);\n const id = idMatch?.[1] ?? fileName;\n\n // Extract title from first heading\n const titleMatch = content.match(/^#\\s+(.+)$/m);\n const title = titleMatch?.[1]?.trim() ?? fileName;\n\n // Extract status\n const status = this.extractStatus(content);\n\n // Extract date\n const date = this.extractDate(content);\n\n // Extract sections\n const context = this.extractSection(content, \"Context\");\n const decision = this.extractSection(content, \"Decision\");\n const consequences = this.extractSection(content, \"Consequences\");\n\n // Extract alternatives (if present)\n const alternativesSection = this.extractSection(content, \"Alternatives\");\n const alternatives = alternativesSection\n ? alternativesSection\n .split(\"\\n\")\n .filter((line) => line.trim().startsWith(\"-\"))\n .map((line) => line.replace(/^-\\s*/, \"\").trim())\n : undefined;\n\n // Extract links\n const links = this.extractLinks(content);\n\n if (!context || !decision || !consequences) {\n // Not a valid ADR format\n return null;\n }\n\n return {\n id,\n title,\n status,\n date,\n context,\n decision,\n consequences,\n ...(alternatives && alternatives.length > 0 ? { alternatives } : {}),\n ...(links.length > 0 ? { links } : {}),\n source: filePath,\n };\n }\n\n /**\n * Extract status from content\n */\n private extractStatus(content: string): ADRStatus {\n const statusMatch = content.match(/Status:\\s*(\\w+)/i);\n if (!statusMatch) return \"accepted\";\n\n const status = statusMatch[1]?.toLowerCase();\n if (status && [\"proposed\", \"accepted\", \"deprecated\", \"superseded\"].includes(status)) {\n return status as ADRStatus;\n }\n\n return \"accepted\";\n }\n\n /**\n * Extract date from content\n */\n private extractDate(content: string): string {\n // Try to find date in various formats\n const dateMatch =\n content.match(/Date:\\s*(\\d{4}-\\d{2}-\\d{2})/i) || content.match(/(\\d{4}-\\d{2}-\\d{2})/i);\n\n if (dateMatch?.[1]) {\n return dateMatch[1];\n }\n\n const isoDate = new Date().toISOString().split(\"T\")[0];\n return isoDate || new Date().toLocaleDateString(\"en-CA\");\n }\n\n /**\n * Extract section content\n */\n private extractSection(content: string, sectionName: string): string {\n // Match section heading and capture content until next heading or end\n const regex = new RegExp(`##\\\\s+${sectionName}\\\\s*\\\\n([\\\\s\\\\S]*?)(?=\\\\n##|$)`, \"i\");\n const match = content.match(regex);\n\n return match?.[1]?.trim() ?? \"\";\n }\n\n /**\n * Extract links to other ADRs\n */\n private extractLinks(content: string): ADRLink[] {\n const links: ADRLink[] = [];\n\n // Look for supersedes/superseded-by links\n const supersedesMatch = content.match(/Supersedes:\\s*ADR-(\\d+)/gi);\n if (supersedesMatch) {\n for (const match of supersedesMatch) {\n const idMatch = match.match(/ADR-(\\d+)/);\n const id = idMatch?.[1];\n if (id) {\n links.push({\n type: \"supersedes\",\n adrId: id,\n });\n }\n }\n }\n\n const supersededByMatch = content.match(/Superseded by:\\s*ADR-(\\d+)/gi);\n if (supersededByMatch) {\n for (const match of supersededByMatch) {\n const idMatch = match.match(/ADR-(\\d+)/);\n const id = idMatch?.[1];\n if (id) {\n links.push({\n type: \"superseded-by\",\n adrId: id,\n });\n }\n }\n }\n\n return links;\n }\n}\n\n/**\n * Extract ADRs from project\n */\nexport function extractADRs(projectRoot: string): ADRCollection {\n const extractor = new ADRExtractor(projectRoot);\n return extractor.extract();\n}\n",
|
|
7
|
+
"// Architecture analysis - main orchestrator\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type {\n ArchitectureAnalysis,\n ContextInfo,\n ManifestInfo,\n ProjectConfig,\n} from \"../types/architecture\";\nimport { extractADRs } from \"./adr\";\nimport { ContextAnalyzer } from \"./contexts\";\nimport { FlowAnalyzer } from \"./flows\";\nimport { HandlerExtractor } from \"./handlers\";\nimport { IntegrationAnalyzer } from \"./integrations\";\nimport { ManifestParser } from \"./manifest\";\n\nexport interface ArchitectureAnalysisOptions {\n /** Path to tsconfig.json */\n tsConfigPath: string;\n\n /** Project root directory */\n projectRoot: string;\n\n /** Optional: Override detected contexts */\n contexts?: string[];\n\n /** Optional: Use generic project detection (non-extension) */\n useProjectDetector?: boolean;\n}\n\n/**\n * Comprehensive architecture analyzer\n */\nexport class ArchitectureAnalyzer {\n private options: ArchitectureAnalysisOptions;\n\n constructor(options: ArchitectureAnalysisOptions) {\n this.options = options;\n }\n\n /**\n * Perform complete architecture analysis\n */\n async analyze(): Promise<ArchitectureAnalysis> {\n // 1. Initialize system info and entry points\n const { manifest, projectConfig, entryPoints, systemInfo } = await this.initializeSystemInfo();\n\n // 2. Extract message handlers\n const handlerExtractor = new HandlerExtractor(this.options.tsConfigPath);\n const { handlers } = handlerExtractor.extractHandlers();\n\n // 3. Analyze each context\n const contexts = this.analyzeContexts(entryPoints, handlers);\n\n // 4. Analyze message flows\n const flowAnalyzer = new FlowAnalyzer(this.options.tsConfigPath, handlers);\n const messageFlows = flowAnalyzer.analyzeFlows();\n\n // 5. Analyze external integrations\n const integrationAnalyzer = new IntegrationAnalyzer(this.options.tsConfigPath);\n const integrations = integrationAnalyzer.analyzeIntegrations();\n\n // 6. Merge external API calls into context info\n this.mergeExternalAPIsIntoContexts(contexts, integrations);\n\n // 7. Extract ADRs (Architecture Decision Records)\n const adrs = extractADRs(this.options.projectRoot);\n\n // 8. Extract repository info\n const repository = this.extractRepositoryInfo();\n\n return {\n projectRoot: this.options.projectRoot,\n system: systemInfo,\n ...(manifest ? { manifest } : {}),\n ...(projectConfig ? { projectConfig } : {}),\n contexts,\n messageFlows,\n integrations,\n ...(adrs.adrs.length > 0 ? { adrs } : {}),\n ...(repository ? { repository } : {}),\n };\n }\n\n /**\n * Initialize system information and entry points\n */\n private async initializeSystemInfo(): Promise<{\n manifest?: ManifestInfo;\n projectConfig?: ProjectConfig;\n entryPoints: Record<string, string>;\n systemInfo: { name: string; version: string; description?: string };\n }> {\n const manifestParser = new ManifestParser(this.options.projectRoot, true);\n\n if (manifestParser.hasManifest() && !this.options.useProjectDetector) {\n // Parse manifest.json (Chrome extension)\n const manifest = manifestParser.parse();\n const entryPoints = manifestParser.getContextEntryPoints();\n\n return {\n manifest,\n entryPoints,\n systemInfo: {\n name: manifest.name,\n version: manifest.version,\n ...(manifest.description ? { description: manifest.description } : {}),\n },\n };\n }\n\n // Use project detector for generic projects\n const { detectProjectConfig } = await import(\"./project-detector\");\n const projectConfig = detectProjectConfig(this.options.projectRoot);\n\n return {\n projectConfig,\n entryPoints: projectConfig.entryPoints,\n systemInfo: {\n name: projectConfig.metadata?.name || \"Unknown Project\",\n version: projectConfig.metadata?.version || \"0.0.0\",\n ...(projectConfig.metadata?.description\n ? { description: projectConfig.metadata.description }\n : {}),\n },\n };\n }\n\n /**\n * Analyze all contexts from entry points\n */\n private analyzeContexts(\n entryPoints: Record<string, string>,\n handlers: MessageHandler[]\n ): Record<string, ContextInfo> {\n const contextAnalyzer = new ContextAnalyzer(this.options.tsConfigPath);\n const contexts: Record<string, ContextInfo> = {};\n\n for (const [contextType, entryPoint] of Object.entries(entryPoints)) {\n try {\n const contextInfo = contextAnalyzer.analyzeContext(contextType, entryPoint, handlers);\n contexts[contextType] = contextInfo;\n } catch (error) {\n // Skip contexts that fail to analyze\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Failed to analyze context ${contextType}: ${error}`);\n }\n }\n }\n\n return contexts;\n }\n\n /**\n * Merge external API calls into their respective contexts\n */\n private mergeExternalAPIsIntoContexts(\n contexts: Record<string, ContextInfo>,\n integrations: ExternalIntegration[]\n ): void {\n for (const integration of integrations) {\n if (integration.calls) {\n for (const call of integration.calls) {\n // Find which context this call belongs to\n for (const [contextType, contextInfo] of Object.entries(contexts)) {\n if (call.location.file.includes(`/${contextType}/`)) {\n contextInfo.externalAPIs.push(call);\n break;\n }\n }\n }\n }\n }\n }\n\n /**\n * Extract repository information from package.json\n */\n private extractRepositoryInfo(): ArchitectureAnalysis[\"repository\"] {\n const packageJsonPath = path.join(this.options.projectRoot, \"package.json\");\n\n if (!fs.existsSync(packageJsonPath)) {\n return undefined;\n }\n\n try {\n const content = fs.readFileSync(packageJsonPath, \"utf-8\");\n const packageJson = JSON.parse(content);\n\n if (packageJson.repository) {\n if (typeof packageJson.repository === \"string\") {\n return {\n url: packageJson.repository,\n type: \"git\",\n };\n }\n\n return {\n url: packageJson.repository.url || packageJson.repository,\n type: packageJson.repository.type || \"git\",\n };\n }\n } catch (error) {\n // Skip if package.json is malformed or unreadable\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Failed to extract repository info from package.json: ${error}`);\n }\n }\n\n return undefined;\n }\n}\n\n/**\n * Convenience function to analyze architecture\n */\nexport async function analyzeArchitecture(\n options: ArchitectureAnalysisOptions\n): Promise<ArchitectureAnalysis> {\n const analyzer = new ArchitectureAnalyzer(options);\n return analyzer.analyze();\n}\n\n// Fix: Import ExternalIntegration type\nimport type { ExternalIntegration } from \"../types/architecture\";\n",
|
|
10
8
|
"// Context analysis - analyze individual execution contexts\n\nimport {\n type ClassDeclaration,\n type FunctionDeclaration,\n Node,\n Project,\n type SourceFile,\n} from \"ts-morph\";\nimport type { ComponentInfo, ContextInfo } from \"../types/architecture\";\nimport type { MessageHandler } from \"../types/core\";\n\nexport class ContextAnalyzer {\n private project: Project;\n\n constructor(tsConfigPath: string) {\n this.project = new Project({\n tsConfigFilePath: tsConfigPath,\n });\n }\n\n /**\n * Analyze a specific context given its entry point\n */\n analyzeContext(contextType: string, entryPoint: string, handlers: MessageHandler[]): ContextInfo {\n const sourceFile = this.project.getSourceFile(entryPoint);\n\n if (!sourceFile) {\n throw new Error(`Could not find source file: ${entryPoint}`);\n }\n\n // Extract Chrome API usage\n const chromeAPIs = this.extractChromeAPIs(sourceFile);\n\n // Extract dependencies\n const dependencies = this.extractDependencies(sourceFile);\n\n // Extract JSDoc description\n const description = this.extractDescription(sourceFile);\n\n // Extract components (for UI contexts)\n const components = this.isUIContext(contextType)\n ? this.extractComponents(sourceFile)\n : undefined;\n\n // Filter handlers for this context\n const contextHandlers = handlers.filter((h) => h.node === contextType);\n\n return {\n type: contextType,\n entryPoint,\n handlers: contextHandlers,\n chromeAPIs,\n externalAPIs: [], // Will be filled by integration analyzer\n ...(components ? { components } : {}),\n dependencies,\n ...(description ? { description } : {}),\n };\n }\n\n /**\n * Extract Chrome API usage from source file\n */\n private extractChromeAPIs(sourceFile: SourceFile): string[] {\n const apis = new Set<string>();\n\n sourceFile.forEachDescendant((node: Node) => {\n if (Node.isPropertyAccessExpression(node)) {\n const text = node.getText();\n this.detectAPIPattern(text, apis);\n }\n });\n\n return Array.from(apis).sort();\n }\n\n /**\n * Detect and extract API from text using various patterns\n */\n private detectAPIPattern(text: string, apis: Set<string>): void {\n // Match chrome.* API calls\n if (text.startsWith(\"chrome.\")) {\n const api = this.extractAPIFromPrefix(text, \"chrome\");\n if (api) apis.add(api);\n return;\n }\n\n // Match browser.* for Firefox compatibility\n if (text.startsWith(\"browser.\")) {\n const api = this.extractAPIFromPrefix(text, \"browser\");\n if (api) apis.add(api);\n return;\n }\n\n // Match bus.adapters.* pattern (framework abstraction)\n if (text.includes(\"bus.adapters.\")) {\n const api = this.extractAPIFromBusAdapter(text);\n if (api) apis.add(api);\n }\n }\n\n /**\n * Extract API namespace from chrome.* or browser.* prefix\n */\n private extractAPIFromPrefix(text: string, prefix: string): string | null {\n const pattern = new RegExp(`^${prefix}\\\\.([^.(]+(?:\\\\.[^.(]+)?)`);\n const match = text.match(pattern);\n return match?.[1] || null;\n }\n\n /**\n * Extract API from bus.adapters.* pattern\n */\n private extractAPIFromBusAdapter(text: string): string | null {\n const match = text.match(/bus\\.adapters\\.([^.(]+)/);\n return match?.[1] || null;\n }\n\n /**\n * Extract import dependencies\n */\n private extractDependencies(sourceFile: SourceFile): string[] {\n const deps: string[] = [];\n\n for (const importDecl of sourceFile.getImportDeclarations()) {\n const moduleSpecifier = importDecl.getModuleSpecifierValue();\n deps.push(moduleSpecifier);\n }\n\n return deps;\n }\n\n /**\n * Extract JSDoc description from file\n */\n private extractDescription(sourceFile: SourceFile): string | undefined {\n // Look for file-level JSDoc comment\n const firstStatement = sourceFile.getStatements()[0];\n if (!firstStatement) return undefined;\n\n const leadingComments = firstStatement.getLeadingCommentRanges();\n if (leadingComments.length === 0) return undefined;\n\n const comment = leadingComments[0].getText();\n\n // Extract description from JSDoc\n const descMatch = comment.match(/@description\\s+(.+?)(?:\\n|$)/s);\n if (descMatch) {\n return descMatch[1].trim();\n }\n\n // Or just take the first line of the comment\n const lines = comment\n .split(\"\\n\")\n .map((l: string) => l.replace(/^[\\s*]+/, \"\").trim())\n .filter((l: string) => l && !l.startsWith(\"@\"));\n\n return lines[0] || undefined;\n }\n\n /**\n * Extract React/Preact components from source file\n */\n private extractComponents(sourceFile: SourceFile): ComponentInfo[] {\n const components: ComponentInfo[] = [];\n\n sourceFile.forEachDescendant((node: Node) => {\n this.extractFunctionComponent(node, sourceFile, components);\n this.extractArrowFunctionComponent(node, sourceFile, components);\n this.extractClassComponent(node, sourceFile, components);\n });\n\n return components;\n }\n\n /**\n * Extract function component from node if applicable\n */\n private extractFunctionComponent(\n node: Node,\n sourceFile: SourceFile,\n components: ComponentInfo[]\n ): void {\n if (!Node.isFunctionDeclaration(node)) return;\n\n const name = node.getName();\n if (!name || !this.looksLikeComponent(name, node)) return;\n\n const description = this.extractJSDocDescription(node);\n components.push({\n name,\n type: \"function\",\n filePath: sourceFile.getFilePath(),\n line: node.getStartLineNumber(),\n props: this.extractProps(node),\n ...(description ? { description } : {}),\n });\n }\n\n /**\n * Extract arrow function component from node if applicable\n */\n private extractArrowFunctionComponent(\n node: Node,\n sourceFile: SourceFile,\n components: ComponentInfo[]\n ): void {\n if (!Node.isVariableDeclaration(node)) return;\n\n const name = node.getName();\n const initializer = node.getInitializer();\n\n if (!name || !initializer) return;\n if (!Node.isArrowFunction(initializer) && !Node.isFunctionExpression(initializer)) return;\n if (!this.looksLikeComponent(name, initializer)) return;\n\n const description = this.extractJSDocDescription(node);\n components.push({\n name,\n type: \"function\",\n filePath: sourceFile.getFilePath(),\n line: node.getStartLineNumber(),\n props: this.extractProps(initializer),\n ...(description ? { description } : {}),\n });\n }\n\n /**\n * Extract class component from node if applicable\n */\n private extractClassComponent(\n node: Node,\n sourceFile: SourceFile,\n components: ComponentInfo[]\n ): void {\n if (!Node.isClassDeclaration(node)) return;\n\n const name = node.getName();\n if (!name || !this.looksLikeClassComponent(node)) return;\n\n const description = this.extractJSDocDescription(node);\n components.push({\n name,\n type: \"class\",\n filePath: sourceFile.getFilePath(),\n line: node.getStartLineNumber(),\n props: this.extractPropsFromClass(node),\n ...(description ? { description } : {}),\n });\n }\n\n /**\n * Check if a function looks like a React/Preact component\n */\n private looksLikeComponent(name: string, node: FunctionDeclaration): boolean {\n // Component names should start with uppercase\n if (!/^[A-Z]/.test(name)) return false;\n\n // Check if it returns JSX\n const body = node.getBody();\n if (!body) return false;\n\n let hasJSX = false;\n\n if (Node.isBlock(body)) {\n body.forEachDescendant((child: Node) => {\n if (Node.isJsxElement(child) || Node.isJsxSelfClosingElement(child)) {\n hasJSX = true;\n }\n });\n } else if (Node.isJsxElement(body) || Node.isJsxSelfClosingElement(body)) {\n // Arrow function with implicit return\n hasJSX = true;\n }\n\n return hasJSX;\n }\n\n /**\n * Check if a class looks like a React component\n */\n private looksLikeClassComponent(node: ClassDeclaration): boolean {\n const extendedTypes = node.getExtends();\n if (!extendedTypes) return false;\n\n const extendsText = extendedTypes.getText();\n return /Component|PureComponent/.test(extendsText);\n }\n\n /**\n * Extract props from function component\n */\n private extractProps(node: FunctionDeclaration): string[] {\n const params = node.getParameters();\n if (params.length === 0) return [];\n\n const propsParam = params[0];\n const type = propsParam.getType();\n\n const props: string[] = [];\n for (const prop of type.getProperties()) {\n props.push(prop.getName());\n }\n\n return props;\n }\n\n /**\n * Extract props from class component\n */\n private extractPropsFromClass(node: ClassDeclaration): string[] {\n const extendedTypes = node.getExtends();\n if (!extendedTypes) return [];\n\n const typeArgs = extendedTypes.getType().getTypeArguments();\n if (typeArgs.length === 0) return [];\n\n const propsType = typeArgs[0];\n const props: string[] = [];\n\n for (const prop of propsType.getProperties()) {\n props.push(prop.getName());\n }\n\n return props;\n }\n\n /**\n * Extract JSDoc description from node\n */\n private extractJSDocDescription(node: Node): string | undefined {\n const jsDocs = node.getJsDocs();\n if (jsDocs.length === 0) return undefined;\n\n const description = jsDocs[0].getDescription().trim();\n return description || undefined;\n }\n\n /**\n * Check if context is a UI context\n */\n private isUIContext(contextType: string): boolean {\n return [\"popup\", \"options\", \"devtools\"].includes(contextType);\n }\n}\n",
|
|
11
9
|
"// Message flow analysis - trace messages between contexts\n\nimport { Node, Project } from \"ts-morph\";\nimport type { MessageFlow, MessageStep } from \"../types/architecture\";\nimport type { MessageHandler } from \"../types/core\";\n\nexport class FlowAnalyzer {\n private project: Project;\n private handlers: MessageHandler[];\n\n constructor(tsConfigPath: string, handlers: MessageHandler[]) {\n this.project = new Project({\n tsConfigFilePath: tsConfigPath,\n });\n this.handlers = handlers;\n }\n\n /**\n * Analyze message flows between contexts\n */\n analyzeFlows(): MessageFlow[] {\n const flows: MessageFlow[] = [];\n\n // Group handlers by message type\n const handlersByType = new Map<string, MessageHandler[]>();\n for (const handler of this.handlers) {\n if (!handlersByType.has(handler.messageType)) {\n handlersByType.set(handler.messageType, []);\n }\n handlersByType.get(handler.messageType)?.push(handler);\n }\n\n // For each message type, trace the flow\n for (const [messageType, handlers] of handlersByType) {\n // Find senders\n const senders = this.findMessageSenders(messageType);\n\n // For each sender, create a flow\n for (const sender of senders) {\n const recipients = handlers.map((h) => h.node);\n\n // Build sequence of steps\n const sequence = this.buildSequence(messageType, sender, handlers);\n\n // Extract flow metadata\n const flowMetadata = this.extractFlowMetadata(sender.file, sender.line);\n\n flows.push({\n messageType,\n from: sender.context,\n to: recipients,\n ...(flowMetadata.trigger ? { trigger: flowMetadata.trigger } : {}),\n ...(flowMetadata.flowName ? { flowName: flowMetadata.flowName } : {}),\n ...(flowMetadata.description ? { description: flowMetadata.description } : {}),\n sequence,\n });\n }\n }\n\n return flows;\n }\n\n /**\n * Find all places where a message is sent\n * Supports: .send(), .emit(), postMessage(), ws.send(), broadcast(), etc.\n */\n private findMessageSenders(messageType: string): Array<{\n context: string;\n file: string;\n line: number;\n }> {\n const senders: Array<{ context: string; file: string; line: number }> = [];\n\n for (const sourceFile of this.project.getSourceFiles()) {\n const filePath = sourceFile.getFilePath();\n const context = this.inferContext(filePath);\n\n sourceFile.forEachDescendant((node) => {\n this.processMessageSender(node, messageType, context, filePath, senders);\n });\n }\n\n return senders;\n }\n\n /**\n * Process a node that might be a message sender\n */\n private processMessageSender(\n node: Node,\n messageType: string,\n context: string,\n filePath: string,\n senders: Array<{ context: string; file: string; line: number }>\n ): void {\n if (!Node.isCallExpression(node)) {\n return;\n }\n\n const expression = node.getExpression();\n\n if (Node.isPropertyAccessExpression(expression)) {\n this.processPropertyAccessSender(node, expression, messageType, context, filePath, senders);\n } else if (Node.isIdentifier(expression)) {\n this.processIdentifierSender(node, expression, messageType, context, filePath, senders);\n }\n }\n\n /**\n * Process property access sender (.send(), .emit(), etc.)\n */\n private processPropertyAccessSender(\n node: CallExpression,\n expression: Node,\n messageType: string,\n context: string,\n filePath: string,\n senders: Array<{ context: string; file: string; line: number }>\n ): void {\n if (!Node.isPropertyAccessExpression(expression)) {\n return;\n }\n\n const methodName = expression.getName();\n\n if (!this.isMessageSendMethod(methodName)) {\n return;\n }\n\n const args = node.getArguments();\n if (args.length === 0) {\n return;\n }\n\n const msgType = this.extractMessageTypeFromArg(args[0]);\n if (msgType === messageType) {\n senders.push({\n context,\n file: filePath,\n line: node.getStartLineNumber(),\n });\n }\n }\n\n /**\n * Process identifier sender (postMessage())\n */\n private processIdentifierSender(\n node: CallExpression,\n expression: Node,\n messageType: string,\n context: string,\n filePath: string,\n senders: Array<{ context: string; file: string; line: number }>\n ): void {\n if (!Node.isIdentifier(expression)) {\n return;\n }\n\n if (expression.getText() !== \"postMessage\") {\n return;\n }\n\n const args = node.getArguments();\n if (args.length === 0) {\n return;\n }\n\n const msgType = this.extractMessageTypeFromArg(args[0]);\n if (msgType === messageType) {\n senders.push({\n context,\n file: filePath,\n line: node.getStartLineNumber(),\n });\n }\n }\n\n /**\n * Check if method name is a message sending method\n */\n private isMessageSendMethod(methodName: string): boolean {\n return (\n methodName === \"send\" ||\n methodName === \"emit\" ||\n methodName === \"postMessage\" ||\n methodName === \"broadcast\"\n );\n }\n\n /**\n * Build sequence of steps for a message flow\n */\n private buildSequence(\n messageType: string,\n sender: { context: string; file: string; line: number },\n handlers: MessageHandler[]\n ): MessageStep[] {\n const steps: MessageStep[] = [];\n let stepNumber = 1;\n\n // Step 1: Send message\n steps.push({\n step: stepNumber++,\n action: `${sender.context}.send(${messageType})`,\n context: sender.context,\n location: {\n file: sender.file,\n line: sender.line,\n },\n });\n\n // Step 2+: Handle in each recipient context\n for (const handler of handlers) {\n steps.push({\n step: stepNumber++,\n action: `${handler.node}.handle(${messageType})`,\n context: handler.node,\n location: handler.location,\n });\n\n // Add substeps for any messages sent by this handler\n const subsends = this.findMessagesInHandler(handler);\n for (const subsend of subsends) {\n steps.push({\n step: stepNumber++,\n action: `${handler.node}.send(${subsend.messageType})`,\n context: handler.node,\n location: subsend.location,\n });\n }\n }\n\n return steps;\n }\n\n /**\n * Find messages sent within a handler\n */\n private findMessagesInHandler(handler: MessageHandler): Array<{\n messageType: string;\n location: { file: string; line: number };\n }> {\n const sends: Array<{ messageType: string; location: { file: string; line: number } }> = [];\n\n const sourceFile = this.project.getSourceFile(handler.location.file);\n if (!sourceFile) return sends;\n\n const targetLine = handler.location.line;\n\n sourceFile.forEachDescendant((node) => {\n this.processSendCall(node, targetLine, handler.location.file, sends);\n });\n\n return sends;\n }\n\n /**\n * Process a node that might be a send/emit call\n */\n private processSendCall(\n node: Node,\n targetLine: number,\n filePath: string,\n sends: Array<{ messageType: string; location: { file: string; line: number } }>\n ): void {\n if (!Node.isCallExpression(node)) {\n return;\n }\n\n const line = node.getStartLineNumber();\n if (!this.isNearLine(line, targetLine)) {\n return;\n }\n\n const expression = node.getExpression();\n if (!this.isSendOrEmitCall(expression)) {\n return;\n }\n\n const args = node.getArguments();\n if (args.length === 0) {\n return;\n }\n\n const messageType = this.extractMessageTypeFromArg(args[0]);\n if (messageType) {\n sends.push({\n messageType,\n location: { file: filePath, line },\n });\n }\n }\n\n /**\n * Check if line is near target line\n */\n private isNearLine(line: number, targetLine: number): boolean {\n return Math.abs(line - targetLine) < 20;\n }\n\n /**\n * Check if expression is a send or emit call\n */\n private isSendOrEmitCall(expression: Node): boolean {\n if (!Node.isPropertyAccessExpression(expression)) {\n return false;\n }\n\n const methodName = expression.getName();\n return methodName === \"send\" || methodName === \"emit\";\n }\n\n /**\n * Extract message type from send/emit argument\n */\n private extractMessageTypeFromArg(arg: Node): string | undefined {\n if (Node.isStringLiteral(arg)) {\n return arg.getLiteralValue();\n }\n\n if (Node.isObjectLiteralExpression(arg)) {\n return this.extractMessageTypeFromObject(arg);\n }\n\n return undefined;\n }\n\n /**\n * Extract message type from object literal\n */\n private extractMessageTypeFromObject(obj: Node): string | undefined {\n if (!Node.isObjectLiteralExpression(obj)) {\n return undefined;\n }\n\n const typeProperty = obj.getProperty(\"type\");\n if (!typeProperty || !Node.isPropertyAssignment(typeProperty)) {\n return undefined;\n }\n\n const initializer = typeProperty.getInitializer();\n if (!initializer || !Node.isStringLiteral(initializer)) {\n return undefined;\n }\n\n return initializer.getLiteralValue();\n }\n\n /**\n * Extract flow metadata from JSDoc annotations\n */\n private extractFlowMetadata(\n filePath: string,\n lineNumber: number\n ): {\n trigger?: string;\n flowName?: string;\n description?: string;\n } {\n const sourceFile = this.project.getSourceFile(filePath);\n if (!sourceFile) return {};\n\n // Find the node at this line\n let targetNode: Node | null = null;\n\n sourceFile.forEachDescendant((node) => {\n if (node.getStartLineNumber() === lineNumber) {\n targetNode = node;\n }\n });\n\n if (!targetNode) return {};\n\n // Look for JSDoc comments\n const jsDocs = targetNode.getJsDocs?.() || [];\n if (jsDocs.length === 0) return {};\n\n const comment = jsDocs[0].getText();\n\n // Extract @flow annotation\n const flowMatch = comment.match(/@flow\\s+([^\\s]+)/);\n const flowName = flowMatch ? flowMatch[1] : undefined;\n\n // Extract @trigger annotation\n const triggerMatch = comment.match(/@trigger\\s+(.+?)(?:\\n|$)/);\n const trigger = triggerMatch ? triggerMatch[1].trim() : undefined;\n\n // Extract @description\n const descMatch = comment.match(/@description\\s+(.+?)(?:\\n|$)/s);\n const description = descMatch ? descMatch[1].trim() : undefined;\n\n return { trigger, flowName, description };\n }\n\n /**\n * Infer context from file path\n */\n private inferContext(filePath: string): string {\n const path = filePath.toLowerCase();\n\n // Define context patterns to check\n const contextPatterns: Array<{ context: string; patterns: string[] }> = [\n { context: \"background\", patterns: [\"/background/\", \"\\\\background\\\\\"] },\n { context: \"content\", patterns: [\"/content/\", \"\\\\content\\\\\"] },\n { context: \"popup\", patterns: [\"/popup/\", \"\\\\popup\\\\\"] },\n { context: \"devtools\", patterns: [\"/devtools/\", \"\\\\devtools\\\\\"] },\n { context: \"options\", patterns: [\"/options/\", \"\\\\options\\\\\"] },\n { context: \"offscreen\", patterns: [\"/offscreen/\", \"\\\\offscreen\\\\\"] },\n { context: \"server\", patterns: [\"/server/\", \"\\\\server\\\\\", \"/server.\"] },\n { context: \"client\", patterns: [\"/client/\", \"\\\\client\\\\\", \"/client.\"] },\n { context: \"worker\", patterns: [\"/worker/\", \"\\\\worker\\\\\", \"service-worker\"] },\n ];\n\n for (const { context, patterns } of contextPatterns) {\n if (patterns.some((pattern) => path.includes(pattern))) {\n return context;\n }\n }\n\n return \"unknown\";\n }\n}\n",
|
|
10
|
+
"// Handler extraction from TypeScript code\n// Extracts message handlers and their state mutations\n\nimport {\n type ArrowFunction,\n type CallExpression,\n type FunctionExpression,\n type Identifier,\n type IfStatement,\n Node,\n type ObjectLiteralExpression,\n Project,\n type PropertyAccessExpression,\n type SourceFile,\n type Statement,\n type SwitchStatement,\n SyntaxKind,\n type VariableDeclaration,\n} from \"ts-morph\";\nimport type {\n ComponentRelationship,\n MessageHandler,\n StateAssignment,\n VerificationCondition,\n} from \"../types\";\nimport { RelationshipExtractor } from \"./relationships\";\n\nexport interface HandlerAnalysis {\n handlers: MessageHandler[];\n messageTypes: Set<string>;\n}\n\nexport class HandlerExtractor {\n private project: Project;\n private typeGuardCache: WeakMap<SourceFile, Map<string, string>>;\n private relationshipExtractor: RelationshipExtractor;\n\n constructor(tsConfigPath: string) {\n this.project = new Project({\n tsConfigFilePath: tsConfigPath,\n });\n this.typeGuardCache = new WeakMap();\n this.relationshipExtractor = new RelationshipExtractor();\n }\n\n /**\n * Extract all message handlers from the codebase\n */\n extractHandlers(): HandlerAnalysis {\n const handlers: MessageHandler[] = [];\n const messageTypes = new Set<string>();\n const invalidMessageTypes = new Set<string>();\n\n // Find all source files\n const sourceFiles = this.project.getSourceFiles();\n this.debugLogSourceFiles(sourceFiles);\n\n for (const sourceFile of sourceFiles) {\n const fileHandlers = this.extractFromFile(sourceFile);\n handlers.push(...fileHandlers);\n this.categorizeHandlerMessageTypes(fileHandlers, messageTypes, invalidMessageTypes);\n }\n\n this.debugLogExtractionResults(handlers.length, invalidMessageTypes.size);\n\n return {\n handlers,\n messageTypes,\n };\n }\n\n private debugLogSourceFiles(sourceFiles: SourceFile[]): void {\n if (!process.env[\"POLLY_DEBUG\"]) return;\n\n console.log(`[DEBUG] Loaded ${sourceFiles.length} source files`);\n if (sourceFiles.length <= 20) {\n for (const sf of sourceFiles) {\n console.log(`[DEBUG] - ${sf.getFilePath()}`);\n }\n }\n }\n\n private categorizeHandlerMessageTypes(\n handlers: MessageHandler[],\n messageTypes: Set<string>,\n invalidMessageTypes: Set<string>\n ): void {\n for (const handler of handlers) {\n if (this.isValidTLAIdentifier(handler.messageType)) {\n messageTypes.add(handler.messageType);\n } else {\n invalidMessageTypes.add(handler.messageType);\n }\n }\n }\n\n private debugLogExtractionResults(handlerCount: number, invalidCount: number): void {\n if (!process.env[\"POLLY_DEBUG\"]) return;\n\n console.log(`[DEBUG] Total handlers extracted: ${handlerCount}`);\n if (invalidCount > 0) {\n console.log(`[DEBUG] Filtered ${invalidCount} invalid message type(s) from handlers`);\n }\n }\n\n /**\n * Check if a string is a valid TLA+ identifier\n * TLA+ identifiers must:\n * - Start with a letter (a-zA-Z)\n * - Contain only letters, digits, and underscores\n * - Not be empty\n */\n private isValidTLAIdentifier(s: string): boolean {\n if (!s || s.length === 0) {\n return false;\n }\n // TLA+ identifiers: start with letter, contain only alphanumeric + underscore\n return /^[a-zA-Z][a-zA-Z0-9_]*$/.test(s);\n }\n\n /**\n * Extract handlers from a single source file\n */\n private extractFromFile(sourceFile: SourceFile): MessageHandler[] {\n const handlers: MessageHandler[] = [];\n const filePath = sourceFile.getFilePath();\n const context = this.inferContext(filePath);\n\n sourceFile.forEachDescendant((node) => {\n this.processNodeForHandlers(node, context, filePath, handlers);\n });\n\n return handlers;\n }\n\n /**\n * Process a single node to find handler patterns\n */\n private processNodeForHandlers(\n node: Node,\n context: string,\n filePath: string,\n handlers: MessageHandler[]\n ): void {\n if (Node.isCallExpression(node)) {\n this.processCallExpressionHandler(node, context, filePath, handlers);\n }\n\n if (Node.isSwitchStatement(node)) {\n const switchHandlers = this.extractSwitchCaseHandlers(node, context, filePath);\n handlers.push(...switchHandlers);\n }\n\n if (Node.isVariableDeclaration(node)) {\n const mapHandlers = this.extractHandlerMapPattern(node, context, filePath);\n handlers.push(...mapHandlers);\n }\n\n if (Node.isIfStatement(node) && !this.isElseIfStatement(node)) {\n const typeGuardHandlers = this.extractTypeGuardHandlers(node, context, filePath);\n handlers.push(...typeGuardHandlers);\n }\n }\n\n /**\n * Process call expression to find .on() or .addEventListener() handlers\n */\n private processCallExpressionHandler(\n node: CallExpression,\n context: string,\n filePath: string,\n handlers: MessageHandler[]\n ): void {\n const expression = node.getExpression();\n\n if (Node.isPropertyAccessExpression(expression)) {\n const methodName = expression.getName();\n\n if (methodName === \"on\" || methodName === \"addEventListener\") {\n const handler = this.extractHandler(node, context, filePath);\n if (handler) {\n handlers.push(handler);\n }\n }\n }\n }\n\n /**\n * Check if a node is an else-if statement\n */\n private isElseIfStatement(node: Node): boolean {\n const parent = node.getParent();\n return parent !== undefined && Node.isIfStatement(parent);\n }\n\n /**\n * Extract handler details from a .on() call expression\n */\n private extractHandler(\n callExpr: CallExpression,\n context: string,\n filePath: string\n ): MessageHandler | null {\n const args = callExpr.getArguments();\n\n if (args.length < 2) {\n return null;\n }\n\n // First argument should be the message type (string literal)\n const messageTypeArg = args[0];\n let messageType: string | null = null;\n\n if (Node.isStringLiteral(messageTypeArg)) {\n messageType = messageTypeArg.getLiteralValue();\n } else if (Node.isTemplateExpression(messageTypeArg)) {\n // Handle template literals if needed\n messageType = messageTypeArg.getText().replace(/[`'\"]/g, \"\");\n }\n\n if (!messageType) {\n return null;\n }\n\n // Second argument is the handler function\n const handlerArg = args[1];\n const assignments: StateAssignment[] = [];\n const preconditions: VerificationCondition[] = [];\n const postconditions: VerificationCondition[] = [];\n\n // Parse the handler function for state assignments and verification conditions\n if (Node.isArrowFunction(handlerArg) || Node.isFunctionExpression(handlerArg)) {\n this.extractAssignments(handlerArg, assignments);\n this.extractVerificationConditions(handlerArg, preconditions, postconditions);\n\n // Check for async mutations (potential race conditions)\n this.checkAsyncMutations(handlerArg, messageType);\n }\n\n const line = callExpr.getStartLineNumber();\n\n // Extract relationships from handler code\n const sourceFile = callExpr.getSourceFile();\n const handlerName = `${messageType}_handler`;\n let relationships: ComponentRelationship[] | undefined;\n\n if (Node.isArrowFunction(handlerArg) || Node.isFunctionExpression(handlerArg)) {\n const detectedRelationships = this.relationshipExtractor.extractFromHandler(\n handlerArg,\n sourceFile,\n handlerName\n );\n if (detectedRelationships.length > 0) {\n relationships = detectedRelationships;\n }\n }\n\n return {\n messageType,\n node: context, // Renamed from 'context' to 'node' for generalization\n assignments,\n preconditions,\n postconditions,\n location: {\n file: filePath,\n line,\n },\n relationships,\n };\n }\n\n /**\n * Extract state assignments from a handler function\n * Handles:\n * - Simple assignments: state.field = value\n * - Compound operators: state.count += 1\n * - Array mutations: state.items.push(item)\n * - Array indexing: state.items[0] = value\n */\n private extractAssignments(\n funcNode: ArrowFunction | FunctionExpression,\n assignments: StateAssignment[]\n ): void {\n funcNode.forEachDescendant((node: Node) => {\n if (Node.isBinaryExpression(node)) {\n this.extractBinaryExpressionAssignment(node, assignments);\n }\n\n if (Node.isCallExpression(node)) {\n this.extractArrayMutationAssignment(node, assignments);\n }\n });\n }\n\n /**\n * Extract assignments from binary expressions (=, +=, -=, etc.)\n */\n private extractBinaryExpressionAssignment(node: Node, assignments: StateAssignment[]): void {\n if (!Node.isBinaryExpression(node)) return;\n\n const operator = node.getOperatorToken().getText();\n\n if (operator === \"=\") {\n this.extractSimpleOrElementAccessAssignment(node, assignments);\n } else if ([\"+=\", \"-=\", \"*=\", \"/=\", \"%=\"].includes(operator)) {\n this.extractCompoundAssignment(node, assignments);\n }\n }\n\n /**\n * Extract simple or element access assignments (state.field = value or state.items[0] = value)\n */\n private extractSimpleOrElementAccessAssignment(node: Node, assignments: StateAssignment[]): void {\n if (!Node.isBinaryExpression(node)) return;\n\n const left = node.getLeft();\n const right = node.getRight();\n\n if (Node.isPropertyAccessExpression(left)) {\n this.extractPropertyAccessAssignment(left, right, assignments);\n } else if (Node.isElementAccessExpression(left)) {\n this.extractElementAccessAssignment(left, right, assignments);\n }\n }\n\n /**\n * Extract property access assignment (state.field = value)\n */\n private extractPropertyAccessAssignment(\n left: Node,\n right: Node,\n assignments: StateAssignment[]\n ): void {\n if (!Node.isPropertyAccessExpression(left)) return;\n\n const fieldPath = this.getPropertyPath(left);\n if (fieldPath.startsWith(\"state.\")) {\n const field = fieldPath.substring(6);\n const value = this.extractValue(right);\n if (value !== undefined) {\n assignments.push({ field, value });\n }\n }\n }\n\n /**\n * Extract element access assignment (state.items[index] = value)\n */\n private extractElementAccessAssignment(\n left: Node,\n right: Node,\n assignments: StateAssignment[]\n ): void {\n if (!Node.isElementAccessExpression(left)) return;\n\n const expr = left.getExpression();\n if (!Node.isPropertyAccessExpression(expr)) return;\n\n const fieldPath = this.getPropertyPath(expr);\n if (!fieldPath.startsWith(\"state.\")) return;\n\n const field = fieldPath.substring(6);\n const indexExpr = left.getArgumentExpression();\n const index = indexExpr ? indexExpr.getText() : \"0\";\n const value = this.extractValue(right);\n\n if (value !== undefined) {\n const tlaIndex = this.isNumericLiteral(index)\n ? (Number.parseInt(index, 10) + 1).toString()\n : `${index} + 1`;\n assignments.push({\n field: `${field}[${tlaIndex}]`,\n value,\n });\n }\n }\n\n /**\n * Extract compound assignments (+=, -=, *=, /=, %=)\n */\n private extractCompoundAssignment(node: Node, assignments: StateAssignment[]): void {\n if (!Node.isBinaryExpression(node)) return;\n\n const operator = node.getOperatorToken().getText();\n const left = node.getLeft();\n const right = node.getRight();\n\n if (Node.isPropertyAccessExpression(left)) {\n const fieldPath = this.getPropertyPath(left);\n if (fieldPath.startsWith(\"state.\")) {\n const field = fieldPath.substring(6);\n const rightValue = right.getText();\n const tlaOp = operator.slice(0, -1); // Remove '=' suffix\n assignments.push({\n field,\n value: `@ ${tlaOp} ${rightValue}`,\n });\n }\n }\n }\n\n /**\n * Extract array mutation assignments (push, pop, shift, unshift, splice)\n */\n private extractArrayMutationAssignment(node: Node, assignments: StateAssignment[]): void {\n if (!Node.isCallExpression(node)) return;\n\n const expr = node.getExpression();\n if (!Node.isPropertyAccessExpression(expr)) return;\n\n const methodName = expr.getName();\n const object = expr.getExpression();\n\n if (Node.isPropertyAccessExpression(object)) {\n const fieldPath = this.getPropertyPath(object);\n if (fieldPath.startsWith(\"state.\")) {\n const field = fieldPath.substring(6);\n const args = node.getArguments().map((arg) => arg.getText());\n const tlaValue = this.translateArrayMethod(methodName, args, fieldPath);\n\n if (tlaValue) {\n assignments.push({ field, value: tlaValue });\n }\n }\n }\n }\n\n /**\n * Translate array mutation methods to TLA+ operators\n */\n private translateArrayMethod(\n methodName: string,\n args: string[],\n fieldPath: string\n ): string | null {\n switch (methodName) {\n case \"push\":\n return args.length === 1 ? `Append(@, ${args[0]})` : null;\n\n case \"pop\":\n return \"SubSeq(@, 1, Len(@)-1)\";\n\n case \"shift\":\n return \"Tail(@)\";\n\n case \"unshift\":\n return args.length === 1 ? `<<${args[0]}>> \\\\o @` : null;\n\n case \"splice\":\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Warning: splice() mutation on ${fieldPath} not fully translated`);\n }\n return null;\n\n default:\n return null;\n }\n }\n\n /**\n * Check for async mutations that could cause race conditions\n * Warns when async handlers have state mutations after await expressions\n */\n private checkAsyncMutations(\n funcNode: ArrowFunction | FunctionExpression,\n messageType: string\n ): void {\n // Check if function is async\n const isAsync =\n funcNode.hasModifier?.(SyntaxKind.AsyncKeyword) ||\n funcNode.getModifiers?.()?.some((m: Node) => m.getKind() === SyntaxKind.AsyncKeyword);\n\n if (!isAsync) {\n return; // Not async, no race conditions possible\n }\n\n // Find all await expressions\n const awaitExpressions: Node[] = [];\n funcNode.forEachDescendant((node: Node) => {\n if (Node.isAwaitExpression(node)) {\n awaitExpressions.push(node);\n }\n });\n\n if (awaitExpressions.length === 0) {\n return; // No awaits, no interleaving possible\n }\n\n // Find all state mutations\n const mutations: Array<{ field: string; line: number; afterAwait: boolean }> = [];\n const body = funcNode.getBody();\n\n if (!body) {\n return;\n }\n\n // Get position of first await\n const firstAwaitPos = awaitExpressions[0].getStart();\n\n // Track mutations and whether they occur after await\n funcNode.forEachDescendant((node: Node) => {\n if (Node.isBinaryExpression(node)) {\n this.checkBinaryExpressionMutation(node, firstAwaitPos, mutations);\n }\n\n if (Node.isCallExpression(node)) {\n this.checkCallExpressionMutation(node, firstAwaitPos, mutations);\n }\n });\n\n // Filter to mutations after await\n const mutationsAfterAwait = mutations.filter((m) => m.afterAwait);\n\n if (mutationsAfterAwait.length > 0 && process.env[\"POLLY_DEBUG\"]) {\n console.log(\n `[DEBUG] Warning: Async handler for '${messageType}' has ${mutationsAfterAwait.length} state mutation(s) after await`\n );\n console.log(\n \"[DEBUG] This may cause race conditions if multiple messages are processed concurrently\"\n );\n console.log(\n `[DEBUG] Mutations: ${mutationsAfterAwait.map((m) => `${m.field} (line ${m.line})`).join(\", \")}`\n );\n }\n }\n\n /**\n * Extract verification conditions (requires/ensures) from a handler function\n */\n private extractVerificationConditions(\n funcNode: ArrowFunction | FunctionExpression,\n preconditions: VerificationCondition[],\n postconditions: VerificationCondition[]\n ): void {\n const body = funcNode.getBody();\n const statements = Node.isBlock(body) ? body.getStatements() : [body];\n\n for (const statement of statements) {\n this.processStatementForConditions(statement, preconditions, postconditions);\n }\n }\n\n /**\n * Process a statement to extract verification conditions\n */\n private processStatementForConditions(\n statement: Node | Statement,\n preconditions: VerificationCondition[],\n postconditions: VerificationCondition[]\n ): void {\n if (!Node.isExpressionStatement(statement)) return;\n\n const expr = statement.getExpression();\n if (!Node.isCallExpression(expr)) return;\n\n const callee = expr.getExpression();\n if (!Node.isIdentifier(callee)) return;\n\n const functionName = callee.getText();\n\n if (functionName === \"requires\") {\n const condition = this.extractCondition(expr);\n if (condition) {\n preconditions.push(condition);\n }\n } else if (functionName === \"ensures\") {\n const condition = this.extractCondition(expr);\n if (condition) {\n postconditions.push(condition);\n }\n }\n }\n\n /**\n * Extract condition from a requires() or ensures() call\n */\n private extractCondition(callExpr: CallExpression): VerificationCondition | null {\n const args = callExpr.getArguments();\n\n if (args.length === 0) {\n return null;\n }\n\n // First argument is the condition expression\n const conditionArg = args[0];\n const expression = conditionArg.getText();\n\n // Second argument (optional) is the message\n let message: string | undefined;\n if (args.length >= 2 && Node.isStringLiteral(args[1])) {\n message = args[1].getLiteralValue();\n }\n\n const line = callExpr.getStartLineNumber();\n const column = callExpr.getStartLinePos();\n\n return {\n expression,\n message,\n location: {\n line,\n column,\n },\n };\n }\n\n /**\n * Get the full property access path (e.g., \"state.user.loggedIn\")\n */\n private getPropertyPath(node: PropertyAccessExpression | Node): string {\n const parts: string[] = [];\n\n let current = node;\n while (Node.isPropertyAccessExpression(current)) {\n parts.unshift(current.getName());\n current = current.getExpression();\n }\n\n // Add the base identifier\n if (Node.isIdentifier(current)) {\n parts.unshift(current.getText());\n }\n\n return parts.join(\".\");\n }\n\n /**\n * Extract a literal value from an expression\n */\n private extractValue(node: Node): string | boolean | number | null | undefined {\n if (Node.isStringLiteral(node)) {\n return node.getLiteralValue();\n }\n\n if (Node.isNumericLiteral(node)) {\n return node.getLiteralValue();\n }\n\n if (node.getKind() === SyntaxKind.TrueKeyword) {\n return true;\n }\n\n if (node.getKind() === SyntaxKind.FalseKeyword) {\n return false;\n }\n\n if (node.getKind() === SyntaxKind.NullKeyword) {\n return null;\n }\n\n // For complex expressions, return undefined (can't extract)\n return undefined;\n }\n\n /**\n * Check if a string represents a numeric literal\n */\n private isNumericLiteral(str: string): boolean {\n return /^\\d+$/.test(str);\n }\n\n /**\n * Extract handlers from switch/case message router patterns\n * Detects: switch(message.type) { case 'EVENT': handler(); }\n */\n private extractSwitchCaseHandlers(\n switchNode: SwitchStatement,\n context: string,\n filePath: string\n ): MessageHandler[] {\n const handlers: MessageHandler[] = [];\n\n try {\n // Check if switching on message.type or similar\n const expression = switchNode.getExpression();\n const expressionText = expression.getText();\n\n // Look for patterns like: message.type, data.type, msg.type, event.type\n if (!/\\.(type|kind|event|action)/.test(expressionText)) {\n return handlers;\n }\n\n // Extract handlers from each case clause\n const caseClauses = switchNode.getClauses();\n for (const clause of caseClauses) {\n if (Node.isCaseClause(clause)) {\n const caseExpr = clause.getExpression();\n\n // Extract message type from case expression\n let messageType: string | null = null;\n if (Node.isStringLiteral(caseExpr)) {\n messageType = caseExpr.getLiteralValue();\n }\n\n if (messageType) {\n const line = clause.getStartLineNumber();\n\n handlers.push({\n messageType,\n node: context,\n assignments: [],\n preconditions: [],\n postconditions: [],\n location: { file: filePath, line },\n });\n }\n }\n }\n } catch (_error) {\n // Skip malformed switch statements\n }\n\n return handlers;\n }\n\n /**\n * Extract handlers from handler map patterns\n * Detects: const handlers = { 'EVENT': handlerFn, ... }\n */\n private extractHandlerMapPattern(\n varDecl: VariableDeclaration,\n context: string,\n filePath: string\n ): MessageHandler[] {\n const handlers: MessageHandler[] = [];\n\n try {\n const initializer = varDecl.getInitializer();\n if (!this.isHandlerMapInitializer(initializer, varDecl)) {\n return handlers;\n }\n\n // Extract handlers from object properties\n const properties = initializer.getProperties();\n for (const prop of properties) {\n const handler = this.extractHandlerFromProperty(prop, context, filePath);\n if (handler) {\n handlers.push(handler);\n }\n }\n } catch (_error) {\n // Skip malformed object literals\n }\n\n return handlers;\n }\n\n /**\n * Check if initializer is a valid handler map\n */\n private isHandlerMapInitializer(\n initializer: Node | undefined,\n varDecl: VariableDeclaration\n ): initializer is ObjectLiteralExpression {\n if (!initializer || !Node.isObjectLiteralExpression(initializer)) {\n return false;\n }\n\n // Check if variable name suggests it's a handler map\n const varName = varDecl.getName().toLowerCase();\n return /(handler|listener|callback|event)s?/.test(varName);\n }\n\n /**\n * Extract handler from a property assignment in a handler map\n */\n private extractHandlerFromProperty(\n prop: Node,\n context: string,\n filePath: string\n ): MessageHandler | null {\n if (!Node.isPropertyAssignment(prop)) {\n return null;\n }\n\n const nameNode = prop.getNameNode();\n const messageType = this.getMessageTypeFromPropertyName(nameNode);\n\n if (!messageType) {\n return null;\n }\n\n const line = prop.getStartLineNumber();\n return {\n messageType,\n node: context,\n assignments: [],\n preconditions: [],\n postconditions: [],\n location: { file: filePath, line },\n };\n }\n\n /**\n * Extract message type from property name node\n */\n private getMessageTypeFromPropertyName(nameNode: Node): string | null {\n if (Node.isStringLiteral(nameNode)) {\n return nameNode.getLiteralValue();\n }\n if (Node.isIdentifier(nameNode)) {\n return nameNode.getText();\n }\n return null;\n }\n\n /**\n * Extract handlers from type guard if/else-if patterns\n * Detects: if (isQueryMessage(msg)) { handleQuery(msg); }\n */\n private extractTypeGuardHandlers(\n ifNode: Node,\n context: string,\n filePath: string\n ): MessageHandler[] {\n const handlers: MessageHandler[] = [];\n\n try {\n const sourceFile = ifNode.getSourceFile();\n const typeGuards = this.getOrComputeTypeGuards(sourceFile);\n\n this.debugLogTypeGuards(sourceFile, typeGuards);\n this.processIfElseChain(ifNode as IfStatement, typeGuards, context, filePath, handlers);\n } catch (error) {\n this.debugLogError(error);\n }\n\n return handlers;\n }\n\n /**\n * Get cached type guards or compute if not cached\n */\n private getOrComputeTypeGuards(sourceFile: SourceFile): Map<string, string> {\n let typeGuards = this.typeGuardCache.get(sourceFile);\n if (!typeGuards) {\n typeGuards = this.findTypePredicateFunctions(sourceFile);\n this.typeGuardCache.set(sourceFile, typeGuards);\n }\n return typeGuards;\n }\n\n /**\n * Debug log type guards found in source file\n */\n private debugLogTypeGuards(sourceFile: SourceFile, typeGuards: Map<string, string>): void {\n if (!process.env[\"POLLY_DEBUG\"]) return;\n\n console.log(`[DEBUG] File: ${sourceFile.getBaseName()}`);\n console.log(`[DEBUG] Local type guards found: ${typeGuards.size}`);\n\n if (typeGuards.size > 0) {\n for (const [name, type] of typeGuards.entries()) {\n console.log(`[DEBUG] - ${name} → ${type}`);\n }\n }\n }\n\n /**\n * Process if-else-if chain to extract handlers\n */\n private processIfElseChain(\n currentIf: IfStatement,\n typeGuards: Map<string, string>,\n context: string,\n filePath: string,\n handlers: MessageHandler[]\n ): void {\n let ifStatement = currentIf;\n while (ifStatement) {\n const handler = this.extractHandlerFromIfClause(ifStatement, typeGuards, context, filePath);\n\n if (handler) {\n handlers.push(handler);\n this.debugLogFoundHandler(handler);\n }\n\n // Check for else-if\n const elseStatement = ifStatement.getElseStatement();\n if (elseStatement && Node.isIfStatement(elseStatement)) {\n ifStatement = elseStatement;\n } else {\n break;\n }\n }\n }\n\n /**\n * Debug log found handler\n */\n private debugLogFoundHandler(handler: MessageHandler): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Found handler: ${handler.messageType} at line ${handler.location.line}`);\n }\n }\n\n /**\n * Debug log error\n */\n private debugLogError(error: unknown): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Error in extractTypeGuardHandlers: ${error}`);\n }\n }\n\n /**\n * Extract handler from a single if clause\n */\n private extractHandlerFromIfClause(\n ifNode: Node,\n typeGuards: Map<string, string>,\n context: string,\n filePath: string\n ): MessageHandler | null {\n try {\n const ifStmt = ifNode as IfStatement;\n const condition = ifStmt.getExpression();\n\n if (!Node.isCallExpression(condition)) {\n return null;\n }\n\n const funcExpr = condition.getExpression();\n const funcName = Node.isIdentifier(funcExpr) ? funcExpr.getText() : undefined;\n\n this.debugLogProcessingFunction(funcName);\n\n const messageType = this.resolveMessageType(funcExpr, funcName, typeGuards);\n if (!messageType) {\n this.debugLogUnresolvedMessageType(funcName);\n return null;\n }\n\n const line = ifStmt.getStartLineNumber();\n const relationships = this.extractRelationshipsFromIfBlock(ifStmt, messageType);\n\n return {\n messageType,\n node: context,\n assignments: [],\n preconditions: [],\n postconditions: [],\n location: { file: filePath, line },\n relationships,\n };\n } catch (_error) {\n return null;\n }\n }\n\n /**\n * Debug log processing function\n */\n private debugLogProcessingFunction(funcName: string | undefined): void {\n if (process.env[\"POLLY_DEBUG\"] && funcName) {\n console.log(`[DEBUG] Processing if condition with function: ${funcName}`);\n }\n }\n\n /**\n * Debug log unresolved message type\n */\n private debugLogUnresolvedMessageType(funcName: string | undefined): void {\n if (process.env[\"POLLY_DEBUG\"] && funcName) {\n console.log(`[DEBUG] Could not resolve message type for: ${funcName}`);\n }\n }\n\n /**\n * Resolve message type from function expression\n */\n private resolveMessageType(\n funcExpr: Node,\n funcName: string | undefined,\n typeGuards: Map<string, string>\n ): string | undefined {\n if (funcName && typeGuards.has(funcName)) {\n const guardType = typeGuards.get(funcName);\n if (guardType) {\n this.debugLogFoundInLocalTypeGuards(funcName, guardType);\n return guardType;\n }\n }\n\n if (Node.isIdentifier(funcExpr)) {\n this.debugLogTryingImportResolution(funcName);\n return this.resolveImportedTypeGuard(funcExpr) ?? undefined;\n }\n\n return undefined;\n }\n\n /**\n * Debug log found in local type guards\n */\n private debugLogFoundInLocalTypeGuards(funcName: string, messageType: string): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Found in local type guards: ${funcName} → ${messageType}`);\n }\n }\n\n /**\n * Debug log trying import resolution\n */\n private debugLogTryingImportResolution(funcName: string | undefined): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Not found locally, trying import resolution for: ${funcName}`);\n }\n }\n\n /**\n * Extract relationships from if block\n */\n private extractRelationshipsFromIfBlock(\n ifStmt: IfStatement,\n messageType: string\n ): ComponentRelationship[] | undefined {\n const thenStatement = ifStmt.getThenStatement();\n if (!thenStatement) {\n return undefined;\n }\n\n const sourceFile = ifStmt.getSourceFile();\n const handlerName = `${messageType}_handler`;\n const detectedRelationships = this.relationshipExtractor.extractFromHandler(\n thenStatement,\n sourceFile,\n handlerName\n );\n\n return detectedRelationships.length > 0 ? detectedRelationships : undefined;\n }\n\n /**\n * Find all type predicate functions in a source file\n * Returns a map of function name → message type\n * Uses AST-based detection for consistency with imported type guard resolution\n */\n private findTypePredicateFunctions(sourceFile: SourceFile): Map<string, string> {\n const typeGuards = new Map<string, string>();\n\n sourceFile.forEachDescendant((node) => {\n this.processTypePredicate(node, typeGuards);\n });\n\n return typeGuards;\n }\n\n /**\n * Process a node that might be a type predicate function\n */\n private processTypePredicate(node: Node, typeGuards: Map<string, string>): void {\n if (!this.isFunctionNode(node)) {\n return;\n }\n\n const returnTypeNode = node.getReturnTypeNode();\n if (!returnTypeNode || !Node.isTypePredicate(returnTypeNode)) {\n return;\n }\n\n const functionName = this.extractFunctionName(node);\n if (!functionName) {\n return;\n }\n\n const messageType = this.extractMessageTypeFromTypePredicateFunction(node, returnTypeNode);\n if (messageType) {\n typeGuards.set(functionName, messageType);\n }\n }\n\n /**\n * Extract function name from function node\n */\n private extractFunctionName(\n node: FunctionDeclaration | FunctionExpression | ArrowFunction\n ): string | undefined {\n if (Node.isFunctionDeclaration(node)) {\n return node.getName();\n }\n\n if (Node.isFunctionExpression(node) || Node.isArrowFunction(node)) {\n return this.extractFunctionNameFromVariable(node);\n }\n\n return undefined;\n }\n\n /**\n * Extract function name from variable declaration\n */\n private extractFunctionNameFromVariable(\n node: FunctionExpression | ArrowFunction\n ): string | undefined {\n const parent = node.getParent();\n if (Node.isVariableDeclaration(parent)) {\n return parent.getName();\n }\n return undefined;\n }\n\n /**\n * Extract message type from type predicate function\n */\n private extractMessageTypeFromTypePredicateFunction(\n node: FunctionDeclaration | FunctionExpression | ArrowFunction,\n returnTypeNode: Node\n ): string | null {\n const typeNode = returnTypeNode.getTypeNode();\n\n if (typeNode) {\n const typeName = typeNode.getText();\n const messageType = this.extractMessageTypeFromTypeName(typeName);\n if (messageType) {\n return messageType;\n }\n }\n\n return this.extractMessageTypeFromFunctionBodyText(node);\n }\n\n /**\n * Extract message type from function body text\n */\n private extractMessageTypeFromFunctionBodyText(\n node: FunctionDeclaration | FunctionExpression | ArrowFunction\n ): string | null {\n const body = node.getBody();\n if (!body) {\n return null;\n }\n\n const bodyText = body.getText();\n const typeValueMatch = bodyText.match(/\\.type\\s*===?\\s*['\"](\\w+)['\"]/);\n\n if (typeValueMatch) {\n return typeValueMatch[1] ?? null;\n }\n\n return null;\n }\n\n /**\n * Resolve type guard from imported function\n * Uses ts-morph symbol resolution to find definition across files\n * Checks AST structure, not resolved types (which can lose type predicate info)\n */\n private resolveImportedTypeGuard(identifier: Identifier): string | null {\n try {\n const funcName = identifier.getText();\n const definitions = identifier.getDefinitionNodes();\n\n if (definitions.length === 0) {\n this.debugLogNoDefinitions(funcName);\n return null;\n }\n\n for (const def of definitions) {\n const messageType = this.tryExtractTypeGuardFromDefinition(def, funcName);\n if (messageType) {\n return messageType;\n }\n }\n } catch (error) {\n this.debugLogResolutionError(error);\n }\n\n return null;\n }\n\n /**\n * Try to extract type guard from a single function definition\n */\n private tryExtractTypeGuardFromDefinition(def: Node, funcName: string): string | null {\n if (!this.isFunctionNode(def)) {\n return null;\n }\n\n const returnTypeNode = def.getReturnTypeNode();\n this.debugLogReturnTypeInfo(funcName, def, returnTypeNode);\n\n const typePredicateResult = this.extractFromTypePredicate(returnTypeNode, funcName);\n if (typePredicateResult) {\n return typePredicateResult;\n }\n\n return this.extractFromFunctionBody(def, funcName);\n }\n\n /**\n * Check if node is a function type\n */\n private isFunctionNode(\n node: Node\n ): node is FunctionDeclaration | FunctionExpression | ArrowFunction {\n return (\n Node.isFunctionDeclaration(node) ||\n Node.isFunctionExpression(node) ||\n Node.isArrowFunction(node)\n );\n }\n\n /**\n * Extract message type from type predicate node\n */\n private extractFromTypePredicate(\n returnTypeNode: Node | undefined,\n funcName: string\n ): string | null {\n if (!returnTypeNode || !Node.isTypePredicate(returnTypeNode)) {\n return null;\n }\n\n const typeNode = returnTypeNode.getTypeNode();\n if (!typeNode) {\n return null;\n }\n\n const typeName = typeNode.getText();\n const messageType = this.extractMessageTypeFromTypeName(typeName);\n\n if (messageType) {\n this.debugLogTypePredicateResolution(funcName, messageType);\n return messageType;\n }\n\n return null;\n }\n\n /**\n * Extract message type from function body\n */\n private extractFromFunctionBody(\n def: FunctionDeclaration | FunctionExpression | ArrowFunction,\n funcName: string\n ): string | null {\n const body = def.getBody();\n if (!body) {\n return null;\n }\n\n const bodyText = body.getText();\n const typeValueMatch = bodyText.match(/\\.type\\s*===?\\s*['\"](\\w+)['\"]/);\n\n if (typeValueMatch) {\n const messageType = typeValueMatch[1] ?? null;\n this.debugLogBodyResolution(funcName, messageType);\n return messageType;\n }\n\n return null;\n }\n\n /**\n * Debug: Log no definitions found\n */\n private debugLogNoDefinitions(funcName: string): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] No definitions found for imported function: ${funcName}`);\n }\n }\n\n /**\n * Debug: Log return type info\n */\n private debugLogReturnTypeInfo(\n funcName: string,\n def: FunctionDeclaration | FunctionExpression | ArrowFunction,\n returnTypeNode: Node | undefined\n ): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n const returnType = def.getReturnType().getText();\n console.log(`[DEBUG] Function ${funcName} return type (resolved): ${returnType}`);\n console.log(`[DEBUG] Has return type node: ${!!returnTypeNode}`);\n console.log(\n `[DEBUG] Is type predicate node: ${returnTypeNode && Node.isTypePredicate(returnTypeNode)}`\n );\n }\n }\n\n /**\n * Debug: Log type predicate resolution\n */\n private debugLogTypePredicateResolution(funcName: string, messageType: string): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Resolved ${funcName} → ${messageType} (from AST type predicate)`);\n }\n }\n\n /**\n * Debug: Log body resolution\n */\n private debugLogBodyResolution(funcName: string, messageType: string | null): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Resolved ${funcName} → ${messageType} (from body)`);\n }\n }\n\n /**\n * Debug: Log resolution error\n */\n private debugLogResolutionError(error: unknown): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Error resolving imported type guard: ${error}`);\n }\n }\n\n /**\n * Extract message type from TypeScript type name\n * Examples:\n * QueryMessage → query\n * CommandMessage → command\n * SubscribeMessage → subscribe\n */\n private extractMessageTypeFromTypeName(typeName: string): string {\n // Remove common suffixes and convert to lowercase\n const messageType = typeName\n .replace(/Message$/, \"\")\n .replace(/Event$/, \"\")\n .replace(/Request$/, \"\")\n .replace(/Command$/, \"\")\n .replace(/Query$/, \"\")\n .toLowerCase();\n\n return messageType;\n }\n\n /**\n * Infer the context (background, content, popup, etc.) from file path\n */\n private inferContext(filePath: string): string {\n const path = filePath.toLowerCase();\n\n // Check contexts in priority order\n return (\n this.inferElectronContext(path) ||\n this.inferWorkerContext(path) ||\n this.inferServerAppContext(path) ||\n this.inferChromeExtensionContext(path) ||\n \"unknown\"\n );\n }\n\n /**\n * Infer Electron context (main, renderer, preload)\n */\n private inferElectronContext(path: string): string | null {\n if (\n path.includes(\"main.ts\") ||\n path.includes(\"main.js\") ||\n path.includes(\"/main/\") ||\n path.includes(\"\\\\main\\\\\")\n ) {\n return \"main\";\n }\n\n if (\n path.includes(\"/renderer/\") ||\n path.includes(\"\\\\renderer\\\\\") ||\n path.includes(\"renderer.ts\") ||\n path.includes(\"renderer.js\")\n ) {\n return \"renderer\";\n }\n\n if (path.includes(\"preload.ts\") || path.includes(\"preload.js\")) {\n return \"preload\";\n }\n\n return null;\n }\n\n /**\n * Infer Worker/PWA context\n */\n private inferWorkerContext(path: string): string | null {\n if (path.includes(\"service-worker\") || path.includes(\"sw.ts\") || path.includes(\"sw.js\")) {\n return \"worker\";\n }\n\n if (path.includes(\"/worker/\") || path.includes(\"\\\\worker\\\\\")) {\n return \"worker\";\n }\n\n return null;\n }\n\n /**\n * Infer WebSocket/server app context\n */\n private inferServerAppContext(path: string): string | null {\n if (\n path.includes(\"/server/\") ||\n path.includes(\"\\\\server\\\\\") ||\n path.includes(\"/server.\") ||\n path.includes(\"server.ts\") ||\n path.includes(\"server.js\")\n ) {\n return \"server\";\n }\n\n if (path.includes(\"/client/\") || path.includes(\"\\\\client\\\\\") || path.includes(\"/client.\")) {\n return \"client\";\n }\n\n return null;\n }\n\n /**\n * Infer Chrome extension context\n */\n private inferChromeExtensionContext(path: string): string | null {\n if (path.includes(\"/background/\") || path.includes(\"\\\\background\\\\\")) {\n return \"background\";\n }\n\n if (path.includes(\"/content/\") || path.includes(\"\\\\content\\\\\")) {\n return \"content\";\n }\n\n if (path.includes(\"/popup/\") || path.includes(\"\\\\popup\\\\\")) {\n return \"popup\";\n }\n\n if (path.includes(\"/devtools/\") || path.includes(\"\\\\devtools\\\\\")) {\n return \"devtools\";\n }\n\n if (path.includes(\"/options/\") || path.includes(\"\\\\options\\\\\")) {\n return \"options\";\n }\n\n if (path.includes(\"/offscreen/\") || path.includes(\"\\\\offscreen\\\\\")) {\n return \"offscreen\";\n }\n\n return null;\n }\n\n /**\n * Check binary expression for state mutations\n */\n private checkBinaryExpressionMutation(\n node: Node,\n firstAwaitPos: number,\n mutations: Array<{ field: string; line: number; afterAwait: boolean }>\n ): void {\n if (!Node.isBinaryExpression(node)) return;\n\n const operator = node.getOperatorToken().getText();\n if (operator !== \"=\" && ![\"+=\", \"-=\", \"*=\", \"/=\", \"%=\"].includes(operator)) return;\n\n const left = node.getLeft();\n if (!Node.isPropertyAccessExpression(left) && !Node.isElementAccessExpression(left)) return;\n\n const fieldPath = Node.isPropertyAccessExpression(left)\n ? this.getPropertyPath(left)\n : this.getPropertyPath(left.getExpression());\n\n if (fieldPath.startsWith(\"state.\")) {\n const field = fieldPath.substring(6);\n const line = node.getStartLineNumber();\n const afterAwait = node.getStart() > firstAwaitPos;\n mutations.push({ field, line, afterAwait });\n }\n }\n\n /**\n * Check call expression for array mutation methods\n */\n private checkCallExpressionMutation(\n node: Node,\n firstAwaitPos: number,\n mutations: Array<{ field: string; line: number; afterAwait: boolean }>\n ): void {\n if (!Node.isCallExpression(node)) return;\n\n const expr = node.getExpression();\n if (!Node.isPropertyAccessExpression(expr)) return;\n\n const methodName = expr.getName();\n const object = expr.getExpression();\n\n if (!Node.isPropertyAccessExpression(object)) return;\n\n const fieldPath = this.getPropertyPath(object);\n if (!fieldPath.startsWith(\"state.\")) return;\n\n if ([\"push\", \"pop\", \"shift\", \"unshift\", \"splice\"].includes(methodName)) {\n const field = fieldPath.substring(6);\n const line = node.getStartLineNumber();\n const afterAwait = node.getStart() > firstAwaitPos;\n mutations.push({ field, line, afterAwait });\n }\n }\n}\n\nexport function extractHandlers(tsConfigPath: string): HandlerAnalysis {\n const extractor = new HandlerExtractor(tsConfigPath);\n return extractor.extractHandlers();\n}\n",
|
|
11
|
+
"// Component relationship extraction from TypeScript code\n// Detects function calls, imports, and dependencies between components\n\nimport {\n type ArrowFunction,\n type CallExpression,\n type FunctionDeclaration,\n type FunctionExpression,\n Node,\n type SourceFile,\n} from \"ts-morph\";\n\n/**\n * Represents a relationship between components detected from code analysis\n */\nexport interface DetectedRelationship {\n /** Source component (handler, service, etc.) */\n from: string;\n /** Target component being called/used */\n to: string;\n /** Description of the relationship */\n description: string;\n /** Technology/method used (e.g., \"Function Call\", \"Import\", \"SQL\", \"HTTP\") */\n technology?: string;\n /** Confidence level of this detection */\n confidence: \"high\" | \"medium\" | \"low\";\n /** Evidence supporting this detection */\n evidence: string[];\n}\n\n/**\n * Extracts component relationships from handler code\n */\nexport class RelationshipExtractor {\n /**\n * Extract relationships from a function/handler body\n */\n extractFromHandler(\n handlerNode: Node,\n sourceFile: SourceFile,\n handlerName: string\n ): DetectedRelationship[] {\n const relationships: DetectedRelationship[] = [];\n const visited = new Set<string>(); // Prevent infinite recursion\n\n this.extractFromNode(handlerNode, sourceFile, handlerName, relationships, visited);\n\n return this.deduplicateRelationships(relationships);\n }\n\n /**\n * Recursively extract relationships from a node and follow function calls\n */\n private extractFromNode(\n node: Node,\n sourceFile: SourceFile,\n handlerName: string,\n relationships: DetectedRelationship[],\n visited: Set<string>\n ): void {\n node.forEachDescendant((descendant) => {\n this.processDescendantNode(descendant, sourceFile, handlerName, relationships, visited);\n });\n }\n\n /**\n * Process a single descendant node for relationship extraction\n */\n private processDescendantNode(\n descendant: Node,\n sourceFile: SourceFile,\n handlerName: string,\n relationships: DetectedRelationship[],\n visited: Set<string>\n ): void {\n if (Node.isCallExpression(descendant)) {\n this.processCallExpression(descendant, sourceFile, handlerName, relationships, visited);\n }\n\n if (Node.isAwaitExpression(descendant)) {\n const rel = this.extractFromDatabaseCall(descendant, handlerName);\n if (rel) {\n relationships.push(rel);\n }\n }\n\n if (Node.isCallExpression(descendant) && descendant.getExpression().getText() === \"fetch\") {\n const rel = this.extractFromFetchCall(descendant, handlerName);\n if (rel) {\n relationships.push(rel);\n }\n }\n }\n\n /**\n * Process a call expression for relationship extraction\n */\n private processCallExpression(\n callExpr: CallExpression,\n sourceFile: SourceFile,\n handlerName: string,\n relationships: DetectedRelationship[],\n visited: Set<string>\n ): void {\n const expr = callExpr.getExpression();\n\n if (Node.isIdentifier(expr)) {\n this.processIdentifierCall(expr, sourceFile, handlerName, relationships, visited);\n return;\n }\n\n if (Node.isPropertyAccessExpression(expr)) {\n const rel = this.extractFromPropertyAccess(expr, handlerName);\n if (rel) {\n relationships.push(rel);\n return;\n }\n }\n\n const rel = this.extractFromFunctionCall(callExpr, handlerName, sourceFile);\n if (rel) {\n relationships.push(rel);\n }\n }\n\n /**\n * Process an identifier call (local or imported function)\n */\n private processIdentifierCall(\n identifier: Identifier,\n sourceFile: SourceFile,\n handlerName: string,\n relationships: DetectedRelationship[],\n visited: Set<string>\n ): void {\n const functionName = identifier.getText();\n const resolved = this.resolveFunctionDeclaration(functionName, sourceFile);\n\n if (resolved && !visited.has(functionName)) {\n this.followFunctionCall(\n functionName,\n resolved.functionDecl,\n resolved.sourceFile,\n handlerName,\n relationships,\n visited\n );\n return;\n }\n\n if (!resolved) {\n this.tryAddServiceCallRelationship(functionName, handlerName, relationships);\n }\n }\n\n /**\n * Resolve function declaration from name\n */\n private resolveFunctionDeclaration(\n functionName: string,\n sourceFile: SourceFile\n ): { functionDecl: FunctionDeclaration; sourceFile: SourceFile } | null {\n let functionDecl = sourceFile.getFunction(functionName);\n let targetSourceFile = sourceFile;\n\n if (!functionDecl) {\n const resolved = this.resolveImportedFunction(functionName, sourceFile);\n if (resolved) {\n functionDecl = resolved.functionDecl;\n targetSourceFile = resolved.sourceFile;\n }\n }\n\n if (!functionDecl) {\n return null;\n }\n\n return { functionDecl, sourceFile: targetSourceFile };\n }\n\n /**\n * Follow a function call recursively\n */\n private followFunctionCall(\n functionName: string,\n functionDecl: FunctionDeclaration,\n targetSourceFile: SourceFile,\n handlerName: string,\n relationships: DetectedRelationship[],\n visited: Set<string>\n ): void {\n visited.add(functionName);\n\n const body = functionDecl.getBody();\n if (body) {\n this.extractFromNode(body, targetSourceFile, handlerName, relationships, visited);\n }\n }\n\n /**\n * Try to add a service call relationship based on function name\n */\n private tryAddServiceCallRelationship(\n functionName: string,\n handlerName: string,\n relationships: DetectedRelationship[]\n ): void {\n const componentFromName = this.inferComponentFromFunctionName(functionName);\n if (componentFromName) {\n relationships.push({\n from: this.toComponentId(handlerName),\n to: componentFromName,\n description: `Calls ${functionName}()`,\n technology: \"Function Call\",\n confidence: \"medium\",\n evidence: [`Function call: ${functionName}`],\n });\n }\n }\n\n /**\n * Extract relationship from a function call\n */\n private extractFromFunctionCall(\n callExpr: CallExpression,\n handlerName: string,\n sourceFile: SourceFile\n ): DetectedRelationship | null {\n const expr = callExpr.getExpression();\n const exprText = expr.getText();\n\n // Skip common utility functions and built-ins\n const skipList = [\n \"console.\",\n \"JSON.\",\n \"Math.\",\n \"Object.\",\n \"Array.\",\n \"String.\",\n \"Number.\",\n \"Date.\",\n \"Promise.\",\n \"setTimeout\",\n \"setInterval\",\n \"clearTimeout\",\n \"clearInterval\",\n ];\n\n if (skipList.some((skip) => exprText.startsWith(skip))) {\n return null;\n }\n\n // Extract function name\n let functionName = exprText;\n let targetComponent: string | null = null;\n\n // Handle property access (e.g., db.getConnection() -> db_client)\n if (Node.isPropertyAccessExpression(expr)) {\n const objectExpr = expr.getExpression();\n const objectName = objectExpr.getText();\n const methodName = expr.getName();\n\n // Map common patterns to component names\n targetComponent = this.inferComponentFromCall(objectName);\n\n if (!targetComponent) {\n return null;\n }\n\n functionName = methodName;\n } else {\n // Direct function call - try to resolve from imports\n targetComponent = this.resolveComponentFromImport(exprText, sourceFile);\n\n if (!targetComponent) {\n return null;\n }\n }\n\n return {\n from: this.toComponentId(handlerName),\n to: targetComponent,\n description: `Calls ${functionName}()`,\n technology: \"Function Call\",\n confidence: \"high\",\n evidence: [`Function call: ${exprText}`],\n };\n }\n\n /**\n * Extract relationship from property access chain\n * Handles both simple (obj.method) and nested (obj.prop.method) patterns\n */\n private extractFromPropertyAccess(\n propAccess: Node,\n handlerName: string\n ): DetectedRelationship | null {\n if (!Node.isPropertyAccessExpression(propAccess)) {\n return null;\n }\n\n const fullChain = propAccess.getText();\n const methodName = propAccess.getName();\n\n // Extract the root object from potentially nested property access\n // e.g., repositories.users.create -> repositories\n let rootObject = propAccess.getExpression();\n while (Node.isPropertyAccessExpression(rootObject)) {\n rootObject = rootObject.getExpression();\n }\n\n const objectName = rootObject.getText();\n\n // Map object name to component name\n const targetComponent = this.inferComponentFromCall(objectName);\n\n if (!targetComponent) {\n return null;\n }\n\n return {\n from: this.toComponentId(handlerName),\n to: targetComponent,\n description: `Calls ${methodName}()`,\n technology: \"Function Call\",\n confidence: \"high\",\n evidence: [`Property access: ${fullChain}`],\n };\n }\n\n /**\n * Extract relationship from database call\n */\n private extractFromDatabaseCall(\n awaitExpr: Node,\n handlerName: string\n ): DetectedRelationship | null {\n if (!Node.isAwaitExpression(awaitExpr)) {\n return null;\n }\n\n const innerExpr = awaitExpr.getExpression();\n if (!Node.isCallExpression(innerExpr)) {\n return null;\n }\n\n const callExpr = innerExpr.getExpression().getText();\n\n // Detect database patterns\n if (\n callExpr.includes(\"db.query\") ||\n callExpr.includes(\"db.execute\") ||\n callExpr.includes(\"db.select\") ||\n callExpr.includes(\"db.insert\") ||\n callExpr.includes(\"db.update\") ||\n callExpr.includes(\"db.delete\")\n ) {\n const operation = this.inferDatabaseOperation(callExpr);\n\n return {\n from: this.toComponentId(handlerName),\n to: \"database\",\n description: operation,\n technology: \"SQL\",\n confidence: \"high\",\n evidence: [`Database call: ${callExpr}`],\n };\n }\n\n return null;\n }\n\n /**\n * Extract relationship from fetch/HTTP call\n */\n private extractFromFetchCall(\n callExpr: CallExpression,\n handlerName: string\n ): DetectedRelationship | null {\n const args = callExpr.getArguments();\n if (args.length === 0 || !args[0]) {\n return null;\n }\n\n const urlArg = args[0].getText();\n\n // Try to extract API name from URL\n let apiName = \"external_api\";\n if (urlArg.includes(\"openai\")) {\n apiName = \"openai_api\";\n } else if (urlArg.includes(\"anthropic\")) {\n apiName = \"anthropic_api\";\n }\n\n return {\n from: this.toComponentId(handlerName),\n to: apiName,\n description: \"Calls external API\",\n technology: \"HTTP/REST\",\n confidence: \"high\",\n evidence: [`fetch() call to: ${urlArg}`],\n };\n }\n\n /**\n * Infer component name from object.method pattern\n */\n private inferComponentFromCall(objectName: string): string | null {\n const mappings: Record<string, string> = {\n db: \"db_client\",\n database: \"database\",\n repos: \"repositories\",\n repository: \"repositories\",\n repositories: \"repositories\",\n cache: \"cache\",\n storage: \"storage\",\n ai: \"ai_service\",\n auth: \"auth_service\",\n authservice: \"auth_service\",\n user: \"user_service\",\n userservice: \"user_service\",\n logger: \"logger\",\n queue: \"queue_service\",\n };\n\n const normalized = objectName.toLowerCase();\n return mappings[normalized] || null;\n }\n\n /**\n * Infer component name from function name patterns\n * Detects patterns like getDatabase(), createRepositories(), etc.\n */\n private inferComponentFromFunctionName(functionName: string): string | null {\n const normalized = functionName.toLowerCase();\n\n // Pattern 1: getXxx() or createXxx()\n if (normalized.startsWith(\"get\") || normalized.startsWith(\"create\")) {\n const prefixLength = normalized.startsWith(\"get\") ? 3 : 6;\n const suffix = functionName.substring(prefixLength);\n return this.matchComponentPattern(suffix);\n }\n\n // Pattern 2: initXxx() or setupXxx()\n if (normalized.startsWith(\"init\") || normalized.startsWith(\"setup\")) {\n const prefixLength = normalized.startsWith(\"init\") ? 4 : 5;\n const suffix = functionName.substring(prefixLength);\n return this.matchInitPattern(suffix);\n }\n\n return null;\n }\n\n /**\n * Match component patterns for get/create functions\n */\n private matchComponentPattern(suffix: string): string | null {\n const suffixLower = suffix.toLowerCase();\n\n const componentPatterns = [\n {\n patterns: [\"database\", \"db\", \"dbconnection\", \"connection\"],\n component: \"db_client\",\n },\n {\n patterns: [\"repositories\", \"repos\", \"repository\"],\n component: \"repositories\",\n },\n {\n patterns: [\"cache\"],\n component: \"cache\",\n },\n {\n patterns: [\"storage\"],\n component: \"storage\",\n },\n {\n patterns: [\"ai\", \"llm\"],\n component: \"ai_service\",\n },\n {\n patterns: [\"logger\"],\n component: \"logger\",\n },\n ];\n\n for (const { patterns, component } of componentPatterns) {\n if (patterns.some((pattern) => suffixLower.includes(pattern) || suffixLower === pattern)) {\n return component;\n }\n }\n\n // Service patterns (special case with extraction)\n if (suffixLower.includes(\"service\")) {\n const serviceMatch = suffix.match(/^(.+?)Service/i);\n if (serviceMatch) {\n return this.toComponentId(`${serviceMatch[1]}_service`);\n }\n return \"service\";\n }\n\n return null;\n }\n\n /**\n * Match patterns for init/setup functions\n */\n private matchInitPattern(suffix: string): string | null {\n const suffixLower = suffix.toLowerCase();\n\n if (suffixLower.includes(\"database\") || suffixLower === \"db\") {\n return \"db_client\";\n }\n if (suffixLower.includes(\"cache\")) {\n return \"cache\";\n }\n\n return null;\n }\n\n /**\n * Resolve component from import statement\n */\n private resolveComponentFromImport(functionName: string, sourceFile: SourceFile): string | null {\n for (const importDecl of sourceFile.getImportDeclarations()) {\n const namedImports = importDecl.getNamedImports();\n\n for (const namedImport of namedImports) {\n if (namedImport.getName() === functionName) {\n const modulePath = importDecl.getModuleSpecifierValue();\n const component = this.inferComponentFromModulePath(modulePath);\n if (component) return component;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Infer component from module path\n */\n private inferComponentFromModulePath(modulePath: string): string | null {\n if (modulePath.includes(\"/db/\") || modulePath.includes(\"/database/\")) {\n return \"db_client\";\n }\n if (modulePath.includes(\"/repos\") || modulePath.includes(\"/repositories\")) {\n return \"repositories\";\n }\n if (modulePath.includes(\"/service\") || modulePath.includes(\"/services\")) {\n const match = modulePath.match(/\\/([^/]+)\\.ts$/);\n if (match?.[1]) {\n return this.toComponentId(match[1]);\n }\n }\n return null;\n }\n\n /**\n * Resolve imported function to its declaration in another file\n * This enables cross-file relationship detection for architectures where\n * handlers are separated from routing logic\n */\n private resolveImportedFunction(\n functionName: string,\n sourceFile: SourceFile\n ): {\n functionDecl: FunctionDeclaration | ArrowFunction | FunctionExpression;\n sourceFile: SourceFile;\n } | null {\n try {\n for (const importDecl of sourceFile.getImportDeclarations()) {\n const namedImports = importDecl.getNamedImports();\n\n for (const namedImport of namedImports) {\n if (namedImport.getName() === functionName) {\n const moduleSpecifier = importDecl.getModuleSpecifierSourceFile();\n if (!moduleSpecifier) continue;\n\n const result = this.findFunctionInModule(functionName, moduleSpecifier);\n if (result) return result;\n }\n }\n }\n } catch (_error) {\n // Silently fail on resolution errors (e.g., missing files, parse errors)\n // This ensures the extractor is resilient to incomplete projects\n return null;\n }\n\n return null;\n }\n\n /**\n * Find function declaration or arrow function in a module\n */\n private findFunctionInModule(\n functionName: string,\n moduleSpecifier: SourceFile\n ): {\n functionDecl: FunctionDeclaration | ArrowFunction | FunctionExpression;\n sourceFile: SourceFile;\n } | null {\n // Find the function in the imported file\n const functionDecl = moduleSpecifier.getFunction(functionName);\n if (functionDecl) {\n return {\n functionDecl,\n sourceFile: moduleSpecifier,\n };\n }\n\n // Also check for exported arrow functions or const declarations\n const variableDecl = moduleSpecifier.getVariableDeclaration(functionName);\n if (variableDecl) {\n const initializer = variableDecl.getInitializer();\n if (\n initializer &&\n (Node.isArrowFunction(initializer) || Node.isFunctionExpression(initializer))\n ) {\n return {\n functionDecl: initializer,\n sourceFile: moduleSpecifier,\n };\n }\n }\n\n return null;\n }\n\n /**\n * Infer database operation type\n */\n private inferDatabaseOperation(callExpr: string): string {\n if (callExpr.includes(\"query\") || callExpr.includes(\"select\")) {\n return \"Reads from database\";\n }\n if (\n callExpr.includes(\"execute\") ||\n callExpr.includes(\"insert\") ||\n callExpr.includes(\"update\") ||\n callExpr.includes(\"delete\")\n ) {\n return \"Writes to database\";\n }\n return \"Accesses database\";\n }\n\n /**\n * Convert name to component ID format\n */\n private toComponentId(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_|_$/g, \"\");\n }\n\n /**\n * Remove duplicate relationships\n */\n private deduplicateRelationships(relationships: DetectedRelationship[]): DetectedRelationship[] {\n const seen = new Set<string>();\n const unique: DetectedRelationship[] = [];\n\n for (const rel of relationships) {\n const key = `${rel.from}->${rel.to}`;\n if (!seen.has(key)) {\n seen.add(key);\n unique.push(rel);\n }\n }\n\n return unique;\n }\n}\n",
|
|
12
12
|
"// External integration detection - find external APIs, services, etc.\n\nimport { Node, Project, type SourceFile } from \"ts-morph\";\nimport type { ExternalIntegration } from \"../types/architecture\";\n\nexport class IntegrationAnalyzer {\n private project: Project;\n\n constructor(tsConfigPath: string) {\n this.project = new Project({\n tsConfigFilePath: tsConfigPath,\n });\n }\n\n /**\n * Analyze external integrations in the codebase\n */\n analyzeIntegrations(): ExternalIntegration[] {\n const integrations = new Map<string, ExternalIntegration>();\n\n // Find all fetch() calls\n const fetchCalls = this.findFetchCalls();\n for (const call of fetchCalls) {\n this.addOrMergeIntegration(integrations, this.createAPIIntegration(call));\n }\n\n // Find WebSocket connections\n const websockets = this.findWebSockets();\n for (const ws of websockets) {\n this.addOrMergeIntegration(integrations, this.createWebSocketIntegration(ws));\n }\n\n // Find external script imports\n const externalScripts = this.findExternalScripts();\n for (const script of externalScripts) {\n this.addOrMergeIntegration(integrations, script);\n }\n\n return Array.from(integrations.values());\n }\n\n /**\n * Find all fetch() API calls\n */\n private findFetchCalls(): Array<{\n url: string;\n method: string;\n file: string;\n line: number;\n description?: string;\n }> {\n const calls: Array<{\n url: string;\n method: string;\n file: string;\n line: number;\n description?: string;\n }> = [];\n\n for (const sourceFile of this.project.getSourceFiles()) {\n sourceFile.forEachDescendant((node) => {\n this.processFetchCall(node, sourceFile, calls);\n });\n }\n\n return calls;\n }\n\n /**\n * Process a node that might be a fetch call\n */\n private processFetchCall(\n node: Node,\n sourceFile: SourceFile,\n calls: Array<{\n url: string;\n method: string;\n file: string;\n line: number;\n description?: string;\n }>\n ): void {\n if (!Node.isCallExpression(node)) {\n return;\n }\n\n const expression = node.getExpression();\n if (!this.isFetchCall(expression)) {\n return;\n }\n\n const args = node.getArguments();\n if (args.length === 0) {\n return;\n }\n\n const url = this.extractURLFromArg(args[0]);\n if (!url) {\n return;\n }\n\n const method = this.extractMethodFromOptions(args);\n const description = this.extractJSDocDescription(node);\n\n calls.push({\n url,\n method,\n file: sourceFile.getFilePath(),\n line: node.getStartLineNumber(),\n description,\n });\n }\n\n /**\n * Check if expression is a fetch call\n */\n private isFetchCall(expression: Node): boolean {\n return Node.isIdentifier(expression) && expression.getText() === \"fetch\";\n }\n\n /**\n * Extract URL from fetch argument\n */\n private extractURLFromArg(urlArg: Node): string | null {\n if (Node.isStringLiteral(urlArg)) {\n return urlArg.getLiteralValue();\n }\n\n if (Node.isTemplateExpression(urlArg)) {\n return this.extractBaseURL(urlArg.getText());\n }\n\n return null;\n }\n\n /**\n * Extract HTTP method from fetch options\n */\n private extractMethodFromOptions(args: Node[]): string {\n const defaultMethod = \"GET\";\n\n if (args.length <= 1) {\n return defaultMethod;\n }\n\n const optionsArg = args[1];\n if (!Node.isObjectLiteralExpression(optionsArg)) {\n return defaultMethod;\n }\n\n const methodProp = optionsArg.getProperty(\"method\");\n if (!methodProp || !Node.isPropertyAssignment(methodProp)) {\n return defaultMethod;\n }\n\n const initializer = methodProp.getInitializer();\n if (!initializer || !Node.isStringLiteral(initializer)) {\n return defaultMethod;\n }\n\n return initializer.getLiteralValue().toUpperCase();\n }\n\n /**\n * Find WebSocket connections\n */\n private findWebSockets(): Array<{\n url: string;\n file: string;\n line: number;\n description?: string;\n }> {\n const websockets: Array<{\n url: string;\n file: string;\n line: number;\n description?: string;\n }> = [];\n\n for (const sourceFile of this.project.getSourceFiles()) {\n sourceFile.forEachDescendant((node) => {\n if (Node.isNewExpression(node)) {\n const expression = node.getExpression();\n\n // Check for new WebSocket()\n if (Node.isIdentifier(expression) && expression.getText() === \"WebSocket\") {\n const args = node.getArguments();\n if (args.length > 0 && Node.isStringLiteral(args[0])) {\n const url = args[0].getLiteralValue();\n const description = this.extractJSDocDescription(node);\n\n websockets.push({\n url,\n file: sourceFile.getFilePath(),\n line: node.getStartLineNumber(),\n description,\n });\n }\n }\n }\n });\n }\n\n return websockets;\n }\n\n /**\n * Find external script dependencies (from imports)\n */\n private findExternalScripts(): ExternalIntegration[] {\n const scripts: ExternalIntegration[] = [];\n const seen = new Set<string>();\n\n for (const sourceFile of this.project.getSourceFiles()) {\n this.extractExternalImportsFromFile(sourceFile, scripts, seen);\n }\n\n return scripts;\n }\n\n /**\n * Extract external imports from a single file\n */\n private extractExternalImportsFromFile(\n sourceFile: SourceFile,\n scripts: ExternalIntegration[],\n seen: Set<string>\n ): void {\n for (const importDecl of sourceFile.getImportDeclarations()) {\n const moduleSpecifier = importDecl.getModuleSpecifierValue();\n\n if (this.isExternalImport(moduleSpecifier)) {\n const packageName = this.extractPackageName(moduleSpecifier);\n\n if (packageName && !seen.has(packageName)) {\n seen.add(packageName);\n scripts.push(this.createExternalScriptIntegration(packageName, sourceFile));\n }\n }\n }\n }\n\n /**\n * Check if import is external (not relative)\n */\n private isExternalImport(moduleSpecifier: string): boolean {\n return !moduleSpecifier.startsWith(\".\") && !moduleSpecifier.startsWith(\"/\");\n }\n\n /**\n * Extract package name from module specifier\n */\n private extractPackageName(moduleSpecifier: string): string | undefined {\n // Handle scoped packages (@org/package)\n if (moduleSpecifier.startsWith(\"@\")) {\n return moduleSpecifier.split(\"/\").slice(0, 2).join(\"/\");\n }\n // Handle regular packages\n return moduleSpecifier.split(\"/\")[0];\n }\n\n /**\n * Create external script integration object\n */\n private createExternalScriptIntegration(\n packageName: string,\n sourceFile: SourceFile\n ): ExternalIntegration {\n return {\n type: \"external-script\",\n name: packageName,\n technology: \"npm package\",\n usedIn: [sourceFile.getFilePath()],\n description: `External dependency: ${packageName}`,\n };\n }\n\n /**\n * Create API integration from fetch call\n */\n private createAPIIntegration(call: {\n url: string;\n method: string;\n file: string;\n line: number;\n description?: string;\n }): ExternalIntegration {\n // Extract base URL\n const baseURL = this.extractBaseURL(call.url);\n\n // Infer name from URL\n const name = this.inferAPIName(baseURL);\n\n return {\n type: \"api\",\n name,\n technology: \"REST API\",\n url: baseURL,\n usedIn: [call.file],\n description: call.description || `External API: ${name}`,\n calls: [\n {\n method: call.method,\n endpoint: call.url,\n location: {\n file: call.file,\n line: call.line,\n },\n description: call.description,\n },\n ],\n };\n }\n\n /**\n * Create WebSocket integration\n */\n private createWebSocketIntegration(ws: {\n url: string;\n file: string;\n line: number;\n description?: string;\n }): ExternalIntegration {\n const name = this.inferAPIName(ws.url);\n\n return {\n type: \"websocket\",\n name,\n technology: \"WebSocket\",\n url: ws.url,\n usedIn: [ws.file],\n description: ws.description || `WebSocket connection: ${name}`,\n };\n }\n\n /**\n * Extract base URL from full URL or template\n */\n private extractBaseURL(url: string): string {\n // Remove template parts\n let cleanUrl = url.replace(/\\$\\{[^}]+\\}/g, \"\");\n cleanUrl = cleanUrl.replace(/`/g, \"\");\n\n try {\n const parsed = new URL(cleanUrl);\n return `${parsed.protocol}//${parsed.host}`;\n } catch {\n // If parsing fails, try to extract domain\n const match = cleanUrl.match(/https?:\\/\\/([^/]+)/);\n return match ? match[0] : cleanUrl;\n }\n }\n\n /**\n * Infer API name from URL\n */\n private inferAPIName(url: string): string {\n try {\n const parsed = new URL(url);\n const hostname = parsed.hostname;\n\n // Remove www. prefix\n const cleanHost = hostname.replace(/^www\\./, \"\");\n\n // Take first part of domain\n const parts = cleanHost.split(\".\");\n if (parts.length > 0 && parts[0]) {\n // Capitalize first letter\n return `${parts[0].charAt(0).toUpperCase() + parts[0].slice(1)} API`;\n }\n } catch {\n // Fallback\n }\n\n return \"External API\";\n }\n\n /**\n * Add or merge integration into map\n */\n private addOrMergeIntegration(\n map: Map<string, ExternalIntegration>,\n integration: ExternalIntegration\n ): void {\n const key = `${integration.type}:${integration.name}`;\n\n if (map.has(key)) {\n const existing = map.get(key);\n if (!existing) return;\n\n // Merge usedIn\n existing.usedIn = [...new Set([...existing.usedIn, ...integration.usedIn])];\n\n // Merge calls\n if (integration.calls && existing.calls) {\n existing.calls.push(...integration.calls);\n } else if (integration.calls) {\n existing.calls = integration.calls;\n }\n } else {\n map.set(key, integration);\n }\n }\n\n /**\n * Extract JSDoc description from node\n */\n private extractJSDocDescription(node: Node): string | undefined {\n const jsDocs = node.getJsDocs?.() || [];\n if (jsDocs.length === 0) return undefined;\n\n const comment = jsDocs[0].getDescription().trim();\n return comment || undefined;\n }\n}\n",
|
|
13
|
-
"//
|
|
14
|
-
"//
|
|
15
|
-
"// Export all extraction utilities\nexport * from \"./types\";\nexport * from \"./handlers\";\nexport * from \"./manifest\";\nexport * from \"./contexts\";\nexport * from \"./flows\";\nexport * from \"./integrations\";\nexport * from \"./adr\";\nexport * from \"./architecture\";\nexport * from \"./project-detector\";\n",
|
|
13
|
+
"// Manifest.json parser for Chrome extensions\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { ManifestInfo } from \"../types/architecture\";\n\n/**\n * Parse manifest.json and extract context information\n */\nexport class ManifestParser {\n private manifestPath: string;\n private manifestData: Record<string, unknown> | null;\n private baseDir: string;\n\n constructor(projectRoot: string, optional = false) {\n this.baseDir = projectRoot;\n this.manifestPath = path.join(projectRoot, \"manifest.json\");\n\n if (!fs.existsSync(this.manifestPath)) {\n if (optional) {\n this.manifestData = null;\n return;\n }\n throw new Error(`manifest.json not found at ${this.manifestPath}`);\n }\n\n try {\n const content = fs.readFileSync(this.manifestPath, \"utf-8\");\n this.manifestData = JSON.parse(content);\n } catch (error) {\n throw new Error(`Failed to parse manifest.json: ${error}`);\n }\n }\n\n /**\n * Check if manifest.json exists and was loaded\n */\n hasManifest(): boolean {\n return this.manifestData !== null;\n }\n\n /**\n * Parse manifest and extract all information\n */\n parse(): ManifestInfo {\n if (!this.manifestData) {\n throw new Error(\n \"Cannot parse manifest: manifest.json not loaded. Use hasManifest() to check availability.\"\n );\n }\n\n const manifest = this.manifestData;\n\n return {\n name: manifest.name || \"Unknown Extension\",\n version: manifest.version || \"0.0.0\",\n description: manifest.description,\n manifestVersion: manifest.manifest_version || 2,\n background: this.parseBackground(),\n contentScripts: this.parseContentScripts(),\n popup: this.parsePopup(),\n options: this.parseOptions(),\n devtools: this.parseDevtools(),\n permissions: manifest.permissions || [],\n hostPermissions: manifest.host_permissions || [],\n };\n }\n\n /**\n * Get context entry points from manifest\n */\n getContextEntryPoints(): Record<string, string> {\n if (!this.manifestData) {\n return {};\n }\n\n const entryPoints: Record<string, string> = {};\n\n this.addBackgroundEntryPoint(entryPoints);\n this.addContentScriptEntryPoint(entryPoints);\n this.addPopupEntryPoint(entryPoints);\n this.addOptionsEntryPoint(entryPoints);\n this.addDevtoolsEntryPoint(entryPoints);\n\n return entryPoints;\n }\n\n private addBackgroundEntryPoint(entryPoints: Record<string, string>): void {\n const background = this.parseBackground();\n if (!background) return;\n\n const entryFile = background.files[0];\n if (entryFile) {\n entryPoints[\"background\"] = this.findSourceFile(entryFile);\n }\n }\n\n private addContentScriptEntryPoint(entryPoints: Record<string, string>): void {\n const contentScripts = this.parseContentScripts();\n if (!contentScripts || contentScripts.length === 0) return;\n\n const firstScript = contentScripts[0]?.js[0];\n if (firstScript) {\n entryPoints[\"content\"] = this.findSourceFile(firstScript);\n }\n }\n\n private addPopupEntryPoint(entryPoints: Record<string, string>): void {\n const popup = this.parsePopup();\n if (!popup) return;\n\n const htmlPath = path.join(this.baseDir, popup.html);\n const jsPath = this.findAssociatedJS(htmlPath);\n if (jsPath) {\n entryPoints[\"popup\"] = jsPath;\n }\n }\n\n private addOptionsEntryPoint(entryPoints: Record<string, string>): void {\n const options = this.parseOptions();\n if (!options) return;\n\n const htmlPath = path.join(this.baseDir, options.page);\n const jsPath = this.findAssociatedJS(htmlPath);\n if (jsPath) {\n entryPoints[\"options\"] = jsPath;\n }\n }\n\n private addDevtoolsEntryPoint(entryPoints: Record<string, string>): void {\n const devtools = this.parseDevtools();\n if (!devtools) return;\n\n const htmlPath = path.join(this.baseDir, devtools.page);\n const jsPath = this.findAssociatedJS(htmlPath);\n if (jsPath) {\n entryPoints[\"devtools\"] = jsPath;\n }\n }\n\n /**\n * Parse background configuration\n */\n private parseBackground(): ManifestInfo[\"background\"] {\n if (!this.manifestData) return undefined;\n\n const bg = this.manifestData.background;\n if (!bg) return undefined;\n\n // Manifest V3 - service worker\n if (bg.service_worker) {\n return {\n type: \"service_worker\",\n files: [bg.service_worker],\n };\n }\n\n // Manifest V2 - scripts\n if (bg.scripts) {\n return {\n type: \"script\",\n files: bg.scripts,\n };\n }\n\n // Manifest V2 - page\n if (bg.page) {\n return {\n type: \"script\",\n files: [bg.page],\n };\n }\n\n return undefined;\n }\n\n /**\n * Parse content scripts configuration\n */\n private parseContentScripts(): ManifestInfo[\"contentScripts\"] {\n if (!this.manifestData) return undefined;\n\n const cs = this.manifestData.content_scripts;\n if (!cs || !Array.isArray(cs)) return undefined;\n\n return cs.map((script) => ({\n matches: script.matches || [],\n js: script.js || [],\n css: script.css,\n }));\n }\n\n /**\n * Parse popup configuration\n */\n private parsePopup(): ManifestInfo[\"popup\"] {\n if (!this.manifestData) return undefined;\n\n const action = this.manifestData.action || this.manifestData.browser_action;\n if (!action) return undefined;\n\n if (action.default_popup) {\n return {\n html: action.default_popup,\n default: true,\n };\n }\n\n return undefined;\n }\n\n /**\n * Parse options configuration\n */\n private parseOptions(): ManifestInfo[\"options\"] {\n if (!this.manifestData) return undefined;\n\n const options = this.manifestData.options_ui || this.manifestData.options_page;\n if (!options) return undefined;\n\n if (typeof options === \"string\") {\n return {\n page: options,\n openInTab: false,\n };\n }\n\n return {\n page: options.page,\n openInTab: options.open_in_tab,\n };\n }\n\n /**\n * Parse devtools configuration\n */\n private parseDevtools(): ManifestInfo[\"devtools\"] {\n if (!this.manifestData) return undefined;\n\n const devtools = this.manifestData.devtools_page;\n if (!devtools) return undefined;\n\n return {\n page: devtools,\n };\n }\n\n /**\n * Find source file from manifest reference\n * Tries multiple locations: exact path, src/ directory, .ts extension\n */\n private findSourceFile(manifestPath: string): string {\n const candidates = [\n // Exact path from manifest\n path.join(this.baseDir, manifestPath),\n // Same path with .ts extension\n path.join(this.baseDir, manifestPath.replace(/\\.js$/, \".ts\")),\n // In src/ directory\n path.join(this.baseDir, \"src\", manifestPath),\n path.join(this.baseDir, \"src\", manifestPath.replace(/\\.js$/, \".ts\")),\n // In src/ with .tsx extension\n path.join(this.baseDir, \"src\", manifestPath.replace(/\\.js$/, \".tsx\")),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n // Fallback to manifest path (will error later if not found)\n return path.join(this.baseDir, manifestPath);\n }\n\n /**\n * Find associated JavaScript/TypeScript file for an HTML file\n */\n private findAssociatedJS(htmlPath: string): string | null {\n if (!fs.existsSync(htmlPath)) {\n return null;\n }\n\n // Read HTML and look for script tags\n const html = fs.readFileSync(htmlPath, \"utf-8\");\n const scriptMatch = html.match(/<script[^>]+src=[\"']([^\"']+)[\"']/i);\n\n if (scriptMatch?.[1]) {\n const scriptPath = scriptMatch[1];\n const fullPath = path.resolve(path.dirname(htmlPath), scriptPath);\n\n // Try with and without .js/.ts extension\n if (fs.existsSync(fullPath)) return fullPath;\n if (fs.existsSync(fullPath.replace(/\\.js$/, \".ts\"))) {\n return fullPath.replace(/\\.js$/, \".ts\");\n }\n if (fs.existsSync(fullPath.replace(/\\.js$/, \".tsx\"))) {\n return fullPath.replace(/\\.js$/, \".tsx\");\n }\n }\n\n // Fallback: look for convention-based files\n const baseName = path.basename(htmlPath, \".html\");\n const dir = path.dirname(htmlPath);\n\n const candidates = [\n path.join(dir, `${baseName}.ts`),\n path.join(dir, `${baseName}.tsx`),\n path.join(dir, `${baseName}.js`),\n path.join(dir, \"index.ts\"),\n path.join(dir, \"index.tsx\"),\n path.join(dir, \"index.js\"),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n }\n}\n\n/**\n * Parse manifest.json and extract information\n */\nexport function parseManifest(projectRoot: string): ManifestInfo {\n const parser = new ManifestParser(projectRoot);\n return parser.parse();\n}\n\n/**\n * Get context entry points from manifest.json\n */\nexport function getContextEntryPoints(projectRoot: string): Record<string, string> {\n const parser = new ManifestParser(projectRoot);\n return parser.getContextEntryPoints();\n}\n",
|
|
14
|
+
"// Export all extraction utilities\n\nexport * from \"./adr\";\nexport * from \"./architecture\";\nexport * from \"./contexts\";\nexport * from \"./flows\";\nexport * from \"./handlers\";\nexport * from \"./integrations\";\nexport * from \"./manifest\";\nexport * from \"./project-detector\";\nexport * from \"./types\";\n",
|
|
15
|
+
"// Type extraction from TypeScript using ts-morph\n\nimport { Project, type SourceFile, type Type } from \"ts-morph\";\nimport type { CodebaseAnalysis, FieldAnalysis, TypeInfo } from \"../types\";\nimport { HandlerExtractor } from \"./handlers\";\n\nexport class TypeExtractor {\n private project: Project;\n\n constructor(tsConfigPath: string) {\n this.project = new Project({\n tsConfigFilePath: tsConfigPath,\n });\n }\n\n /**\n * Analyze the codebase and extract state types and message types\n */\n async analyzeCodebase(stateFilePath?: string): Promise<CodebaseAnalysis> {\n // Find state type\n const stateType = stateFilePath ? this.extractStateType(stateFilePath) : this.findStateType();\n\n // Find message types\n const messageTypes = this.findMessageTypes();\n\n // Analyze fields\n const fields = stateType ? this.analyzeFields(stateType) : [];\n\n // Extract message handlers\n const handlerAnalysis = this.extractHandlerAnalysis();\n\n // Filter message types and handlers to only include valid TLA+ identifiers\n const validMessageTypes = this.filterAndLogMessageTypes(\n messageTypes,\n handlerAnalysis.messageTypes\n );\n const validHandlers = this.filterAndLogHandlers(handlerAnalysis.handlers);\n\n return {\n stateType,\n messageTypes: validMessageTypes,\n fields,\n handlers: validHandlers,\n };\n }\n\n /**\n * Extract handler analysis from the project\n */\n private extractHandlerAnalysis() {\n const configFilePath = this.project.getCompilerOptions()[\"configFilePath\"];\n const tsConfigPath = typeof configFilePath === \"string\" ? configFilePath : \"tsconfig.json\";\n const handlerExtractor = new HandlerExtractor(tsConfigPath);\n return handlerExtractor.extractHandlers();\n }\n\n /**\n * Filter and log message types, keeping only valid TLA+ identifiers\n */\n private filterAndLogMessageTypes(\n messageTypes: string[],\n handlerMessageTypes: Set<string>\n ): string[] {\n const allMessageTypes = Array.from(new Set([...messageTypes, ...handlerMessageTypes]));\n const validMessageTypes: string[] = [];\n const invalidMessageTypes: string[] = [];\n\n for (const msgType of allMessageTypes) {\n if (this.isValidTLAIdentifier(msgType)) {\n validMessageTypes.push(msgType);\n } else {\n invalidMessageTypes.push(msgType);\n }\n }\n\n this.logInvalidMessageTypes(invalidMessageTypes);\n return validMessageTypes;\n }\n\n /**\n * Log warnings about invalid message types\n */\n private logInvalidMessageTypes(invalidMessageTypes: string[]): void {\n if (invalidMessageTypes.length === 0 || !process.env[\"POLLY_DEBUG\"]) return;\n\n console.log(`[WARN] Filtered out ${invalidMessageTypes.length} invalid message type(s):`);\n for (const invalid of invalidMessageTypes) {\n console.log(`[WARN] - \"${invalid}\" (not a valid TLA+ identifier)`);\n }\n }\n\n /**\n * Filter and log handlers, keeping only those with valid TLA+ identifier message types\n */\n private filterAndLogHandlers(\n handlers: Array<{ messageType: string; location: { file: string; line: number } }>\n ) {\n const validHandlers = handlers.filter((h) => this.isValidTLAIdentifier(h.messageType));\n\n this.logInvalidHandlers(handlers, validHandlers);\n return validHandlers;\n }\n\n /**\n * Log warnings about filtered handlers\n */\n private logInvalidHandlers(\n allHandlers: Array<{ messageType: string; location: { file: string; line: number } }>,\n validHandlers: Array<{ messageType: string }>\n ): void {\n const filteredHandlerCount = allHandlers.length - validHandlers.length;\n if (filteredHandlerCount === 0 || !process.env[\"POLLY_DEBUG\"]) return;\n\n console.log(\n `[WARN] Filtered out ${filteredHandlerCount} handler(s) with invalid message types:`\n );\n for (const handler of allHandlers) {\n if (!this.isValidTLAIdentifier(handler.messageType)) {\n console.log(\n `[WARN] - Handler for \"${handler.messageType}\" at ${handler.location.file}:${handler.location.line}`\n );\n }\n }\n }\n\n /**\n * Check if a string is a valid TLA+ identifier\n * TLA+ identifiers must:\n * - Start with a letter (a-zA-Z)\n * - Contain only letters, digits, and underscores\n * - Not be empty\n */\n private isValidTLAIdentifier(s: string): boolean {\n if (!s || s.length === 0) {\n return false;\n }\n // TLA+ identifiers: start with letter, contain only alphanumeric + underscore\n return /^[a-zA-Z][a-zA-Z0-9_]*$/.test(s);\n }\n\n /**\n * Extract state type from a specific file\n */\n private extractStateType(filePath: string): TypeInfo | null {\n const sourceFile = this.project.getSourceFile(filePath);\n if (!sourceFile) {\n return null;\n }\n\n // Look for type alias named \"AppState\" or similar\n const typeAlias =\n sourceFile.getTypeAlias(\"AppState\") ||\n sourceFile.getTypeAlias(\"State\") ||\n sourceFile.getTypeAliases()[0];\n\n if (!typeAlias) {\n return null;\n }\n\n const type = typeAlias.getType();\n return this.convertType(type, typeAlias.getName());\n }\n\n /**\n * Find state type by searching common patterns\n */\n private findStateType(): TypeInfo | null {\n // Search for files with \"state\" in the name\n const stateFiles = this.project.getSourceFiles(\"**/state*.ts\");\n\n for (const file of stateFiles) {\n const typeAlias = file.getTypeAlias(\"AppState\") || file.getTypeAlias(\"State\");\n\n if (typeAlias) {\n const type = typeAlias.getType();\n return this.convertType(type, typeAlias.getName());\n }\n }\n\n return null;\n }\n\n /**\n * Find message types by searching for type unions\n * Handles:\n * - Simple string literal unions\n * - Discriminated unions ({ type: 'foo' } | { type: 'bar' })\n * - Type aliases across files\n * - Template literal types (with warning)\n * - Conditional types (conservatively)\n * - Mapped types\n */\n private findMessageTypes(): string[] {\n const messageTypes: string[] = [];\n const warnings: string[] = [];\n\n // Search for files with \"message\" in the name\n const messageFiles = this.project.getSourceFiles(\"**/message*.ts\");\n\n for (const file of messageFiles) {\n // Look for type aliases that might contain message types\n for (const typeAlias of file.getTypeAliases()) {\n const extractedTypes = this.extractMessageTypesFromType(\n typeAlias.getType(),\n typeAlias.getName(),\n file,\n warnings\n );\n messageTypes.push(...extractedTypes);\n }\n }\n\n // Log warnings about unbounded types\n if (warnings.length > 0 && process.env[\"POLLY_DEBUG\"]) {\n console.log(\"[WARN] Message type extraction warnings:\");\n for (const warning of warnings) {\n console.log(`[WARN] ${warning}`);\n }\n }\n\n return [...new Set(messageTypes)]; // Dedupe\n }\n\n /**\n * Extract message types from a TypeScript type\n * Recursively handles unions, discriminated unions, aliases, etc.\n */\n private extractMessageTypesFromType(\n type: Type,\n typeName: string,\n sourceFile: SourceFile,\n warnings: string[]\n ): string[] {\n if (type.isUnion()) {\n return this.extractFromUnionType(type, typeName, sourceFile, warnings);\n }\n\n if (type.getAliasSymbol()) {\n return this.extractFromTypeAlias(type, typeName, sourceFile, warnings);\n }\n\n if (type.isConditionalType?.()) {\n return this.extractFromConditionalType(type, warnings);\n }\n\n if (type.getText().includes(\"[K in \")) {\n return this.extractFromMappedType(type, sourceFile, warnings);\n }\n\n if (type.getText().includes(\"`\")) {\n this.warnTemplateLiteral(type, warnings);\n return [];\n }\n\n return [];\n }\n\n /**\n * Extract message types from union type\n */\n private extractFromUnionType(\n type: Type,\n typeName: string,\n sourceFile: SourceFile,\n warnings: string[]\n ): string[] {\n const messageTypes: string[] = [];\n const unionTypes = type.getUnionTypes();\n\n for (const unionType of unionTypes) {\n const extracted = this.extractFromUnionMember(unionType, typeName, sourceFile, warnings);\n messageTypes.push(...extracted);\n }\n\n return messageTypes;\n }\n\n /**\n * Extract message types from a single union member\n */\n private extractFromUnionMember(\n unionType: Type,\n typeName: string,\n sourceFile: SourceFile,\n warnings: string[]\n ): string[] {\n if (unionType.isObject()) {\n return this.extractFromDiscriminatedUnion(unionType, sourceFile, warnings);\n }\n\n if (unionType.isStringLiteral()) {\n return [unionType.getLiteralValue() as string];\n }\n\n if (unionType.getAliasSymbol()) {\n const aliasedType = unionType.getAliasSymbol()?.getDeclaredType();\n if (aliasedType) {\n return this.extractMessageTypesFromType(aliasedType, typeName, sourceFile, warnings);\n }\n }\n\n return [];\n }\n\n /**\n * Extract message types from discriminated union\n */\n private extractFromDiscriminatedUnion(\n unionType: Type,\n sourceFile: SourceFile,\n warnings: string[]\n ): string[] {\n const typeProperty = unionType.getProperty(\"type\");\n if (!typeProperty) {\n return [];\n }\n\n const typeType = typeProperty.getTypeAtLocation(sourceFile);\n\n if (typeType.isStringLiteral()) {\n return [typeType.getLiteralValue() as string];\n }\n\n if (typeType.getText().includes(\"`\")) {\n warnings.push(\n `Template literal type in discriminant: ${typeType.getText()} - may be unbounded`\n );\n }\n\n return [];\n }\n\n /**\n * Extract message types from type alias\n */\n private extractFromTypeAlias(\n type: Type,\n typeName: string,\n sourceFile: SourceFile,\n warnings: string[]\n ): string[] {\n const aliasedType = type.getAliasSymbol()?.getDeclaredType();\n if (!aliasedType || aliasedType === type) {\n return [];\n }\n\n return this.extractMessageTypesFromType(aliasedType, typeName, sourceFile, warnings);\n }\n\n /**\n * Extract message types from conditional type\n */\n private extractFromConditionalType(type: Type, warnings: string[]): string[] {\n warnings.push(`Conditional type detected: ${type.getText()} - extracting conservatively`);\n\n const messageTypes: string[] = [];\n const typeText = type.getText();\n const parts = typeText.split(\"?\");\n\n if (parts.length < 2) {\n return messageTypes;\n }\n\n const branches = parts[1].split(\":\");\n for (const branch of branches) {\n const extracted = this.extractStringLiteralFromBranch(branch);\n if (extracted) {\n messageTypes.push(extracted);\n }\n }\n\n return messageTypes;\n }\n\n /**\n * Extract string literal from conditional branch\n */\n private extractStringLiteralFromBranch(branch: string): string | null {\n const trimmed = branch.trim();\n const match = trimmed.match(/^[\"'](\\w+)[\"']$/);\n return match?.[1] ?? null;\n }\n\n /**\n * Extract message types from mapped type\n */\n private extractFromMappedType(type: Type, sourceFile: SourceFile, warnings: string[]): string[] {\n warnings.push(`Mapped type detected: ${type.getText()} - attempting to extract keys`);\n\n const match = type.getText().match(/\\[K in ([^\\]]+)\\]/);\n if (!match?.[1]) {\n return [];\n }\n\n const keyTypeName = match[1].trim();\n const keyTypeAlias = sourceFile.getTypeAlias?.(keyTypeName);\n\n if (!keyTypeAlias) {\n return [];\n }\n\n const keyType = keyTypeAlias.getType();\n return this.extractMessageTypesFromType(keyType, keyTypeName, sourceFile, warnings);\n }\n\n /**\n * Warn about template literal types\n */\n private warnTemplateLiteral(type: Type, warnings: string[]): void {\n warnings.push(\n `Template literal type: ${type.getText()} - this creates an unbounded set and cannot be fully extracted`\n );\n }\n\n /**\n * Convert ts-morph Type to our TypeInfo\n */\n private convertType(type: Type, name: string): TypeInfo {\n const nullable = type.isNullable();\n\n if (type.isBoolean() || type.isBooleanLiteral()) {\n return { name, kind: \"boolean\", nullable };\n }\n\n if (type.isUnion()) {\n return this.convertUnionType(type, name, nullable);\n }\n\n if (type.isString() || type.isStringLiteral()) {\n return { name, kind: \"string\", nullable };\n }\n\n if (type.isNumber() || type.isNumberLiteral()) {\n return { name, kind: \"number\", nullable };\n }\n\n if (type.isArray()) {\n return this.convertArrayType(type, name, nullable);\n }\n\n const collectionType = this.tryConvertCollectionType(type, name, nullable);\n if (collectionType) {\n return collectionType;\n }\n\n if (type.isObject()) {\n return this.convertObjectType(type, name, nullable);\n }\n\n if (type.isNull()) {\n return { name, kind: \"null\", nullable: true };\n }\n\n return { name, kind: \"unknown\", nullable };\n }\n\n /**\n * Convert union type to TypeInfo\n */\n private convertUnionType(type: Type, name: string, nullable: boolean): TypeInfo {\n const unionTypes = type.getUnionTypes();\n\n // Check for string literal union (enum)\n const allStringLiterals = unionTypes.every((t) => t.isStringLiteral());\n if (allStringLiterals) {\n const enumValues = unionTypes.map((t) => t.getLiteralValue() as string);\n return { name, kind: \"enum\", nullable, enumValues };\n }\n\n // Check for nullable type (T | null | undefined)\n const nonNullTypes = unionTypes.filter((t) => !t.isNull() && !t.isUndefined());\n\n if (nonNullTypes.length === 1) {\n const firstType = nonNullTypes[0];\n if (firstType) {\n const baseType = this.convertType(firstType, name);\n return { ...baseType, nullable: true };\n }\n }\n\n // Generic union\n return {\n name,\n kind: \"union\",\n nullable,\n unionTypes: unionTypes.map((t, i) => this.convertType(t, `${name}_${i}`)),\n };\n }\n\n /**\n * Convert array type to TypeInfo\n */\n private convertArrayType(type: Type, name: string, nullable: boolean): TypeInfo {\n const elementType = type.getArrayElementType();\n return {\n name,\n kind: \"array\",\n nullable,\n elementType: elementType\n ? this.convertType(elementType, `${name}_element`)\n : { name: \"unknown\", kind: \"unknown\", nullable: false },\n };\n }\n\n /**\n * Try to convert Map or Set type to TypeInfo\n */\n private tryConvertCollectionType(type: Type, name: string, nullable: boolean): TypeInfo | null {\n const symbol = type.getSymbol();\n if (!symbol) return null;\n\n const symbolName = symbol.getName();\n\n if (symbolName === \"Map\") {\n const typeArgs = type.getTypeArguments();\n return {\n name,\n kind: \"map\",\n nullable,\n valueType: typeArgs?.[1] ? this.convertType(typeArgs[1], `${name}_value`) : undefined,\n };\n }\n\n if (symbolName === \"Set\") {\n const typeArgs = type.getTypeArguments();\n return {\n name,\n kind: \"set\",\n nullable,\n elementType: typeArgs?.[0] ? this.convertType(typeArgs[0], `${name}_element`) : undefined,\n };\n }\n\n return null;\n }\n\n /**\n * Convert object type to TypeInfo\n */\n private convertObjectType(type: Type, name: string, nullable: boolean): TypeInfo {\n const properties: Record<string, TypeInfo> = {};\n const sourceFile = this.project.getSourceFiles()[0];\n\n if (sourceFile) {\n for (const prop of type.getProperties()) {\n const propName = prop.getName();\n const propType = prop.getTypeAtLocation(sourceFile);\n properties[propName] = this.convertType(propType, propName);\n }\n }\n\n return { name, kind: \"object\", nullable, properties };\n }\n\n /**\n * Analyze fields and determine confidence/bounds\n */\n private analyzeFields(stateType: TypeInfo, prefix = \"\"): FieldAnalysis[] {\n const fields: FieldAnalysis[] = [];\n\n if (stateType.kind === \"object\" && stateType.properties) {\n for (const [key, propType] of Object.entries(stateType.properties)) {\n const path = prefix ? `${prefix}.${key}` : key;\n\n // Recursively analyze nested objects (but not Map/Set - they're leaf nodes)\n if (propType.kind === \"object\") {\n // Don't add intermediate objects as fields, just recurse into them\n fields.push(...this.analyzeFields(propType, path));\n } else {\n // This is a leaf field (or Map/Set), add it for configuration\n const analysis = this.analyzeField(path, propType);\n fields.push(analysis);\n }\n }\n }\n\n return fields;\n }\n\n /**\n * Analyze a single field and determine configuration needs\n */\n private analyzeField(path: string, type: TypeInfo): FieldAnalysis {\n const analysis: FieldAnalysis = {\n path,\n type,\n confidence: \"low\",\n evidence: [],\n suggestions: [],\n bounds: {},\n };\n\n if (type.kind === \"boolean\") return this.analyzeBooleanField(analysis);\n if (type.kind === \"enum\") return this.analyzeEnumField(analysis, type);\n if (type.kind === \"array\") return this.analyzeArrayField(analysis);\n if (type.kind === \"number\") return this.analyzeNumberField(analysis);\n if (type.kind === \"string\") return this.analyzeStringField(analysis);\n if (type.kind === \"map\" || type.kind === \"set\") return this.analyzeMapSetField(analysis);\n\n return analysis;\n }\n\n private analyzeBooleanField(analysis: FieldAnalysis): FieldAnalysis {\n analysis.confidence = \"high\";\n analysis.evidence.push(\"Boolean type - auto-configured\");\n return analysis;\n }\n\n private analyzeEnumField(analysis: FieldAnalysis, type: TypeInfo): FieldAnalysis {\n if (type.enumValues) {\n analysis.confidence = \"high\";\n analysis.evidence.push(`Enum with ${type.enumValues.length} values`);\n if (analysis.bounds) {\n analysis.bounds.values = type.enumValues;\n }\n }\n return analysis;\n }\n\n private analyzeArrayField(analysis: FieldAnalysis): FieldAnalysis {\n analysis.confidence = \"low\";\n analysis.suggestions.push(\"Choose maxLength: 5 (fast), 10 (balanced), or 20 (thorough)\");\n if (analysis.bounds) {\n analysis.bounds.maxLength = undefined;\n }\n\n const foundBound = this.findArrayBound();\n if (foundBound && analysis.bounds) {\n analysis.confidence = \"medium\";\n analysis.evidence.push(`Found array check: ${foundBound.evidence}`);\n analysis.bounds.maxLength = foundBound.value;\n }\n\n return analysis;\n }\n\n private analyzeNumberField(analysis: FieldAnalysis): FieldAnalysis {\n analysis.confidence = \"low\";\n analysis.suggestions.push(\"Provide min and max values based on your application logic\");\n if (analysis.bounds) {\n analysis.bounds.min = undefined;\n analysis.bounds.max = undefined;\n }\n\n const foundBound = this.findNumberBound();\n if (foundBound && analysis.bounds) {\n analysis.confidence = \"high\";\n analysis.evidence.push(`Found comparison: ${foundBound.evidence}`);\n analysis.bounds = { ...analysis.bounds, ...foundBound.bounds };\n }\n\n return analysis;\n }\n\n private analyzeStringField(analysis: FieldAnalysis): FieldAnalysis {\n analysis.confidence = \"low\";\n analysis.suggestions.push(\n 'Provide 2-3 example values: [\"value1\", \"value2\", \"value3\"]',\n \"Or use { abstract: true } for symbolic verification\"\n );\n if (analysis.bounds) {\n analysis.bounds.values = undefined;\n }\n return analysis;\n }\n\n private analyzeMapSetField(analysis: FieldAnalysis): FieldAnalysis {\n analysis.confidence = \"low\";\n analysis.suggestions.push(\"Provide maxSize (recommended: 3-5)\");\n if (analysis.bounds) {\n analysis.bounds.maxSize = undefined;\n }\n return analysis;\n }\n\n /**\n * Try to find array bounds by searching for length checks\n */\n private findArrayBound(): { value: number; evidence: string } | null {\n // TODO: Search source code for patterns like:\n // - if (array.length < N)\n // - array.slice(0, N)\n // This would require analyzing the actual usage in code\n return null;\n }\n\n /**\n * Try to find number bounds by searching for comparisons\n */\n private findNumberBound(): { bounds: { min?: number; max?: number }; evidence: string } | null {\n // TODO: Search source code for patterns like:\n // - if (counter < 100)\n // - if (value >= 0 && value <= 100)\n // This would require analyzing the actual usage in code\n return null;\n }\n}\n\nexport async function analyzeCodebase(options: {\n tsConfigPath: string;\n stateFilePath?: string;\n}): Promise<CodebaseAnalysis> {\n const extractor = new TypeExtractor(options.tsConfigPath);\n return extractor.analyzeCodebase(options.stateFilePath);\n}\n",
|
|
16
16
|
"// Strict types for Structurizr DSL generation\n\n/**\n * Shape options for elements in Structurizr diagrams\n */\nexport type ElementShape =\n | \"Box\"\n | \"RoundedBox\"\n | \"Circle\"\n | \"Ellipse\"\n | \"Hexagon\"\n | \"Cylinder\"\n | \"Component\"\n | \"Person\"\n | \"Robot\"\n | \"Folder\"\n | \"WebBrowser\"\n | \"MobileDevicePortrait\"\n | \"MobileDeviceLandscape\"\n | \"Pipe\";\n\n/**\n * Routing options for relationships\n */\nexport type RelationshipRouting = \"Direct\" | \"Orthogonal\" | \"Curved\";\n\n/**\n * Line style for relationships\n */\nexport type LineStyle = \"Solid\" | \"Dashed\" | \"Dotted\";\n\n/**\n * Style configuration for an element tag\n */\nexport interface ElementStyle {\n /** Shape of the element */\n shape?: ElementShape;\n /** Icon URL */\n icon?: string;\n /** Width in pixels */\n width?: number;\n /** Height in pixels */\n height?: number;\n /** Background color (hex) */\n background?: string;\n /** Text color (hex) */\n color?: string;\n /** Font size in pixels */\n fontSize?: number;\n /** Border style */\n border?: LineStyle;\n /** Opacity (0-100) */\n opacity?: number;\n /** Metadata display */\n metadata?: boolean;\n /** Description display */\n description?: boolean;\n}\n\n/**\n * Style configuration for a relationship tag\n */\nexport interface RelationshipStyle {\n /** Line thickness in pixels */\n thickness?: number;\n /** Line color (hex) */\n color?: string;\n /** Line style */\n style?: LineStyle;\n /** Routing algorithm */\n routing?: RelationshipRouting;\n /** Font size for labels */\n fontSize?: number;\n /** Width for lines */\n width?: number;\n /** Position of label (0-100) */\n position?: number;\n /** Opacity (0-100) */\n opacity?: number;\n}\n\n/**\n * Complete styling configuration\n */\nexport interface StructurizrStyles {\n /** Element styles keyed by tag */\n elements?: Record<string, ElementStyle>;\n /** Relationship styles keyed by tag */\n relationships?: Record<string, RelationshipStyle>;\n /** Theme URL */\n theme?: string;\n}\n\n/**\n * Component relationship in the architecture\n */\nexport interface ComponentRelationship {\n /** Source component ID */\n from: string;\n /** Destination component ID */\n to: string;\n /** Description of the relationship */\n description: string;\n /** Technology used (e.g., \"HTTP\", \"SQL\", \"Function Call\") */\n technology?: string;\n /** Tags for the relationship */\n tags?: string[];\n}\n\n/**\n * Component properties (metadata)\n */\nexport interface ComponentProperties {\n /** Source file path and line numbers */\n Source?: string;\n /** Technology stack */\n Technology?: string;\n /** Detection pattern used */\n Pattern?: string;\n /** Message type handled */\n \"Message Type\"?: string;\n /** Additional custom properties */\n [key: string]: string | undefined;\n}\n\n/**\n * Group of related components\n */\nexport interface ComponentGroup {\n /** Group name */\n name: string;\n /** Component IDs in this group */\n components: string[];\n}\n\n/**\n * Step in a dynamic diagram sequence\n */\nexport interface DynamicDiagramStep {\n /** Step number */\n order: number;\n /** Source element ID */\n from: string;\n /** Destination element ID */\n to: string;\n /** Description of the interaction */\n description: string;\n /** Technology used */\n technology?: string;\n}\n\n/**\n * Dynamic diagram (sequence/flow diagram)\n */\nexport interface DynamicDiagram {\n /** Unique key for the diagram */\n key: string;\n /** Container scope */\n scope: string;\n /** Diagram title */\n title: string;\n /** Diagram description */\n description?: string;\n /** Sequence of steps */\n steps: DynamicDiagramStep[];\n}\n\n/**\n * Architectural perspective\n */\nexport interface Perspective {\n /** Perspective name (e.g., \"Security\", \"Performance\") */\n name: string;\n /** Description/reasoning */\n description: string;\n}\n\n/**\n * Container instance in a deployment node\n */\nexport interface ContainerInstance {\n /** Container context name (e.g., \"server\", \"client\", \"background\") */\n container: string;\n /** Number of instances */\n instances?: number;\n}\n\n/**\n * Deployment node in infrastructure\n */\nexport interface DeploymentNode {\n /** Node name */\n name: string;\n /** Description */\n description?: string;\n /** Technology */\n technology?: string;\n /** Tags (use \"environment:Production\" to specify environment) */\n tags?: string[];\n /** Properties */\n properties?: Record<string, string>;\n /** Container instances deployed to this node */\n containerInstances?: ContainerInstance[];\n /** Child deployment nodes (nested infrastructure) */\n children?: DeploymentNode[];\n}\n\n/**\n * Enhanced options for Structurizr DSL generation\n */\nexport interface StructurizrDSLOptions {\n /** Include dynamic diagrams for message flows */\n includeDynamicDiagrams?: boolean;\n\n /** Include component diagrams for contexts */\n includeComponentDiagrams?: boolean;\n\n /** Which contexts to generate component diagrams for */\n componentDiagramContexts?: string[];\n\n /** Styling configuration */\n styles?: StructurizrStyles;\n\n /** Whether to include default styles */\n includeDefaultStyles?: boolean;\n\n /** Component relationships to include */\n relationships?: ComponentRelationship[];\n\n /** Component properties to include */\n properties?: Record<string, ComponentProperties>;\n\n /** Component groups */\n groups?: ComponentGroup[];\n\n /** Dynamic diagrams to generate */\n dynamicDiagrams?: DynamicDiagram[];\n\n /** Architectural perspectives */\n perspectives?: Record<string, Perspective[]>;\n\n /** Deployment nodes */\n deploymentNodes?: DeploymentNode[];\n}\n\n/**\n * Default style palette\n */\nexport const DEFAULT_COLORS = {\n // Message handler types\n messageHandler: \"#1168bd\",\n queryHandler: \"#51cf66\",\n commandHandler: \"#ff922b\",\n authHandler: \"#ff6b6b\",\n subscribeHandler: \"#845ef7\",\n\n // Architectural layers\n service: \"#95a5a6\",\n repository: \"#74b9ff\",\n database: \"#0984e3\",\n externalSystem: \"#e17055\",\n\n // Infrastructure\n container: \"#6c5ce7\",\n deployment: \"#00b894\",\n\n // Text\n textLight: \"#ffffff\",\n textDark: \"#2d3436\",\n\n // Relationships\n relationship: \"#707070\",\n} as const;\n\n/**\n * Default element styles based on common tags\n */\nexport const DEFAULT_ELEMENT_STYLES: Record<string, ElementStyle> = {\n \"Message Handler\": {\n shape: \"Hexagon\",\n background: DEFAULT_COLORS.messageHandler,\n color: DEFAULT_COLORS.textLight,\n fontSize: 14,\n },\n Query: {\n background: DEFAULT_COLORS.queryHandler,\n color: DEFAULT_COLORS.textDark,\n },\n Command: {\n background: DEFAULT_COLORS.commandHandler,\n color: DEFAULT_COLORS.textDark,\n },\n Authentication: {\n background: DEFAULT_COLORS.authHandler,\n color: DEFAULT_COLORS.textLight,\n },\n Subscribe: {\n background: DEFAULT_COLORS.subscribeHandler,\n color: DEFAULT_COLORS.textLight,\n },\n Service: {\n shape: \"RoundedBox\",\n background: DEFAULT_COLORS.service,\n color: DEFAULT_COLORS.textLight,\n },\n Repository: {\n shape: \"Cylinder\",\n background: DEFAULT_COLORS.repository,\n color: DEFAULT_COLORS.textDark,\n },\n Database: {\n shape: \"Cylinder\",\n background: DEFAULT_COLORS.database,\n color: DEFAULT_COLORS.textLight,\n },\n \"External System\": {\n background: DEFAULT_COLORS.externalSystem,\n color: DEFAULT_COLORS.textLight,\n },\n Container: {\n background: DEFAULT_COLORS.container,\n color: DEFAULT_COLORS.textLight,\n },\n};\n\n/**\n * Default relationship styles\n */\nexport const DEFAULT_RELATIONSHIP_STYLES: Record<string, RelationshipStyle> = {\n Relationship: {\n routing: \"Orthogonal\",\n thickness: 2,\n color: DEFAULT_COLORS.relationship,\n fontSize: 12,\n },\n Sync: {\n style: \"Solid\",\n thickness: 2,\n },\n Async: {\n style: \"Dashed\",\n thickness: 2,\n },\n Database: {\n style: \"Solid\",\n thickness: 3,\n color: DEFAULT_COLORS.database,\n },\n};\n\n/**\n * Default theme URL\n */\nexport const DEFAULT_THEME = \"https://static.structurizr.com/themes/default/theme.json\";\n",
|
|
17
17
|
"// Structurizr DSL generator\n\nimport type {\n ArchitectureAnalysis,\n ContextInfo,\n MessageFlow,\n MessageHandler,\n} from \"../../../analysis/src\";\nimport type {\n ComponentGroup,\n ComponentProperties,\n DeploymentNode,\n DynamicDiagram,\n ElementStyle,\n StructurizrDSLOptions as EnhancedDSLOptions,\n RelationshipStyle,\n} from \"../types/structurizr\";\nimport {\n DEFAULT_ELEMENT_STYLES,\n DEFAULT_RELATIONSHIP_STYLES,\n DEFAULT_THEME,\n} from \"../types/structurizr\";\n\n// Re-export the enhanced type\nexport type StructurizrDSLOptions = EnhancedDSLOptions;\n\nexport class StructurizrDSLGenerator {\n private analysis: ArchitectureAnalysis;\n private options: StructurizrDSLOptions;\n\n constructor(analysis: ArchitectureAnalysis, options: StructurizrDSLOptions = {}) {\n this.analysis = analysis;\n this.options = {\n includeDynamicDiagrams: true,\n includeComponentDiagrams: true,\n componentDiagramContexts: [\"background\"],\n includeDefaultStyles: true,\n relationships: [],\n properties: {},\n groups: [],\n dynamicDiagrams: [],\n perspectives: {},\n deploymentNodes: [],\n ...options,\n styles: {\n theme: options.styles?.theme || DEFAULT_THEME,\n elements: {\n ...DEFAULT_ELEMENT_STYLES,\n ...options.styles?.elements,\n },\n relationships: {\n ...DEFAULT_RELATIONSHIP_STYLES,\n ...options.styles?.relationships,\n },\n },\n };\n }\n\n /**\n * Generate complete Structurizr DSL\n */\n generate(): string {\n const parts: string[] = [];\n\n parts.push(this.generateWorkspaceHeader());\n parts.push(this.generateModel());\n parts.push(this.generateViews());\n parts.push(this.generateWorkspaceFooter());\n\n return parts.join(\"\\n\\n\");\n }\n\n /**\n * Generate workspace header\n */\n private generateWorkspaceHeader(): string {\n const { name, description } = this.analysis.system;\n\n const parts = [`workspace \"${this.escape(name)}\" \"${this.escape(description || \"\")}\" {`];\n parts.push(\"\");\n parts.push(\" !identifiers hierarchical\");\n\n // Add ADRs if present\n if (this.analysis.adrs && this.analysis.adrs.adrs.length > 0) {\n parts.push(` !adrs ${this.analysis.adrs.directory}`);\n }\n\n return parts.join(\"\\n\");\n }\n\n /**\n * Generate workspace footer\n */\n private generateWorkspaceFooter(): string {\n return \"}\";\n }\n\n /**\n * Generate model section\n */\n private generateModel(): string {\n const parts: string[] = [];\n\n parts.push(\" model {\");\n parts.push(this.generatePeople());\n parts.push(this.generateExternalSystems());\n parts.push(this.generateMainSystem());\n\n // Add deployment environments if configured\n if (this.options.deploymentNodes && this.options.deploymentNodes.length > 0) {\n parts.push(this.generateDeploymentEnvironments());\n }\n\n parts.push(\" }\");\n\n return parts.join(\"\\n\\n\");\n }\n\n /**\n * Generate people/actors\n */\n private generatePeople(): string {\n return ` user = person \"User\" \"Extension user\"`;\n }\n\n /**\n * Generate external systems\n */\n private generateExternalSystems(): string {\n const parts: string[] = [];\n\n for (const integration of this.analysis.integrations) {\n if (integration.type === \"api\" || integration.type === \"websocket\") {\n let desc = integration.description || \"\";\n\n // Generate better description from API calls if available\n if (!desc && integration.calls && integration.calls.length > 0) {\n const endpoints = integration.calls\n .slice(0, 3)\n .map((c) => c.endpoint)\n .join(\", \");\n const methods = [...new Set(integration.calls.map((c) => c.method))].join(\", \");\n desc = `External API with endpoints: ${endpoints}. Methods: ${methods}`;\n }\n\n parts.push(\n ` ${this.toId(integration.name)} = softwareSystem \"${this.escape(integration.name)}\" \"${this.escape(desc)}\" {`\n );\n parts.push(\n ` tags \"External System\" \"${integration.type === \"websocket\" ? \"WebSocket\" : \"REST API\"}\"`\n );\n parts.push(\" }\");\n }\n }\n\n return parts.join(\"\\n\");\n }\n\n /**\n * Generate main system (the extension)\n */\n private generateMainSystem(): string {\n const parts: string[] = [];\n\n parts.push(` extension = softwareSystem \"${this.escape(this.analysis.system.name)}\" {`);\n\n // Generate containers (contexts)\n for (const [contextType, contextInfo] of Object.entries(this.analysis.contexts)) {\n parts.push(this.generateContainer(contextType, contextInfo));\n }\n\n // Generate relationships between containers\n parts.push(this.generateContainerRelationships());\n\n parts.push(\" }\");\n\n return parts.join(\"\\n\\n\");\n }\n\n /**\n * Generate container (context)\n */\n private generateContainer(contextType: string, contextInfo: ContextInfo): string {\n const parts: string[] = [];\n\n const technology = this.getContextTechnology(contextType);\n const description = contextInfo.description || `${this.capitalize(contextType)} context`;\n\n parts.push(\n ` ${contextType} = container \"${this.capitalize(contextType)}\" \"${this.escape(description)}\" \"${technology}\" {`\n );\n\n // Generate components if enabled\n if (\n this.options.includeComponentDiagrams &&\n this.options.componentDiagramContexts?.includes(contextType)\n ) {\n parts.push(this.generateComponents(contextType, contextInfo));\n parts.push(\"\");\n parts.push(this.generateComponentRelationships(contextType, contextInfo));\n }\n\n parts.push(\" }\");\n\n return parts.join(\"\\n\");\n }\n\n /**\n * Generate components within a container\n */\n private generateComponents(contextType: string, contextInfo: ContextInfo): string {\n const parts: string[] = [];\n\n // Build component definitions from handlers\n const componentDefs = this.buildComponentDefinitionsFromHandlers(contextInfo, contextType);\n\n // Apply grouping if configured, otherwise use automatic grouping\n this.addGroupedOrDirectComponents(parts, componentDefs);\n\n // Collect and generate service components\n const serviceComponents = this.collectServiceComponents(contextInfo, componentDefs);\n this.addServiceComponents(parts, serviceComponents);\n\n // Generate UI components\n this.addUIComponents(parts, contextInfo);\n\n // Add Chrome API components\n this.addChromeAPIComponents(parts, contextInfo);\n\n return parts.join(\"\\n\");\n }\n\n /**\n * Build component definitions from message handlers\n */\n private buildComponentDefinitionsFromHandlers(\n contextInfo: ContextInfo,\n contextType: string\n ): Array<{\n id: string;\n name: string;\n description: string;\n tags: string[];\n properties: ComponentProperties;\n messageType: string;\n }> {\n const componentDefs: Array<{\n id: string;\n name: string;\n description: string;\n tags: string[];\n properties: ComponentProperties;\n messageType: string;\n }> = [];\n\n const handlersByType = new Map<string, MessageHandler[]>();\n for (const handler of contextInfo.handlers) {\n if (!handlersByType.has(handler.messageType)) {\n handlersByType.set(handler.messageType, []);\n }\n handlersByType.get(handler.messageType)?.push(handler);\n }\n\n for (const [messageType, handlers] of handlersByType) {\n const componentName = this.toComponentName(messageType);\n const description = this.generateComponentDescription(messageType, handlers[0]);\n const tags = this.getComponentTags(messageType, handlers[0]);\n const properties = this.getComponentProperties(messageType, handlers[0], contextType);\n\n componentDefs.push({\n id: this.toId(componentName),\n name: componentName,\n description,\n tags,\n properties,\n messageType,\n });\n }\n\n return componentDefs;\n }\n\n /**\n * Add grouped or direct components to parts\n */\n private addGroupedOrDirectComponents(\n parts: string[],\n componentDefs: Array<{\n id: string;\n name: string;\n description: string;\n tags: string[];\n properties: ComponentProperties;\n messageType: string;\n }>\n ): void {\n if (this.options.groups && this.options.groups.length > 0) {\n parts.push(...this.generateGroupedComponents(componentDefs, this.options.groups));\n } else {\n const autoGroups = this.generateAutomaticGroups(componentDefs);\n if (autoGroups.length > 0) {\n parts.push(...this.generateGroupedComponents(componentDefs, autoGroups));\n } else {\n for (const comp of componentDefs) {\n parts.push(this.generateComponentDefinition(comp, \" \"));\n }\n }\n }\n }\n\n /**\n * Collect service components from relationships\n */\n private collectServiceComponents(\n contextInfo: ContextInfo,\n componentDefs: Array<{ id: string }>\n ): Set<string> {\n const serviceComponents = new Set<string>();\n for (const handler of contextInfo.handlers) {\n if (handler.relationships) {\n for (const rel of handler.relationships) {\n const targetId = this.toId(rel.to);\n const isHandler = componentDefs.some((c) => c.id === targetId);\n if (!isHandler) {\n serviceComponents.add(rel.to);\n }\n }\n }\n }\n return serviceComponents;\n }\n\n /**\n * Add service component definitions\n */\n private addServiceComponents(parts: string[], serviceComponents: Set<string>): void {\n for (const serviceId of serviceComponents) {\n const serviceName = serviceId\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n\n parts.push(\n ` ${this.toId(serviceId)} = component \"${serviceName}\" \"Business logic service\" {`\n );\n parts.push(` tags \"Service\" \"Auto-detected\"`);\n parts.push(\" }\");\n }\n }\n\n /**\n * Add UI components\n */\n private addUIComponents(parts: string[], contextInfo: ContextInfo): void {\n if (!contextInfo.components) return;\n\n for (const comp of contextInfo.components) {\n parts.push(\n ` ${this.toId(comp.name)} = component \"${comp.name}\" \"${this.escape(comp.description || \"UI component\")}\" {`\n );\n parts.push(` tags \"UI Component\"`);\n parts.push(\" }\");\n }\n }\n\n /**\n * Add Chrome API components\n */\n private addChromeAPIComponents(parts: string[], contextInfo: ContextInfo): void {\n if (!contextInfo.chromeAPIs || contextInfo.chromeAPIs.length === 0) return;\n\n for (const api of contextInfo.chromeAPIs) {\n const apiId = this.toId(`chrome_${api}`);\n parts.push(\n ` ${apiId} = component \"Chrome ${this.capitalize(api)} API\" \"Browser API for ${api}\" {`\n );\n parts.push(` tags \"Chrome API\" \"External\"`);\n parts.push(\" }\");\n }\n }\n\n /**\n * Generate better component descriptions based on message type\n */\n private generateComponentDescription(messageType: string, _handler: MessageHandler): string {\n const type = messageType.toLowerCase();\n\n // Authentication related\n if (type.includes(\"login\")) {\n return \"Authenticates users and establishes sessions\";\n }\n if (type.includes(\"logout\")) {\n return \"Terminates user sessions and clears credentials\";\n }\n\n // CRUD operations\n if (type.includes(\"add\") || type.includes(\"create\")) {\n const entity = type.replace(/_(add|create)/, \"\").replace(/_/g, \" \");\n return `Creates new ${entity} items and persists to storage`;\n }\n if (type.includes(\"remove\") || type.includes(\"delete\")) {\n const entity = type.replace(/_(remove|delete)/, \"\").replace(/_/g, \" \");\n return `Removes ${entity} items from storage`;\n }\n if (type.includes(\"update\") || type.includes(\"toggle\")) {\n const entity = type.replace(/_(update|toggle)/, \"\").replace(/_/g, \" \");\n return `Updates ${entity} item state and syncs with storage`;\n }\n if (type.includes(\"clear\")) {\n const entity = type.replace(/_clear.*/, \"\").replace(/_/g, \" \");\n return `Clears all ${entity} items matching criteria`;\n }\n\n // Query operations\n if (type.includes(\"get\") || type.includes(\"fetch\") || type.includes(\"load\")) {\n const entity = type.replace(/_(get|fetch|load)/, \"\").replace(/_/g, \" \");\n return `Retrieves ${entity} data from storage`;\n }\n\n // Default\n return `Processes ${messageType} messages and coordinates business logic`;\n }\n\n /**\n * Determine appropriate tags for a component\n */\n private getComponentTags(messageType: string, _handler: MessageHandler): string[] {\n const tags: string[] = [\"Message Handler\"];\n const type = messageType.toLowerCase();\n\n // Add functional tags\n if (type.includes(\"login\") || type.includes(\"logout\") || type.includes(\"auth\")) {\n tags.push(\"Authentication\");\n } else if (\n type.includes(\"add\") ||\n type.includes(\"create\") ||\n type.includes(\"update\") ||\n type.includes(\"delete\") ||\n type.includes(\"remove\") ||\n type.includes(\"toggle\")\n ) {\n tags.push(\"CRUD\");\n } else if (type.includes(\"get\") || type.includes(\"fetch\") || type.includes(\"load\")) {\n tags.push(\"Query\");\n }\n\n // Add domain tags\n if (type.includes(\"user\")) {\n tags.push(\"User Management\");\n }\n if (type.includes(\"todo\")) {\n tags.push(\"Todo Management\");\n }\n if (type.includes(\"state\")) {\n tags.push(\"State Management\");\n }\n\n return tags;\n }\n\n /**\n * Get component properties for traceability\n */\n private getComponentProperties(\n messageType: string,\n handler: MessageHandler,\n contextType: string\n ): ComponentProperties {\n const properties: ComponentProperties = {};\n\n // Add source file and line number\n if (handler.location) {\n const relativePath = handler.location.file.replace(`${this.analysis.projectRoot}/`, \"\");\n properties[\"Source\"] = `${relativePath}:${handler.location.line}`;\n }\n\n // Add technology stack\n const technologies: string[] = [\"TypeScript\"];\n\n // Detect framework/library from file path or context\n if (handler.location?.file.includes(\"ws\") || contextType === \"server\") {\n technologies.push(\"WebSocket\");\n }\n if (handler.location?.file.includes(\"socket.io\")) {\n technologies.push(\"Socket.IO\");\n }\n if (handler.location?.file.includes(\"elysia\")) {\n technologies.push(\"Elysia\");\n }\n\n properties[\"Technology\"] = technologies.join(\", \");\n\n // Add pattern/type\n const type = messageType.toLowerCase();\n let pattern = \"Message Handler\";\n\n if (\n type.includes(\"query\") ||\n type.includes(\"get\") ||\n type.includes(\"fetch\") ||\n type.includes(\"load\")\n ) {\n pattern = \"Query Handler\";\n properties[\"Message Type\"] = \"Query\";\n } else if (\n type.includes(\"command\") ||\n type.includes(\"add\") ||\n type.includes(\"create\") ||\n type.includes(\"update\") ||\n type.includes(\"delete\") ||\n type.includes(\"remove\")\n ) {\n pattern = \"Command Handler\";\n properties[\"Message Type\"] = \"Command\";\n } else if (type.includes(\"auth\") || type.includes(\"login\") || type.includes(\"logout\")) {\n pattern = \"Authentication Handler\";\n properties[\"Message Type\"] = \"Authentication\";\n } else if (type.includes(\"subscribe\") || type.includes(\"watch\") || type.includes(\"listen\")) {\n pattern = \"Subscription Handler\";\n properties[\"Message Type\"] = \"Subscription\";\n }\n\n properties[\"Pattern\"] = pattern;\n\n // Merge with user-provided properties\n if (this.options.properties?.[messageType]) {\n Object.assign(properties, this.options.properties[messageType]);\n }\n\n return properties;\n }\n\n /**\n * Generate relationships between components within a container\n */\n private generateComponentRelationships(_contextType: string, contextInfo: ContextInfo): string {\n const parts: string[] = [];\n const handlersByType = this.buildHandlersByTypeMap(contextInfo.handlers);\n\n parts.push(...this.generateChromeAPIRelationships(contextInfo, handlersByType));\n parts.push(...this.generateUserProvidedRelationships());\n parts.push(...this.generateAutoDetectedRelationships(contextInfo));\n parts.push(...this.generateStateManagementRelationships(handlersByType));\n\n return parts.join(\"\\n\");\n }\n\n /**\n * Build a map of handlers by message type\n */\n private buildHandlersByTypeMap(handlers: MessageHandler[]): Map<string, MessageHandler[]> {\n const handlersByType = new Map<string, MessageHandler[]>();\n\n for (const handler of handlers) {\n if (!handlersByType.has(handler.messageType)) {\n handlersByType.set(handler.messageType, []);\n }\n handlersByType.get(handler.messageType)?.push(handler);\n }\n\n return handlersByType;\n }\n\n /**\n * Generate Chrome API relationships\n */\n private generateChromeAPIRelationships(\n contextInfo: ContextInfo,\n handlersByType: Map<string, MessageHandler[]>\n ): string[] {\n const parts: string[] = [];\n\n if (!contextInfo.chromeAPIs || contextInfo.chromeAPIs.length === 0) {\n return parts;\n }\n\n for (const api of contextInfo.chromeAPIs) {\n const apiId = this.toId(`chrome_${api}`);\n\n for (const [messageType, _handlers] of handlersByType) {\n const componentId = this.toId(this.toComponentName(messageType));\n const description = this.inferChromeAPIDescription(api, messageType);\n parts.push(` ${componentId} -> ${apiId} \"${description}\"`);\n }\n }\n\n return parts;\n }\n\n /**\n * Infer relationship description based on Chrome API\n */\n private inferChromeAPIDescription(api: string, messageType: string): string {\n if (api === \"storage\") {\n return this.inferStorageDescription(messageType);\n }\n\n if (api === \"tabs\") {\n return \"Manages browser tabs\";\n }\n\n if (api === \"runtime\") {\n return \"Sends messages\";\n }\n\n return `Uses ${api}`;\n }\n\n /**\n * Infer storage description based on message type\n */\n private inferStorageDescription(messageType: string): string {\n const type = messageType.toLowerCase();\n\n if (type.includes(\"get\") || type.includes(\"load\")) {\n return \"Reads from storage\";\n }\n\n return \"Writes to storage\";\n }\n\n /**\n * Generate user-provided explicit relationships\n */\n private generateUserProvidedRelationships(): string[] {\n const parts: string[] = [];\n\n if (!this.options.relationships || this.options.relationships.length === 0) {\n return parts;\n }\n\n for (const rel of this.options.relationships) {\n const fromId = this.toId(rel.from);\n const toId = this.toId(rel.to);\n const description = this.escape(rel.description);\n const technology = rel.technology ? ` \"${this.escape(rel.technology)}\"` : \"\";\n\n parts.push(` ${fromId} -> ${toId} \"${description}\"${technology} {`);\n\n if (rel.tags && rel.tags.length > 0) {\n parts.push(` tags \"${rel.tags.join('\" \"')}\"`);\n }\n\n parts.push(\" }\");\n }\n\n return parts;\n }\n\n /**\n * Generate automatically detected relationships\n */\n private generateAutoDetectedRelationships(contextInfo: ContextInfo): string[] {\n const parts: string[] = [];\n\n for (const handler of contextInfo.handlers) {\n if (!handler.relationships || handler.relationships.length === 0) {\n continue;\n }\n\n for (const rel of handler.relationships) {\n const fromId = this.toId(rel.from);\n const toId = this.toId(rel.to);\n const description = this.escape(rel.description);\n const technology = rel.technology ? ` \"${this.escape(rel.technology)}\"` : \"\";\n\n parts.push(` ${fromId} -> ${toId} \"${description}\"${technology} {`);\n parts.push(` tags \"Auto-detected\"`);\n parts.push(\" }\");\n }\n }\n\n return parts;\n }\n\n /**\n * Generate state management relationships\n */\n private generateStateManagementRelationships(\n handlersByType: Map<string, MessageHandler[]>\n ): string[] {\n const parts: string[] = [];\n const { stateHandlers, queryHandlers } = this.classifyHandlersByType(handlersByType);\n\n if (stateHandlers.length === 0 || queryHandlers.length === 0) {\n return parts;\n }\n\n for (const queryHandler of queryHandlers) {\n for (const stateHandler of stateHandlers) {\n if (queryHandler !== stateHandler) {\n parts.push(` ${stateHandler} -> ${queryHandler} \"Updates state\" {`);\n parts.push(` tags \"Implicit\"`);\n parts.push(\" }\");\n }\n }\n }\n\n return parts;\n }\n\n /**\n * Classify handlers into state and query handlers\n */\n private classifyHandlersByType(handlersByType: Map<string, MessageHandler[]>): {\n stateHandlers: string[];\n queryHandlers: string[];\n } {\n const stateHandlers: string[] = [];\n const queryHandlers: string[] = [];\n\n for (const [messageType, _handlers] of handlersByType) {\n const type = messageType.toLowerCase();\n const componentId = this.toId(this.toComponentName(messageType));\n\n if (this.isStateHandler(type)) {\n stateHandlers.push(componentId);\n } else if (this.isQueryHandler(type)) {\n queryHandlers.push(componentId);\n }\n }\n\n return { stateHandlers, queryHandlers };\n }\n\n /**\n * Check if handler is a state mutation handler\n */\n private isStateHandler(type: string): boolean {\n return (\n type.includes(\"add\") ||\n type.includes(\"create\") ||\n type.includes(\"update\") ||\n type.includes(\"delete\") ||\n type.includes(\"remove\") ||\n type.includes(\"toggle\") ||\n type.includes(\"clear\") ||\n type.includes(\"login\") ||\n type.includes(\"logout\")\n );\n }\n\n /**\n * Check if handler is a query handler\n */\n private isQueryHandler(type: string): boolean {\n return type.includes(\"get\") || type.includes(\"fetch\") || type.includes(\"load\");\n }\n\n /**\n * Generate relationships between containers\n */\n private generateContainerRelationships(): string {\n const parts: string[] = [];\n\n parts.push(...this.generateUserRelationships());\n parts.push(...this.generateMessageFlowRelationships());\n parts.push(...this.generateExternalAPIRelationships());\n\n return parts.join(\"\\n\");\n }\n\n /**\n * Generate user-to-UI relationships\n */\n private generateUserRelationships(): string[] {\n const parts: string[] = [];\n const uiContexts = [\"popup\", \"options\", \"devtools\"];\n\n for (const contextType of Object.keys(this.analysis.contexts)) {\n if (uiContexts.includes(contextType)) {\n parts.push(` user -> extension.${contextType} \"Uses\"`);\n }\n }\n\n return parts;\n }\n\n /**\n * Generate message flow relationships\n */\n private generateMessageFlowRelationships(): string[] {\n const parts: string[] = [];\n\n for (const flow of this.analysis.messageFlows) {\n const tech = `Sends ${flow.messageType}`;\n for (const to of flow.to) {\n parts.push(` extension.${flow.from} -> extension.${to} \"${tech}\"`);\n }\n }\n\n return parts;\n }\n\n /**\n * Generate external API relationships\n */\n private generateExternalAPIRelationships(): string[] {\n const parts: string[] = [];\n\n for (const integration of this.analysis.integrations) {\n if (integration.type !== \"api\" && integration.type !== \"websocket\") {\n continue;\n }\n\n // Find which contexts use this integration\n for (const [contextType, contextInfo] of Object.entries(this.analysis.contexts)) {\n const usesIntegration = contextInfo.externalAPIs.some((api) =>\n integration.calls?.some((call) => call.endpoint === api.endpoint)\n );\n\n if (usesIntegration) {\n const method = integration.type === \"websocket\" ? \"Connects to\" : \"Calls\";\n parts.push(\n ` extension.${contextType} -> ${this.toId(integration.name)} \"${method}\"`\n );\n }\n }\n }\n\n return parts;\n }\n\n /**\n * Generate views section\n */\n private generateViews(): string {\n const parts: string[] = [];\n\n parts.push(\" views {\");\n parts.push(this.generateSystemContextView());\n parts.push(this.generateContainerView());\n\n if (this.options.includeComponentDiagrams) {\n for (const contextType of this.options.componentDiagramContexts || []) {\n if (this.analysis.contexts[contextType]) {\n parts.push(this.generateComponentView(contextType));\n }\n }\n }\n\n if (this.options.includeDynamicDiagrams) {\n parts.push(this.generateDynamicViews());\n }\n\n // Add deployment views if configured\n if (this.options.deploymentNodes && this.options.deploymentNodes.length > 0) {\n parts.push(this.generateDeploymentViews());\n }\n\n parts.push(this.generateStyles());\n parts.push(\" }\");\n\n // Add documentation section if ADRs exist\n if (this.analysis.adrs && this.analysis.adrs.adrs.length > 0) {\n parts.push(\"\");\n parts.push(this.generateDocumentation());\n }\n\n return parts.join(\"\\n\\n\");\n }\n\n /**\n * Generate documentation section for ADRs\n */\n private generateDocumentation(): string {\n if (!this.analysis.adrs || this.analysis.adrs.adrs.length === 0) {\n return \"\";\n }\n\n const parts: string[] = [];\n parts.push(\" documentation {\");\n\n for (const adr of this.analysis.adrs.adrs) {\n parts.push(` decision \"${adr.id}\" {`);\n parts.push(` title \"${this.escape(adr.title)}\"`);\n parts.push(` status \"${adr.status}\"`);\n parts.push(` date \"${adr.date}\"`);\n parts.push(` content \"${this.escape(adr.context)}\"`);\n parts.push(\" }\");\n }\n\n parts.push(\" }\");\n\n return parts.join(\"\\n\");\n }\n\n /**\n * Generate system context view\n */\n private generateSystemContextView(): string {\n return ` systemContext extension \"SystemContext\" {\n include *\n autoLayout lr\n }`;\n }\n\n /**\n * Generate container view\n */\n private generateContainerView(): string {\n return ` container extension \"Containers\" {\n include *\n autoLayout lr\n }`;\n }\n\n /**\n * Generate component view\n */\n private generateComponentView(contextType: string): string {\n return ` component extension.${contextType} \"Components_${this.capitalize(contextType)}\" {\n include *\n autoLayout tb\n }`;\n }\n\n /**\n * Generate dynamic views for message flows\n */\n private generateDynamicViews(): string {\n const parts: string[] = [];\n\n // Generate user-provided dynamic diagrams first\n if (this.options.dynamicDiagrams && this.options.dynamicDiagrams.length > 0) {\n for (const diagram of this.options.dynamicDiagrams) {\n parts.push(this.generateUserDynamicDiagram(diagram));\n }\n }\n\n // Auto-generate diagrams from handler relationships (Priority 5)\n const autoDiagrams = this.generateAutomaticDynamicDiagrams();\n if (autoDiagrams.length > 0) {\n parts.push(...autoDiagrams);\n }\n\n // Group flows by domain/feature for inter-context flow diagrams\n const flowsByDomain = this.groupFlowsByDomain(this.analysis.messageFlows);\n\n // Generate a dynamic view for each domain\n let count = 0;\n for (const [domain, flows] of flowsByDomain) {\n if (count >= 5) break; // Limit to avoid too many diagrams\n\n const viewName = `${this.capitalize(domain)} Flow`;\n parts.push(this.generateDynamicView(viewName, flows, domain));\n count++;\n }\n\n return parts.join(\"\\n\\n\");\n }\n\n /**\n * Group message flows by domain/feature\n */\n private groupFlowsByDomain(flows: MessageFlow[]): Map<string, MessageFlow[]> {\n const flowsByDomain = new Map<string, MessageFlow[]>();\n\n for (const flow of flows) {\n const domain = this.extractDomainFromMessageType(flow.messageType);\n\n if (!flowsByDomain.has(domain)) {\n flowsByDomain.set(domain, []);\n }\n flowsByDomain.get(domain)?.push(flow);\n }\n\n return flowsByDomain;\n }\n\n /**\n * Extract domain from message type\n */\n private extractDomainFromMessageType(messageType: string): string {\n const lowerType = messageType.toLowerCase();\n\n if (\n lowerType.includes(\"user\") ||\n lowerType.includes(\"login\") ||\n lowerType.includes(\"logout\") ||\n lowerType.includes(\"auth\")\n ) {\n return \"authentication\";\n }\n\n if (lowerType.includes(\"todo\")) {\n return \"todo\";\n }\n\n if (lowerType.includes(\"state\")) {\n return \"state\";\n }\n\n return \"general\";\n }\n\n /**\n * Automatically generate dynamic diagrams from handler relationships\n */\n private generateAutomaticDynamicDiagrams(): string[] {\n const handlersWithRelationships = this.collectHandlersWithRelationships();\n const handlerGroups = this.categorizeHandlers(handlersWithRelationships);\n return this.generateCategoryDiagrams(handlerGroups, handlersWithRelationships.length);\n }\n\n /**\n * Collect all handlers with relationships from all contexts\n */\n private collectHandlersWithRelationships(): Array<{\n handler: MessageHandler;\n contextType: string;\n contextName: string;\n }> {\n const handlers: Array<{\n handler: MessageHandler;\n contextType: string;\n contextName: string;\n }> = [];\n\n for (const [contextType, contextInfo] of Object.entries(this.analysis.contexts)) {\n for (const handler of contextInfo.handlers) {\n if (handler.relationships && handler.relationships.length > 0) {\n handlers.push({\n handler,\n contextType,\n contextName: this.toId(contextType),\n });\n }\n }\n }\n\n return handlers;\n }\n\n /**\n * Categorize handlers by message type patterns\n */\n private categorizeHandlers(\n handlers: Array<{ handler: MessageHandler; contextType: string; contextName: string }>\n ): Map<string, Array<{ handler: MessageHandler; contextType: string; contextName: string }>> {\n const groups = new Map<\n string,\n Array<{ handler: MessageHandler; contextType: string; contextName: string }>\n >();\n\n for (const hwc of handlers) {\n const category = this.inferHandlerCategory(hwc.handler.messageType);\n\n if (!groups.has(category)) {\n groups.set(category, []);\n }\n groups.get(category)?.push(hwc);\n }\n\n return groups;\n }\n\n /**\n * Infer handler category from message type\n */\n private inferHandlerCategory(messageType: string): string {\n const lowerType = messageType.toLowerCase();\n\n if (\n lowerType.includes(\"auth\") ||\n lowerType.includes(\"login\") ||\n lowerType.includes(\"logout\") ||\n lowerType.includes(\"verify\") ||\n lowerType.includes(\"register\")\n ) {\n return \"authentication\";\n }\n\n if (lowerType.includes(\"user\")) {\n return \"user\";\n }\n\n if (lowerType.includes(\"todo\")) {\n return \"todo\";\n }\n\n if (\n lowerType.includes(\"query\") ||\n lowerType.includes(\"get\") ||\n lowerType.includes(\"fetch\") ||\n lowerType.includes(\"list\")\n ) {\n return \"query\";\n }\n\n if (\n lowerType.includes(\"command\") ||\n lowerType.includes(\"create\") ||\n lowerType.includes(\"update\") ||\n lowerType.includes(\"delete\") ||\n lowerType.includes(\"add\") ||\n lowerType.includes(\"remove\")\n ) {\n return \"command\";\n }\n\n return \"general\";\n }\n\n /**\n * Generate diagrams based on categorized handlers\n */\n private generateCategoryDiagrams(\n handlerGroups: Map<\n string,\n Array<{ handler: MessageHandler; contextType: string; contextName: string }>\n >,\n totalHandlers: number\n ): string[] {\n if (totalHandlers <= 5 && handlerGroups.size <= 3) {\n return this.generateCombinedDiagram(handlerGroups);\n }\n return this.generateSeparateDiagrams(handlerGroups);\n }\n\n /**\n * Generate a single combined diagram for small handler sets\n */\n private generateCombinedDiagram(\n handlerGroups: Map<\n string,\n Array<{ handler: MessageHandler; contextType: string; contextName: string }>\n >\n ): string[] {\n const diagrams: string[] = [];\n const allHandlers = Array.from(handlerGroups.values()).flat();\n const diagram = this.generateHandlerFlowDiagram(\"general\", allHandlers);\n if (diagram) {\n diagrams.push(diagram);\n }\n return diagrams;\n }\n\n /**\n * Generate separate diagrams per category\n */\n private generateSeparateDiagrams(\n handlerGroups: Map<\n string,\n Array<{ handler: MessageHandler; contextType: string; contextName: string }>\n >\n ): string[] {\n const diagrams: string[] = [];\n const maxDiagrams = 5;\n let diagramCount = 0;\n\n for (const [category, handlers] of handlerGroups) {\n if (diagramCount >= maxDiagrams) break;\n if (handlers.length === 0) continue;\n\n const diagram = this.generateHandlerFlowDiagram(category, handlers);\n if (diagram) {\n diagrams.push(diagram);\n diagramCount++;\n }\n }\n\n return diagrams;\n }\n\n /**\n * Generate a single dynamic diagram for a handler category\n */\n private generateHandlerFlowDiagram(\n category: string,\n handlers: Array<{ handler: MessageHandler; contextType: string; contextName: string }>\n ): string | null {\n const parts: string[] = [];\n\n // Create title and description\n const title = this.getCategoryTitle(category);\n const description = this.getCategoryDescription(category);\n\n // Use container scope (most common for component flows)\n const scope = handlers[0]?.contextName ? `extension.${handlers[0].contextName}` : \"extension\";\n\n parts.push(` dynamic ${scope} \"${title}\" \"${description}\" {`);\n\n let stepCount = 0;\n\n // For each handler, show its flow through services\n for (const { handler, contextName: _contextName } of handlers) {\n const handlerComponentId = this.toId(`${handler.messageType}_handler`);\n\n // Show flow for each relationship\n for (const rel of handler.relationships) {\n const toComponent = this.toId(rel.to);\n\n // Add flow step\n parts.push(` ${handlerComponentId} -> ${toComponent} \"${rel.description}\"`);\n stepCount++;\n }\n }\n\n // Only generate diagram if there are actual flows\n if (stepCount === 0) {\n return null;\n }\n\n parts.push(\" autoLayout lr\");\n parts.push(\" }\");\n\n return parts.join(\"\\n\");\n }\n\n /**\n * Get display title for category\n */\n private getCategoryTitle(category: string): string {\n const titles: Record<string, string> = {\n authentication: \"Authentication Flow\",\n user: \"User Management Flow\",\n todo: \"Todo Management Flow\",\n query: \"Query Processing Flow\",\n command: \"Command Processing Flow\",\n general: \"Message Processing Flow\",\n };\n return titles[category] || `${this.capitalize(category)} Flow`;\n }\n\n /**\n * Get description for category\n */\n private getCategoryDescription(category: string): string {\n const descriptions: Record<string, string> = {\n authentication: \"Shows authentication request processing and service interactions\",\n user: \"Shows user management operations and service dependencies\",\n todo: \"Shows todo item operations and service dependencies\",\n query: \"Shows read operations flow through query handlers and services\",\n command: \"Shows write operations flow through command handlers and services\",\n general: \"Shows message processing flow through handlers and services\",\n };\n return descriptions[category] || \"Shows message flow through system components\";\n }\n\n /**\n * Generate a user-provided dynamic diagram\n */\n private generateUserDynamicDiagram(diagram: DynamicDiagram): string {\n const parts: string[] = [];\n\n parts.push(\n ` dynamic ${diagram.scope || \"extension\"} \"${this.escape(diagram.title)}\" \"${this.escape(diagram.description || \"\")}\" {`\n );\n\n for (const step of diagram.steps) {\n const from = step.from;\n const to = step.to;\n const description = this.escape(step.description);\n\n parts.push(` ${from} -> ${to} \"${description}\"`);\n }\n\n parts.push(\" autoLayout lr\");\n parts.push(\" }\");\n\n return parts.join(\"\\n\");\n }\n\n /**\n * Generate single dynamic view\n */\n private generateDynamicView(flowName: string, flows: MessageFlow[], domain: string): string {\n const parts: string[] = [];\n\n // Create a user-centric description\n const description = this.getDynamicViewDescription(domain);\n parts.push(` dynamic extension \"${flowName}\" \"${description}\" {`);\n\n // Add user interaction if this is a UI flow\n const uiContexts = [\"popup\", \"options\", \"devtools\"];\n const hasUIFlow = flows.some((f) => uiContexts.includes(f.from));\n\n if (hasUIFlow) {\n // Start with user interaction\n const firstFlow = flows.find((f) => uiContexts.includes(f.from));\n if (firstFlow) {\n const action = this.getUserAction(domain);\n parts.push(` user -> extension.${firstFlow.from} \"${action}\"`);\n }\n }\n\n // Generate message flows\n for (const flow of flows) {\n const messageDesc = this.getMessageDescription(flow.messageType);\n\n for (const to of flow.to) {\n parts.push(` extension.${flow.from} -> extension.${to} \"${messageDesc}\"`);\n }\n }\n\n parts.push(\" autoLayout lr\");\n parts.push(\" }\");\n\n return parts.join(\"\\n\");\n }\n\n /**\n * Get description for dynamic view based on domain\n */\n private getDynamicViewDescription(domain: string): string {\n const descriptions: Record<string, string> = {\n authentication: \"User authentication and session management\",\n todo: \"Todo item creation, updates, and retrieval\",\n state: \"Application state synchronization\",\n general: \"Message flow through the system\",\n };\n return descriptions[domain] || descriptions.general;\n }\n\n /**\n * Get user action description for domain\n */\n private getUserAction(domain: string): string {\n const actions: Record<string, string> = {\n authentication: \"Initiates login\",\n todo: \"Manages todo items\",\n state: \"Requests state\",\n general: \"Interacts\",\n };\n return actions[domain] || actions.general;\n }\n\n /**\n * Get message description based on type\n */\n private getMessageDescription(messageType: string): string {\n const type = messageType.toLowerCase();\n\n if (type.includes(\"login\")) return \"Authenticate user\";\n if (type.includes(\"logout\")) return \"End session\";\n if (type.includes(\"add\") || type.includes(\"create\")) return \"Create item\";\n if (type.includes(\"remove\") || type.includes(\"delete\")) return \"Delete item\";\n if (type.includes(\"update\") || type.includes(\"toggle\")) return \"Update item\";\n if (type.includes(\"get\") || type.includes(\"fetch\")) return \"Retrieve data\";\n if (type.includes(\"clear\")) return \"Clear items\";\n\n return messageType;\n }\n\n /**\n * Generate deployment environments (for model section)\n */\n private generateDeploymentEnvironments(): string {\n const parts: string[] = [];\n\n // Group deployment nodes by environment\n const nodesByEnvironment = new Map<string, DeploymentNode[]>();\n\n for (const node of this.options.deploymentNodes || []) {\n const env =\n node.tags?.find((tag) => tag.toLowerCase().includes(\"environment:\"))?.split(\":\")[1] ||\n \"Production\";\n\n if (!nodesByEnvironment.has(env)) {\n nodesByEnvironment.set(env, []);\n }\n nodesByEnvironment.get(env)?.push(node);\n }\n\n // Generate deployment environment for each environment\n for (const [envName, nodes] of nodesByEnvironment) {\n parts.push(` deploymentEnvironment \"${envName}\" {`);\n\n for (const node of nodes) {\n parts.push(this.generateDeploymentNode(node, \" \"));\n }\n\n parts.push(\" }\");\n }\n\n return parts.join(\"\\n\");\n }\n\n /**\n * Generate a single deployment node\n */\n private generateDeploymentNode(node: DeploymentNode, indent: string): string {\n const parts: string[] = [];\n\n const description = node.description ? ` \"${this.escape(node.description)}\"` : \"\";\n const technology = node.technology ? ` \"${this.escape(node.technology)}\"` : \"\";\n\n parts.push(`${indent}deploymentNode \"${this.escape(node.name)}\"${description}${technology} {`);\n\n this.addDeploymentNodeTags(node, indent, parts);\n this.addDeploymentNodeProperties(node, indent, parts);\n this.addDeploymentNodeChildren(node, indent, parts);\n this.addDeploymentNodeContainerInstances(node, indent, parts);\n\n parts.push(`${indent}}`);\n\n return parts.join(\"\\n\");\n }\n\n /**\n * Add tags to deployment node\n */\n private addDeploymentNodeTags(node: DeploymentNode, indent: string, parts: string[]): void {\n if (!node.tags || node.tags.length === 0) return;\n\n const filteredTags = node.tags.filter((tag) => !tag.toLowerCase().includes(\"environment:\"));\n if (filteredTags.length > 0) {\n parts.push(`${indent} tags \"${filteredTags.join('\" \"')}\"`);\n }\n }\n\n /**\n * Add properties to deployment node\n */\n private addDeploymentNodeProperties(node: DeploymentNode, indent: string, parts: string[]): void {\n if (!node.properties || Object.keys(node.properties).length === 0) return;\n\n parts.push(`${indent} properties {`);\n for (const [key, value] of Object.entries(node.properties)) {\n parts.push(`${indent} \"${this.escape(key)}\" \"${this.escape(value)}\"`);\n }\n parts.push(`${indent} }`);\n }\n\n /**\n * Add child deployment nodes\n */\n private addDeploymentNodeChildren(node: DeploymentNode, indent: string, parts: string[]): void {\n if (!node.children || node.children.length === 0) return;\n\n for (const child of node.children) {\n parts.push(this.generateDeploymentNode(child, `${indent} `));\n }\n }\n\n /**\n * Add container instances to deployment node\n */\n private addDeploymentNodeContainerInstances(\n node: DeploymentNode,\n indent: string,\n parts: string[]\n ): void {\n if (node.containerInstances && node.containerInstances.length > 0) {\n for (const containerInstance of node.containerInstances) {\n const instancesStr =\n containerInstance.instances && containerInstance.instances > 1\n ? ` ${containerInstance.instances}`\n : \"\";\n parts.push(\n `${indent} containerInstance extension.${containerInstance.container}${instancesStr}`\n );\n }\n } else if (!node.children || node.children.length === 0) {\n // If no container instances specified and no children, deploy all containers as fallback\n const contexts = Object.keys(this.analysis.contexts);\n for (const contextType of contexts) {\n parts.push(`${indent} containerInstance extension.${contextType}`);\n }\n }\n }\n\n /**\n * Generate deployment views\n */\n private generateDeploymentViews(): string {\n const parts: string[] = [];\n\n // Group deployment nodes by environment\n const nodesByEnvironment = new Map<string, DeploymentNode[]>();\n\n for (const node of this.options.deploymentNodes || []) {\n const env =\n node.tags?.find((tag) => tag.toLowerCase().includes(\"environment:\"))?.split(\":\")[1] ||\n \"Production\";\n\n if (!nodesByEnvironment.has(env)) {\n nodesByEnvironment.set(env, []);\n }\n nodesByEnvironment.get(env)?.push(node);\n }\n\n // Generate deployment view for each environment\n for (const [envName] of nodesByEnvironment) {\n const description = `${envName} environment deployment architecture`;\n\n parts.push(` deployment extension \"${envName}\" \"${description}\" {`);\n parts.push(\" include *\");\n parts.push(\" autoLayout lr\");\n parts.push(\" }\");\n }\n\n return parts.join(\"\\n\\n\");\n }\n\n /**\n * Generate styles\n */\n /**\n * Generate styles section with element and relationship styles\n */\n private generateStyles(): string {\n const parts: string[] = [];\n\n parts.push(\" styles {\");\n\n // Generate element styles\n if (this.options.includeDefaultStyles && this.options.styles?.elements) {\n for (const [tag, style] of Object.entries(this.options.styles.elements)) {\n parts.push(this.generateElementStyle(tag, style));\n }\n }\n\n // Generate relationship styles\n if (this.options.includeDefaultStyles && this.options.styles?.relationships) {\n for (const [tag, style] of Object.entries(this.options.styles.relationships)) {\n parts.push(this.generateRelationshipStyle(tag, style));\n }\n }\n\n // Add theme if specified\n if (this.options.styles?.theme) {\n parts.push(` theme ${this.options.styles.theme}`);\n }\n\n parts.push(\" }\");\n\n return parts.join(\"\\n\");\n }\n\n /**\n * Generate style block for an element tag\n */\n private generateElementStyle(tag: string, style: ElementStyle): string {\n const parts: string[] = [];\n\n parts.push(` element \"${tag}\" {`);\n\n if (style.shape) {\n parts.push(` shape ${style.shape}`);\n }\n if (style.icon) {\n parts.push(` icon ${style.icon}`);\n }\n if (style.width) {\n parts.push(` width ${style.width}`);\n }\n if (style.height) {\n parts.push(` height ${style.height}`);\n }\n if (style.background) {\n parts.push(` background ${style.background}`);\n }\n if (style.color) {\n parts.push(` color ${style.color}`);\n }\n if (style.fontSize) {\n parts.push(` fontSize ${style.fontSize}`);\n }\n if (style.border) {\n parts.push(` border ${style.border}`);\n }\n if (style.opacity !== undefined) {\n parts.push(` opacity ${style.opacity}`);\n }\n if (style.metadata !== undefined) {\n parts.push(` metadata ${style.metadata}`);\n }\n if (style.description !== undefined) {\n parts.push(` description ${style.description}`);\n }\n\n parts.push(\" }\");\n\n return parts.join(\"\\n\");\n }\n\n /**\n * Generate style block for a relationship tag\n */\n private generateRelationshipStyle(tag: string, style: RelationshipStyle): string {\n const parts: string[] = [];\n\n parts.push(` relationship \"${tag}\" {`);\n\n if (style.thickness) {\n parts.push(` thickness ${style.thickness}`);\n }\n if (style.color) {\n parts.push(` color ${style.color}`);\n }\n if (style.style) {\n parts.push(` style ${style.style}`);\n }\n if (style.routing) {\n parts.push(` routing ${style.routing}`);\n }\n if (style.fontSize) {\n parts.push(` fontSize ${style.fontSize}`);\n }\n if (style.width) {\n parts.push(` width ${style.width}`);\n }\n if (style.position) {\n parts.push(` position ${style.position}`);\n }\n if (style.opacity !== undefined) {\n parts.push(` opacity ${style.opacity}`);\n }\n\n parts.push(\" }\");\n\n return parts.join(\"\\n\");\n }\n\n /**\n * Get technology label for context\n */\n private getContextTechnology(contextType: string): string {\n const technologies: Record<string, string> = {\n background: \"Service Worker / Background Script\",\n content: \"Content Script\",\n popup: \"Browser Action Popup\",\n devtools: \"DevTools Panel\",\n options: \"Options Page\",\n offscreen: \"Offscreen Document\",\n };\n\n return technologies[contextType] || \"Extension Context\";\n }\n\n /**\n * Convert message type to component name\n */\n private toComponentName(messageType: string): string {\n return `${messageType\n .split(\"_\")\n .map((part) => this.capitalize(part.toLowerCase()))\n .join(\" \")} Handler`;\n }\n\n /**\n * Convert name to identifier\n */\n private toId(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_|_$/g, \"\");\n }\n\n /**\n * Capitalize first letter\n */\n private capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n /**\n * Escape string for DSL\n */\n /**\n * Generate a single component definition\n */\n private generateComponentDefinition(\n comp: {\n id: string;\n name: string;\n description: string;\n tags: string[];\n properties: ComponentProperties;\n },\n indent: string\n ): string {\n const parts: string[] = [];\n\n parts.push(\n `${indent}${comp.id} = component \"${comp.name}\" \"${this.escape(comp.description)}\" {`\n );\n\n if (comp.tags.length > 0) {\n parts.push(`${indent} tags \"${comp.tags.join('\" \"')}\"`);\n }\n\n if (comp.properties && Object.keys(comp.properties).length > 0) {\n parts.push(`${indent} properties {`);\n for (const [key, value] of Object.entries(comp.properties)) {\n if (value) {\n parts.push(`${indent} \"${key}\" \"${this.escape(value)}\"`);\n }\n }\n parts.push(`${indent} }`);\n }\n\n // Add perspectives if configured for this component\n if (this.options.perspectives?.[comp.id]) {\n const perspectives = this.options.perspectives[comp.id];\n parts.push(`${indent} perspectives {`);\n for (const perspective of perspectives) {\n parts.push(\n `${indent} \"${this.escape(perspective.name)}\" \"${this.escape(perspective.description)}\"`\n );\n }\n parts.push(`${indent} }`);\n }\n\n parts.push(`${indent}}`);\n\n return parts.join(\"\\n\");\n }\n\n /**\n * Automatically generate groups based on message type patterns\n */\n private generateAutomaticGroups(\n componentDefs: Array<{\n id: string;\n name: string;\n description: string;\n tags: string[];\n properties: ComponentProperties;\n messageType: string;\n }>\n ): ComponentGroup[] {\n const groups: ComponentGroup[] = [];\n const assigned = new Set<string>();\n\n this.addAuthenticationGroup(componentDefs, groups, assigned);\n this.addSubscriptionGroup(componentDefs, groups, assigned);\n this.addEntityBasedGroups(componentDefs, groups, assigned);\n this.addQueryCommandGroups(componentDefs, groups, assigned);\n\n return this.shouldReturnGroups(groups, assigned.size, componentDefs.length) ? groups : [];\n }\n\n /**\n * Add authentication handlers group\n */\n private addAuthenticationGroup(\n componentDefs: Array<{ id: string; messageType: string }>,\n groups: ComponentGroup[],\n assigned: Set<string>\n ): void {\n const authHandlers = componentDefs.filter((comp) => {\n const type = comp.messageType.toLowerCase();\n return (\n type.includes(\"login\") ||\n type.includes(\"logout\") ||\n type.includes(\"auth\") ||\n type.includes(\"verify\") ||\n type.includes(\"register\") ||\n type.includes(\"signup\")\n );\n });\n\n if (authHandlers.length > 0) {\n groups.push({\n name: \"Authentication\",\n components: authHandlers.map((c) => c.id),\n });\n for (const h of authHandlers) {\n assigned.add(h.id);\n }\n }\n }\n\n /**\n * Add subscription handlers group\n */\n private addSubscriptionGroup(\n componentDefs: Array<{ id: string; messageType: string }>,\n groups: ComponentGroup[],\n assigned: Set<string>\n ): void {\n const subscriptionHandlers = componentDefs.filter((comp) => {\n const type = comp.messageType.toLowerCase();\n return type.includes(\"subscribe\") || type.includes(\"unsubscribe\");\n });\n\n if (subscriptionHandlers.length > 0) {\n groups.push({\n name: \"Subscriptions\",\n components: subscriptionHandlers.map((c) => c.id),\n });\n for (const h of subscriptionHandlers) {\n assigned.add(h.id);\n }\n }\n }\n\n /**\n * Add entity-based groups\n */\n private addEntityBasedGroups(\n componentDefs: Array<{ id: string; messageType: string }>,\n groups: ComponentGroup[],\n assigned: Set<string>\n ): void {\n const entityGroups = this.collectEntityGroups(componentDefs, assigned);\n this.addValidEntityGroups(entityGroups, groups, assigned);\n }\n\n /**\n * Collect components into entity groups\n */\n private collectEntityGroups(\n componentDefs: Array<{ id: string; messageType: string }>,\n assigned: Set<string>\n ): Map<string, string[]> {\n const entityGroups = new Map<string, string[]>();\n\n for (const comp of componentDefs) {\n if (assigned.has(comp.id)) continue;\n\n const type = comp.messageType.toLowerCase();\n\n // Skip WebSocket lifecycle handlers\n if (type === \"connection\" || type === \"message\" || type === \"close\" || type === \"error\") {\n continue;\n }\n\n const entity = this.extractEntityName(type);\n\n if (entity) {\n if (!entityGroups.has(entity)) {\n entityGroups.set(entity, []);\n }\n entityGroups.get(entity)?.push(comp.id);\n assigned.add(comp.id);\n }\n }\n\n return entityGroups;\n }\n\n /**\n * Add valid entity groups (with at least 2 components)\n */\n private addValidEntityGroups(\n entityGroups: Map<string, string[]>,\n groups: ComponentGroup[],\n assigned: Set<string>\n ): void {\n for (const [entity, componentIds] of entityGroups) {\n if (componentIds.length >= 2) {\n const entityName = entity.charAt(0).toUpperCase() + entity.slice(1);\n groups.push({\n name: `${entityName} Management`,\n components: componentIds,\n });\n } else {\n // Remove from assigned if not enough for a group\n for (const id of componentIds) {\n assigned.delete(id);\n }\n }\n }\n }\n\n /**\n * Extract entity name from message type\n */\n private extractEntityName(type: string): string | null {\n // Pattern 1: entity_action (e.g., \"user_add\", \"todo_remove\")\n const underscoreMatch = type.match(\n /^([a-z]+)_(add|create|update|delete|remove|get|fetch|load|list|query)/\n );\n if (underscoreMatch) {\n return underscoreMatch[1] ?? null;\n }\n\n // Pattern 2: actionEntity (e.g., \"addUser\", \"removeTask\")\n const camelMatch = type.match(\n /(add|create|update|delete|remove|get|fetch|load|list|query)([a-z]+)/i\n );\n if (camelMatch) {\n return camelMatch[2]?.toLowerCase() ?? null;\n }\n\n // Pattern 3: plain entity name (e.g., \"user\", \"todo\")\n if (type.match(/^[a-z]+$/)) {\n return type;\n }\n\n return null;\n }\n\n /**\n * Add query and command handler groups\n */\n private addQueryCommandGroups(\n componentDefs: Array<{ id: string; messageType: string }>,\n groups: ComponentGroup[],\n assigned: Set<string>\n ): void {\n const queryHandlers = componentDefs.filter((comp) => {\n if (assigned.has(comp.id)) return false;\n const type = comp.messageType.toLowerCase();\n return (\n type.includes(\"query\") ||\n type.includes(\"get\") ||\n type.includes(\"fetch\") ||\n type.includes(\"load\") ||\n type.includes(\"list\") ||\n type.includes(\"read\")\n );\n });\n\n const commandHandlers = componentDefs.filter((comp) => {\n if (assigned.has(comp.id)) return false;\n const type = comp.messageType.toLowerCase();\n return (\n type.includes(\"command\") ||\n type.includes(\"add\") ||\n type.includes(\"create\") ||\n type.includes(\"update\") ||\n type.includes(\"delete\") ||\n type.includes(\"remove\") ||\n type.includes(\"set\") ||\n type.includes(\"clear\")\n );\n });\n\n if (queryHandlers.length >= 2) {\n groups.push({\n name: \"Query Handlers\",\n components: queryHandlers.map((c) => c.id),\n });\n for (const h of queryHandlers) {\n assigned.add(h.id);\n }\n }\n\n if (commandHandlers.length >= 2) {\n groups.push({\n name: \"Command Handlers\",\n components: commandHandlers.map((c) => c.id),\n });\n for (const h of commandHandlers) {\n assigned.add(h.id);\n }\n }\n }\n\n /**\n * Determine if groups should be returned based on coverage\n */\n private shouldReturnGroups(\n groups: ComponentGroup[],\n groupedCount: number,\n totalCount: number\n ): boolean {\n // Return groups if at least 50% are grouped OR we have at least 2 groups\n return groupedCount >= totalCount * 0.5 || groups.length >= 2;\n }\n\n /**\n * Generate components organized into groups\n */\n private generateGroupedComponents(\n componentDefs: Array<{\n id: string;\n name: string;\n description: string;\n tags: string[];\n properties: ComponentProperties;\n messageType: string;\n }>,\n groups: ComponentGroup[]\n ): string[] {\n const parts: string[] = [];\n const assignedComponents = new Set<string>();\n\n for (const group of groups) {\n const groupComponents = componentDefs.filter((comp) => group.components.includes(comp.id));\n\n if (groupComponents.length === 0) continue;\n\n parts.push(` group \"${this.escape(group.name)}\" {`);\n\n for (const comp of groupComponents) {\n parts.push(this.generateComponentDefinition(comp, \" \"));\n assignedComponents.add(comp.id);\n }\n\n parts.push(\" }\");\n parts.push(\"\");\n }\n\n // Add ungrouped components\n const ungroupedComponents = componentDefs.filter((comp) => !assignedComponents.has(comp.id));\n\n for (const comp of ungroupedComponents) {\n parts.push(this.generateComponentDefinition(comp, \" \"));\n }\n\n return parts;\n }\n\n private escape(str: string): string {\n return str.replace(/\"/g, '\\\\\"');\n }\n}\n\n/**\n * Generate Structurizr DSL from architecture analysis\n */\nexport function generateStructurizrDSL(\n analysis: ArchitectureAnalysis,\n options?: StructurizrDSLOptions\n): string {\n const generator = new StructurizrDSLGenerator(analysis, options);\n return generator.generate();\n}\n",
|
|
18
|
-
"#!/usr/bin/env bun\n// CLI for Polly teaching system\n\nimport { analyzeArchitecture } from \"../../analysis/src/index.ts\";\nimport type { ContextInfo, MessageFlow } from \"../../analysis/src/types/architecture.ts\";\nimport { generateStructurizrDSL } from \"../../visualize/src/codegen/structurizr.ts\";\n\nasync function main() {\n const cwd = process.cwd();\n\n console.log(\"Analyzing Polly project...\");\n console.log();\n\n try {\n // Run architecture analysis\n const analysis = await analyzeArchitecture({\n projectRoot: cwd,\n tsConfigPath: `${cwd}/tsconfig.json`,\n });\n\n // Generate visualization\n const dsl = await generateStructurizrDSL(analysis);\n\n // Format and present teaching material\n const contexts = Object.entries(analysis.contexts);\n const allHandlers = contexts.flatMap(([_, ctx]: [string, ContextInfo]) => ctx.handlers || []);\n const messageFlows = analysis.messageFlows || [];\n\n console.log(\n `\n# Polly Project Analysis\n\n## Architecture\n\nYour project contains ${contexts.length} context(s) and ${allHandlers.length} message handler(s).\n\n### Contexts\n\n${contexts\n .map(([name, ctx]: [string, ContextInfo]) => {\n return `\n**${name}**\nLocation: ${ctx.entryPoint}\nHandlers: ${ctx.handlers?.length || 0}\nState variables: ${Object.keys(ctx.state?.variables || {}).length}`;\n })\n .join(\"\\n\")}\n\n### Message Flows\n\n${\n messageFlows.length > 0\n ? messageFlows\n .map((flow: MessageFlow) => {\n return `- ${flow.from} → ${flow.to}: ${flow.messageType}`;\n })\n .join(\"\\n\")\n : \"No message flows detected.\"\n}\n\n## Translation Example\n\n${\n allHandlers.length > 0\n ? `\nConsider this handler from your codebase:\n\n\\`\\`\\`typescript\n// ${allHandlers[0].file}:${allHandlers[0].location?.line || \"?\"}\n${allHandlers[0].code || allHandlers[0].name || \"Handler code not available\"}\n\\`\\`\\`\n\nPolly can translate this to TLA+ for formal verification.`\n : \"No handlers detected in your project.\"\n}\n\n## Architecture Diagram\n\n\\`\\`\\`structurizr\n${dsl}\n\\`\\`\\`\n\n---\n\nWhat would you like to understand?\n\nPossible topics:\n- Architecture analysis methodology\n- Specific context or handler\n- TypeScript to TLA+ translation rules\n- Verification properties and their meaning\n- Interpreting verification results\n- TLA+ specification structure\n `.trim()\n );\n\n console.log(\"\\n\\nPrompt: \");\n } catch (error) {\n console.log(`\\n❌ Failed to analyze project: ${error}`);\n process.exit(1);\n }\n}\n\nmain();\n"
|
|
18
|
+
"#!/usr/bin/env bun\n// CLI for Polly teaching system\n\nimport { analyzeArchitecture } from \"../../analysis/src/index.ts\";\nimport type {\n ArchitectureAnalysis,\n ContextInfo,\n MessageFlow,\n} from \"../../analysis/src/types/architecture.ts\";\nimport { generateStructurizrDSL } from \"../../visualize/src/codegen/structurizr.ts\";\n\nasync function main() {\n const cwd = process.cwd();\n\n console.log(\"Analyzing Polly project...\");\n console.log();\n\n try {\n // Run architecture analysis\n const analysis = await analyzeArchitecture({\n projectRoot: cwd,\n tsConfigPath: `${cwd}/tsconfig.json`,\n });\n\n // Generate visualization\n const dsl = await generateStructurizrDSL(analysis);\n\n // Format and present teaching material\n const contexts = Object.entries(analysis.contexts);\n const allHandlers = contexts.flatMap(([_, ctx]: [string, ContextInfo]) => ctx.handlers || []);\n const messageFlows = analysis.messageFlows || [];\n\n console.log(\n `\n# Polly Project Analysis\n\n## Architecture\n\nYour project contains ${contexts.length} context(s) and ${allHandlers.length} message handler(s).\n\n### Contexts\n\n${contexts\n .map(([name, ctx]: [string, ContextInfo]) => {\n return `\n**${name}**\nLocation: ${ctx.entryPoint}\nHandlers: ${ctx.handlers?.length || 0}\nState variables: ${Object.keys(ctx.state?.variables || {}).length}`;\n })\n .join(\"\\n\")}\n\n### Message Flows\n\n${\n messageFlows.length > 0\n ? messageFlows\n .map((flow: MessageFlow) => {\n return `- ${flow.from} → ${flow.to}: ${flow.messageType}`;\n })\n .join(\"\\n\")\n : \"No message flows detected.\"\n}\n\n## Translation Example\n\n${\n allHandlers.length > 0\n ? `\nConsider this handler from your codebase:\n\n\\`\\`\\`typescript\n// ${allHandlers[0].file}:${allHandlers[0].location?.line || \"?\"}\n${allHandlers[0].code || allHandlers[0].name || \"Handler code not available\"}\n\\`\\`\\`\n\nPolly can translate this to TLA+ for formal verification.`\n : \"No handlers detected in your project.\"\n}\n\n## Architecture Diagram\n\n\\`\\`\\`structurizr\n${dsl}\n\\`\\`\\`\n\n---\n\nWhat would you like to understand?\n\nPossible topics:\n- Architecture analysis methodology\n- Specific context or handler\n- TypeScript to TLA+ translation rules\n- Verification properties and their meaning\n- Interpreting verification results\n- TLA+ specification structure\n `.trim()\n );\n\n // Start interactive REPL\n await startREPL(analysis, dsl);\n } catch (error) {\n console.log(`\\n❌ Failed to analyze project: ${error}`);\n process.exit(1);\n }\n}\n\nasync function startREPL(analysis: ArchitectureAnalysis, dsl: string) {\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: \"\\n\\nPrompt: \",\n });\n\n const contexts = Object.entries(analysis.contexts);\n const allHandlers = contexts.flatMap(([_, ctx]: [string, ContextInfo]) => ctx.handlers || []);\n const messageFlows = analysis.messageFlows || [];\n\n rl.prompt();\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: REPL command handler needs to handle many query types\n rl.on(\"line\", (input: string) => {\n const query = input.trim().toLowerCase();\n\n if (!query || query === \"exit\" || query === \"quit\") {\n console.log(\"\\nGoodbye!\");\n rl.close();\n process.exit(0);\n }\n\n // Handle different query types\n if (query.includes(\"architecture\") || query.includes(\"methodology\")) {\n console.log(\n `\nArchitecture Analysis Methodology\n================================\n\nPolly analyzes your codebase by:\n\n1. **Context Discovery**: Identifies all execution contexts (background, popup, content scripts, etc.)\n - Scans for \\`createBackgroundContext()\\`, \\`createUIContext()\\`, etc.\n - Each context has its own message handlers and state\n\n2. **Handler Detection**: Finds message handlers in each context\n - Looks for \\`onMessage()\\` calls\n - Extracts handler logic and dependencies\n\n3. **State Analysis**: Tracks reactive state variables\n - Identifies Preact signals and computed values\n - Maps state dependencies between handlers\n\n4. **Message Flow Mapping**: Traces messages between contexts\n - Detects \\`sendMessage()\\` calls\n - Builds communication graph\n\n5. **Pattern Recognition**: Classifies handlers by pattern\n - Query (read operations)\n - Command (write operations)\n - Authentication, CRUD, etc.\n\nYour project has:\n- ${contexts.length} context(s)\n- ${allHandlers.length} handler(s)\n- ${messageFlows.length} message flow(s)\n `.trim()\n );\n } else if (query.includes(\"context\") || query.includes(\"handler\")) {\n console.log(\n `\nContexts and Handlers in Your Project\n====================================\n\n${contexts\n .map(([name, ctx]: [string, ContextInfo]) => {\n const handlers = ctx.handlers || [];\n return `\n**${name}** Context\n- Location: ${ctx.entryPoint}\n- Handlers: ${handlers.length}\n- State Variables: ${Object.keys(ctx.state?.variables || {}).length}\n\nHandlers:\n${handlers.map((h) => ` - ${h.name} (${h.file}:${h.location?.line || \"?\"})`).join(\"\\n\") || \" None\"}\n`;\n })\n .join(\"\\n\")}\n `.trim()\n );\n } else if (query.includes(\"tla\") || query.includes(\"translation\")) {\n console.log(\n `\nTypeScript to TLA+ Translation\n=============================\n\nPolly can translate your message handlers to TLA+ for formal verification.\n\nTranslation Rules:\n- Message handlers → TLA+ actions\n- State variables → TLA+ variables\n- Async operations → Non-deterministic choices\n- Chrome APIs → Abstract operations\n\nExample from your project:\n${\n allHandlers.length > 0\n ? `\n\\`\\`\\`typescript\n// ${allHandlers[0].file}:${allHandlers[0].location?.line || \"?\"}\n${allHandlers[0].code || allHandlers[0].name || \"Handler code not available\"}\n\\`\\`\\`\n\nThis would translate to a TLA+ action that:\n1. Checks preconditions\n2. Updates state variables\n3. Sends response messages\n`\n : \"No handlers available for translation example\"\n}\n\nUse \\`polly verify\\` to generate and check TLA+ specifications.\n `.trim()\n );\n } else if (query.includes(\"verification\") || query.includes(\"properties\")) {\n console.log(\n `\nVerification Properties\n=====================\n\nPolly verifies these properties of your system:\n\n1. **Safety Properties**\n - No invalid state transitions\n - Type safety maintained\n - No race conditions\n\n2. **Liveness Properties**\n - Messages eventually delivered\n - Handlers eventually respond\n - No deadlocks\n\n3. **Consistency Properties**\n - State synchronized across contexts\n - No conflicting updates\n\nTo verify your project:\n\\`\\`\\`bash\npolly verify --setup # First time setup\npolly verify # Run verification\n\\`\\`\\`\n\nThe verification will check all ${allHandlers.length} handlers in your project.\n `.trim()\n );\n } else if (query.includes(\"result\") || query.includes(\"interpret\")) {\n console.log(\n `\nInterpreting Verification Results\n================================\n\nTLC (TLA+ model checker) output:\n\n✅ **Success**: \"Model checking completed. No error has been found.\"\n - Your system is correct for the checked scenarios\n - All properties hold\n\n❌ **Error Found**: Shows a counterexample trace\n - Step-by-step execution leading to violation\n - Variable states at each step\n - Helps identify the bug\n\n⚠️ **Deadlock**: System can reach a state with no enabled actions\n - Usually indicates missing handlers or blocked operations\n\n📊 **Statistics**:\n - States explored: How many system states checked\n - Distinct states: Unique states found\n - Depth: Longest execution sequence\n\nUse the trace to understand and fix issues.\n `.trim()\n );\n } else if (query.includes(\"specification\") || query.includes(\"structure\")) {\n console.log(\n `\nTLA+ Specification Structure\n===========================\n\nA Polly-generated TLA+ spec contains:\n\n1. **MODULE Header**: Declares the module name\n\n2. **EXTENDS**: Imports standard TLA+ modules (Naturals, Sequences, etc.)\n\n3. **VARIABLES**: Declares state variables\n - One per reactive signal in your code\n - Message queues between contexts\n\n4. **Init**: Initial state\n - Sets starting values for all variables\n\n5. **Actions**: One per message handler\n - Preconditions (when handler can run)\n - State updates (effect of handler)\n\n6. **Next**: Defines all possible transitions\n - Disjunction of all actions\n - Represents any single step\n\n7. **Spec**: The complete specification\n - Init ∧ [][Next]_vars\n - Means: start in Init, then repeatedly apply Next\n\nYour ${allHandlers.length} handlers become ${allHandlers.length} TLA+ actions.\n `.trim()\n );\n } else if (query.includes(\"diagram\") || query.includes(\"visual\")) {\n console.log(\n `\nArchitecture Diagram\n==================\n\nYour architecture in Structurizr DSL format:\n\n\\`\\`\\`structurizr\n${dsl}\n\\`\\`\\`\n\nTo visualize this:\n1. Visit https://structurizr.com/dsl\n2. Paste the DSL code above\n3. Explore the interactive diagram\n\nOr use the CLI:\n\\`\\`\\`bash\npolly visualize --serve # Opens browser with diagram\n\\`\\`\\`\n `.trim()\n );\n } else if (query.includes(\"help\") || query === \"?\") {\n console.log(\n `\nAvailable Topics\n===============\n\nAsk about:\n- \"architecture\" or \"methodology\" - How Polly analyzes your code\n- \"context\" or \"handler\" - Details about your contexts and handlers\n- \"tla\" or \"translation\" - How TypeScript becomes TLA+\n- \"verification\" or \"properties\" - What properties are verified\n- \"results\" or \"interpret\" - Understanding verification output\n- \"specification\" or \"structure\" - TLA+ spec structure\n- \"diagram\" or \"visual\" - Architecture visualization\n\nCommands:\n- \"help\" or \"?\" - Show this help\n- \"exit\" or \"quit\" - Exit the teach mode\n- Just press Enter - Exit\n `.trim()\n );\n } else {\n console.log(\n `\nI can help explain:\n- Architecture analysis methodology\n- Your specific contexts and handlers\n- TypeScript to TLA+ translation rules\n- Verification properties and their meaning\n- Interpreting verification results\n- TLA+ specification structure\n- Architecture diagrams\n\nType \"help\" to see all available topics, or ask a question!\n `.trim()\n );\n }\n\n rl.prompt();\n });\n\n rl.on(\"close\", () => {\n console.log(\"\\nGoodbye!\");\n process.exit(0);\n });\n}\n\nmain();\n"
|
|
19
19
|
],
|
|
20
|
-
"mappings": "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",
|
|
21
|
-
"debugId": "
|
|
20
|
+
"mappings": "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",
|
|
21
|
+
"debugId": "B574D6064EE5456E64756E2164756E21",
|
|
22
22
|
"names": []
|
|
23
23
|
}
|