{"version":3,"sources":["../../../src/services/file-service.ts"],"names":["path"],"mappings":"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","file":"file-service.cjs","sourcesContent":["import { FileSystemAdapter } from '../utils/file-system-adapter.js';\nimport path from 'path';\nimport { PathnameService } from './pathname-service.js';\n\n/**\n * Centralizes all filesystem operations with atomic guarantees and proper error handling.\n * This service is responsible for:\n * - Atomic file operations\n * - Directory management\n * - File search operations\n * - Temporary file handling\n * - Backup management\n */\nexport class FileService {\n  constructor(\n    private fs: FileSystemAdapter,\n    private pathnameService: PathnameService\n  ) {}\n\n  // Core Operations\n\n  async readFile(filePath: string): Promise<string> {\n    if (!await this.fs.exists(filePath)) {\n      throw new Error(`File not found: ${filePath}`);\n    }\n    return this.fs.readFile(filePath);\n  }\n\n  async writeFile(filePath: string, content: string): Promise<void> {\n    // Use temp file for atomic write\n    return this.withTempFile(filePath, async (tempPath) => {\n      await this.fs.writeFile(tempPath, content);\n    });\n  }\n\n  async moveFile(sourcePath: string, targetPath: string): Promise<void> {\n    // Validate paths\n    if (!await this.fs.exists(sourcePath)) {\n      throw new Error(`Source file not found: ${sourcePath}`);\n    }\n    if (await this.fs.exists(targetPath)) {\n      throw new Error(`Target file already exists: ${targetPath}`);\n    }\n\n    // Ensure target directory exists\n    await this.ensureParentDir(targetPath);\n\n    // Use temp file for atomic move\n    const tempPath = `${targetPath}.tmp`;\n    try {\n      // First copy to temp file\n      await this.fs.move(sourcePath, tempPath);\n      // Then move temp file to target\n      await this.fs.move(tempPath, targetPath);\n    } catch (error) {\n      // Clean up temp file on error\n      try {\n        if (await this.fs.exists(tempPath)) {\n          await this.fs.remove(tempPath);\n        }\n      } catch (cleanupError) {\n        // Ignore cleanup errors\n      }\n      throw error;\n    }\n  }\n\n  async atomicMove(sourcePath: string, targetPath: string, content: string): Promise<void> {\n    // Ensure source file exists\n    if (!await this.fs.exists(sourcePath)) {\n      throw new Error(`File not found: ${sourcePath}`);\n    }\n\n    // Create temp file with new content\n    const tempPath = `${targetPath}.tmp`;\n    try {\n      // Write new content to temp file\n      await this.fs.writeFile(tempPath, content);\n      \n      // Move temp file to target\n      await this.fs.move(tempPath, targetPath);\n      \n      // Remove source file after successful move\n      if (await this.fs.exists(sourcePath)) {\n        await this.fs.remove(sourcePath);\n      }\n    } catch (error) {\n      // Clean up temp file on error\n      try {\n        if (await this.fs.exists(tempPath)) {\n          await this.fs.remove(tempPath);\n        }\n      } catch (cleanupError) {\n        // Ignore cleanup errors\n      }\n      throw error;\n    }\n  }\n\n  // Atomic Operations\n\n  async withTempFile<T>(filePath: string, operation: (tempPath: string) => Promise<T>): Promise<T> {\n    const tempPath = `${filePath}.tmp`;\n    try {\n      const result = await operation(tempPath);\n      if (await this.fs.exists(tempPath)) {\n        await this.fs.move(tempPath, filePath);\n      }\n      return result;\n    } finally {\n      // Always try to cleanup temp file\n      if (await this.fs.exists(tempPath)) {\n        await this.fs.remove(tempPath);\n      }\n    }\n  }\n\n  async withBackup<T>(filePath: string, operation: () => Promise<T>): Promise<T> {\n    const backupPath = `${filePath}.bak`;\n    \n    // Create backup if file exists by copying content\n    if (await this.fs.exists(filePath)) {\n      try {\n        const content = await this.fs.readFile(filePath);\n        await this.fs.writeFile(backupPath, content);\n      } catch (error) {\n        throw new Error('Backup creation failed');\n      }\n    }\n\n    try {\n      // Run the operation\n      const result = await operation();\n      \n      // Remove backup on success\n      if (await this.fs.exists(backupPath)) {\n        try {\n          await this.fs.remove(backupPath);\n        } catch (cleanupError) {\n          // Operation succeeded but cleanup failed\n          // We want to preserve the backup file and throw cleanup error\n          throw new Error('Cleanup failed');\n        }\n      }\n      \n      return result;\n    } catch (error) {\n      const operationError = error as Error;\n      \n      // Don't attempt cleanup if operation failed with cleanup error\n      if (operationError.message === 'Cleanup failed') {\n        throw operationError;\n      }\n      \n      // Restore from backup on error if it exists\n      if (await this.fs.exists(backupPath)) {\n        try {\n          // Read backup content first to ensure we can read it\n          const backupContent = await this.fs.readFile(backupPath);\n          \n          // Remove original file if it exists\n          if (await this.fs.exists(filePath)) {\n            await this.fs.remove(filePath);\n          }\n          \n          // Write backup content back to original file\n          await this.fs.writeFile(filePath, backupContent);\n        } catch (restoreError) {\n          // If restore fails, preserve backup and throw restore error\n          throw new Error('Restore failed');\n        }\n      }\n      \n      // If we get here, either:\n      // 1. There was no backup to restore from\n      // 2. Restore succeeded (but we keep the backup in case cleanup fails)\n      throw operationError;\n    }\n  }\n\n  // Directory Operations\n\n  async ensureDir(dirPath: string): Promise<void> {\n    await this.fs.ensureDir(dirPath);\n  }\n\n  async ensureParentDir(filePath: string): Promise<void> {\n    await this.ensureDir(path.dirname(filePath));\n  }\n\n  // File Search Operations\n\n  async findFile(filename: string, searchPaths: string[]): Promise<string | undefined> {\n    for (const dir of searchPaths) {\n      const filePath = path.join(dir, filename);\n      if (await this.fs.exists(filePath)) {\n        return filePath;\n      }\n    }\n    return undefined;\n  }\n\n  async findFiles(predicate: (filename: string) => boolean, searchPaths: string[]): Promise<string[]> {\n    const results: string[] = [];\n    \n    for (const dir of searchPaths) {\n      if (!await this.fs.exists(dir)) {\n        continue;\n      }\n      \n      const files = await this.fs.readdir(dir);\n      for (const file of files) {\n        if (predicate(file)) {\n          results.push(path.join(dir, file));\n        }\n      }\n    }\n    \n    return results;\n  }\n} "]}