{"version":3,"file":"ExtensionNavigationAdapter-Dptu3FCn.cjs","sources":["../../lib/vowel/platforms/extension/adapters/ExtensionNavigationAdapter.ts"],"sourcesContent":["/**\n * Extension Navigation Adapter\n * \n * Implements NavigationAdapter for extension platform.\n * Handles navigation in extension context by querying and controlling browser tabs.\n * \n * @packageDocumentation\n */\n\nimport type { NavigationAdapter, VowelRoute } from '../../../types';\n\n/**\n * Navigation adapter for extension platform\n * \n * Handles navigation in extension context by:\n * - Querying active tab information\n * - Sending navigation commands to active tab\n * - Extracting routes from page context\n * \n * Note: This adapter maintains cached state since some methods must be synchronous\n * while Chrome APIs are async.\n * \n * @example\n * ```typescript\n * const adapter = new ExtensionNavigationAdapter();\n * await adapter.navigate('/products');\n * const currentPath = adapter.getCurrentPath();\n * ```\n */\nexport class ExtensionNavigationAdapter implements NavigationAdapter {\n  private cachedPath: string = '/';\n\n  constructor() {\n    // Update cached path periodically\n    this.updateCachedPath();\n    setInterval(() => this.updateCachedPath(), 1000);\n  }\n\n  /**\n   * Update cached path from active tab\n   */\n  private async updateCachedPath(): Promise<void> {\n    try {\n      const tab = await this.getActiveTab();\n      if (tab.url) {\n        const url = new URL(tab.url);\n        this.cachedPath = url.pathname + url.search + url.hash;\n      }\n    } catch {\n      // Ignore errors\n    }\n  }\n  /**\n   * Navigate to a path in the active tab\n   * \n   * @param path - Target path or URL\n   * @param context - Optional navigation context\n   */\n  async navigate(path: string, context?: any): Promise<void> {\n    console.log(`🧭 [ExtensionNavigationAdapter] navigate() called with path: ${path}`);\n    \n    const tab = await this.getActiveTab();\n    \n    if (!tab.id) {\n      throw new Error('No active tab found');\n    }\n\n    console.log(`📍 [ExtensionNavigationAdapter] Active tab ID: ${tab.id}, URL: ${tab.url}`);\n\n    // Send navigation command to content script\n    try {\n      console.log(`📤 [ExtensionNavigationAdapter] Sending NAVIGATE message to content script`);\n      const response = await chrome.tabs.sendMessage(tab.id, {\n        type: 'NAVIGATE',\n        payload: { path, context },\n      });\n      console.log(`✅ [ExtensionNavigationAdapter] Navigation message sent successfully, response:`, response);\n    } catch (error) {\n      console.warn('⚠️ [ExtensionNavigationAdapter] Failed to send navigation message to content script:', error);\n      console.log('🔄 [ExtensionNavigationAdapter] Falling back to chrome.tabs.update');\n      \n      // Fallback: Try to navigate the tab directly using chrome.tabs.update\n      try {\n        if (path.startsWith('http://') || path.startsWith('https://')) {\n          console.log(`🔗 [ExtensionNavigationAdapter] Navigating to absolute URL: ${path}`);\n          await chrome.tabs.update(tab.id, { url: path });\n          console.log(`✅ [ExtensionNavigationAdapter] Tab updated successfully`);\n        } else {\n          // Relative path - need current URL\n          const currentUrl = new URL(tab.url || 'http://localhost');\n          currentUrl.pathname = path;\n          const newUrl = currentUrl.toString();\n          console.log(`🔗 [ExtensionNavigationAdapter] Navigating to relative path, full URL: ${newUrl}`);\n          await chrome.tabs.update(tab.id, { url: newUrl });\n          console.log(`✅ [ExtensionNavigationAdapter] Tab updated successfully`);\n        }\n      } catch (updateError) {\n        console.error('❌ [ExtensionNavigationAdapter] Failed to update tab:', updateError);\n        throw updateError;\n      }\n    }\n    \n    // Update cached path\n    await this.updateCachedPath();\n  }\n\n  /**\n   * Get current path (synchronous, returns cached value)\n   * \n   * @returns Current URL path\n   */\n  getCurrentPath(): string {\n    return this.cachedPath;\n  }\n\n  /**\n   * Get available routes from active tab\n   * \n   * @returns Array of available routes\n   */\n  async getRoutes(): Promise<VowelRoute[]> {\n    const tab = await this.getActiveTab();\n    \n    if (!tab.id) {\n      return [];\n    }\n\n    try {\n      // Query content script for routes\n      const response = await chrome.tabs.sendMessage(tab.id, {\n        type: 'GET_ROUTES',\n      });\n      return response.routes || [];\n    } catch (error) {\n      console.warn('Failed to get routes from content script:', error);\n      return [];\n    }\n  }\n\n  /**\n   * Get navigation context from active tab\n   * \n   * @returns Navigation context object\n   */\n  async getContext(): Promise<any> {\n    const tab = await this.getActiveTab();\n    \n    return {\n      url: tab.url,\n      title: tab.title,\n      tabId: tab.id,\n      favIconUrl: tab.favIconUrl,\n    };\n  }\n\n  /**\n   * Get the active browser tab\n   */\n  private async getActiveTab(): Promise<chrome.tabs.Tab> {\n    if (typeof chrome === 'undefined' || !chrome.tabs) {\n      throw new Error('Chrome tabs API not available');\n    }\n\n    const tabs = await chrome.tabs.query({ active: true, currentWindow: true });\n    \n    if (tabs.length === 0) {\n      throw new Error('No active tab found');\n    }\n\n    return tabs[0];\n  }\n}\n\n"],"names":[],"mappings":"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"}