{"version":3,"sources":["../../src/adapters/win-adapter.ts"],"names":[],"mappings":"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","file":"win-adapter.mjs","sourcesContent":["/**\n * Windows adapter implementation\n * Handles Windows-specific file operations and path finding\n */\n\nimport {execSync} from 'child_process';\nimport * as fs from 'fs';\nimport * as pathModule from 'path';\nimport {join} from 'path';\n\nimport {PathInfo, PathMetadata, PathSource} from '../types';\nimport {BaseOSAdapter} from './base-adapter';\n\n/**\n * Windows-specific adapter for finding iCloud paths\n */\nexport class WindowsAdapter extends BaseOSAdapter {\n  /**\n   * Find iCloud paths on Windows\n   *\n   * @returns Promise resolving to array of path info objects\n   */\n  async findPaths(): Promise<PathInfo[]> {\n    try {\n      // First try to find paths in common locations\n      await this._findInCommonLocations();\n\n      // Then try registry\n      await this._findInRegistry();\n\n      // Then discover app storage paths in found root directories\n      await this._discoverAppStoragePaths();\n\n      // Add any found paths to the map\n      const paths = Array.from(this.pathMap.values())\n        .sort((a, b) => b.score - a.score)\n        .filter(info => info.score > 0);\n\n      // If no paths found, try to use the default path\n      if (paths.length === 0) {\n        const userProfile = process.env.USERPROFILE;\n        if (userProfile) {\n          const defaultPath = join(userProfile, 'iCloudDrive');\n          this._addPath(defaultPath, {source: 'default'});\n          return Array.from(this.pathMap.values());\n        }\n      }\n\n      return paths;\n    } catch (error: any) {\n      console.debug('Error finding paths:', error);\n      return [];\n    }\n  }\n\n  /**\n   * Find iCloud paths in common file system locations\n   */\n  private async _findInCommonLocations(): Promise<void> {\n    const userProfile = process.env.USERPROFILE;\n    if (!userProfile) {\n      console.debug('USERPROFILE environment variable not found');\n      return;\n    }\n\n    // Common locations to check\n    const pathsToCheck = [\n      // User profile locations\n      join(userProfile, 'iCloudDrive'),\n      join(userProfile, 'iCloud Drive'),\n      join(userProfile, 'iCloud'),\n\n      // Root locations\n      'C:\\\\iCloudDrive',\n      'C:\\\\iCloud Drive',\n      'C:\\\\iCloud\\\\iCloudDrive',\n\n      // Other common locations\n      ...this._getAvailableDrives().flatMap(drive => [\n        `${drive}\\\\iCloudDrive`,\n        `${drive}\\\\iCloud Drive`,\n        `${drive}\\\\iCloud\\\\iCloudDrive`,\n      ]),\n    ];\n\n    for (const path of pathsToCheck) {\n      const normalizedPath = pathModule.normalize(path);\n      if (await this._isValidICloudPath(normalizedPath)) {\n        this._addPath(normalizedPath, {source: 'commonPath'});\n      }\n    }\n  }\n\n  /**\n   * Check if a path is a valid iCloud directory\n   */\n  private async _isValidICloudPath(path: string): Promise<boolean> {\n    try {\n      if (!fs.existsSync(path)) return false;\n\n      const stats = fs.statSync(path);\n      if (!stats.isDirectory()) return false;\n\n      const contents = fs.readdirSync(path);\n\n      // Consider a directory valid if it:\n      // 1. Has iCloud markers\n      // 2. Has common iCloud directories\n      // 3. Has app storage paths\n      const hasICloudMarkers = contents.some(item => item === '.icloud' || item === 'desktop.ini');\n\n      const hasCommonDirs = contents.some(item => item === 'Documents' || item === 'Photos');\n\n      const hasAppStorage = contents.some(item => this.isAppStoragePath(item));\n\n      return hasICloudMarkers || hasCommonDirs || hasAppStorage;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Find iCloud paths in Windows registry\n   */\n  private async _findInRegistry(): Promise<void> {\n    try {\n      const regPaths = [\n        'HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\SyncRootManager',\n        'HKEY_CURRENT_USER\\\\Software\\\\Apple Inc.\\\\iCloud',\n        'HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Apple Inc.\\\\iCloud',\n        'HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\WOW6432Node\\\\Apple Inc.\\\\iCloud',\n      ];\n\n      for (const regPath of regPaths) {\n        try {\n          const output = execSync(`reg query \"${regPath}\" /s`, {\n            encoding: 'utf8',\n            stdio: ['pipe', 'pipe', 'ignore'],\n          }).toString();\n\n          const lines = output.split('\\r\\n');\n          for (const line of lines) {\n            const match = line.trim().match(/REG_\\w+\\s+([A-Z]:\\\\[^\"]+)/i);\n            if (!match) continue;\n\n            const path = pathModule.normalize(match[1]);\n            if (path.toLowerCase().includes('icloud') && fs.existsSync(path)) {\n              this._addPath(path, {source: 'registry', score: 60});\n            }\n          }\n        } catch {\n          // Silently skip if registry key doesn't exist\n        }\n      }\n    } catch (error) {\n      console.debug('Error querying registry:', error);\n    }\n  }\n\n  /**\n   * Discover app-specific storage paths in found iCloud root directories\n   */\n  private async _discoverAppStoragePaths(): Promise<void> {\n    const rootPaths = Array.from(this.pathMap.values())\n      .filter(info => info.exists && info.isAccessible)\n      .map(info => info.path);\n\n    for (const rootPath of rootPaths) {\n      try {\n        const entries = await fs.promises.readdir(rootPath, {withFileTypes: true});\n\n        for (const entry of entries) {\n          if (!entry.isDirectory()) continue;\n\n          const fullPath = pathModule.normalize(pathModule.join(rootPath, entry.name));\n\n          if (this.isAppStoragePath(entry.name)) {\n            const metadata = this._enrichMetadata({}, fullPath, {\n              source: 'appStorage',\n              rootPath: rootPath,\n              score: 70,\n            });\n\n            this._addPath(fullPath, {\n              source: 'appStorage',\n              rootPath: rootPath,\n              score: 70,\n              metadata,\n            });\n          } else if (entry.name === 'Documents' || entry.name === 'Photos') {\n            const metadata = this._enrichMetadata({}, fullPath, {\n              source: 'commonPath',\n              rootPath: rootPath,\n              score: 65,\n            });\n\n            this._addPath(fullPath, {\n              source: 'commonPath',\n              rootPath: rootPath,\n              score: 65,\n              metadata,\n            });\n          }\n        }\n      } catch (error) {\n        console.debug(`Error scanning root path ${rootPath}:`, error);\n      }\n    }\n  }\n\n  /**\n   * Get list of available drives on Windows\n   */\n  private _getAvailableDrives(): string[] {\n    const drives: string[] = [];\n    try {\n      for (let i = 67; i <= 90; i++) {\n        // C to Z\n        const drive = String.fromCharCode(i) + ':';\n        if (fs.existsSync(drive)) {\n          drives.push(drive);\n        }\n      }\n    } catch (error) {\n      console.debug('Error getting available drives:', error);\n    }\n    return drives;\n  }\n\n  /**\n   * Enrich path metadata with Windows-specific information\n   */\n  protected _enrichMetadata(metadata: PathMetadata, path: string, source: PathSource): PathMetadata {\n    const enriched: PathMetadata = {\n      ...metadata,\n      source,\n    };\n\n    const basename = path.split(pathModule.sep).pop() || '';\n\n    // Handle special directories\n    if (basename === 'Documents' || basename === 'Photos') {\n      enriched.type = basename.toLowerCase();\n      enriched.score = source.score || 65;\n      return enriched;\n    }\n\n    // Handle app storage paths\n    if (this.isAppStoragePath(basename)) {\n      const {appId, appName, bundleId, vendor} = this.parseAppName(basename);\n      if (appId || appName || bundleId || vendor) {\n        Object.assign(enriched, {appId, appName, bundleId, vendor});\n        enriched.score = source.score || 70;\n      }\n    }\n\n    return enriched;\n  }\n}\n"]}