{"version":3,"sources":["../../../src/utils/logger.ts","../../../src/utils/file-system-adapter.ts"],"names":["winston","chalk","path","fs","createReadStream","createWriteStream"],"mappings":"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","file":"file-system-adapter.cjs","sourcesContent":["import winston from 'winston';\nimport chalk from 'chalk';\nimport { IssueError, FileNotFoundError, InvalidFilenameError, InvalidTargetError, FileExistsError, handleError } from '../errors/errors.js';\n\n// Define our custom logger interface\nexport interface CustomLogger extends winston.Logger {\n  success(message: any, ...meta: any[]): winston.Logger;\n  debug(message: any, ...meta: any[]): winston.Logger;\n}\n\nconst { format, createLogger, transports } = winston;\nconst { combine, timestamp, printf } = format;\n\n// Custom format for different log levels\nconst customFormat = printf((info: winston.Logform.TransformableInfo) => {\n  const ts = new Date(info.timestamp?.toString() || Date.now()).toLocaleTimeString();\n  \n  switch (info.level) {\n    case 'error':\n      return `${chalk.gray(ts)} ${chalk.red('✖')} ${chalk.red(info.message)}`;\n    case 'warn':\n      return `${chalk.gray(ts)} ${chalk.yellow('⚠')} ${chalk.yellow(info.message)}`;\n    case 'info':\n      return `${chalk.gray(ts)} ${chalk.blue('ℹ')} ${info.message}`;\n    case 'debug':\n      return `${chalk.gray(ts)} ${chalk.gray('🔍')} ${chalk.gray(info.message)}`;\n    case 'success':\n      return `${chalk.gray(ts)} ${chalk.green('✔')} ${chalk.green(info.message)}`;\n    default:\n      return `${chalk.gray(ts)} ${info.message}`;\n  }\n});\n\n// Create custom success level\nconst customLevels = {\n  levels: {\n    error: 0,\n    warn: 1,\n    info: 2,\n    debug: 3,\n    success: 4\n  },\n  colors: {\n    error: 'red',\n    warn: 'yellow',\n    info: 'blue',\n    debug: 'gray',\n    success: 'green'\n  }\n};\n\n// Create a filter to completely silence debug messages unless explicitly enabled\nconst silenceDebug = format((info) => {\n  if (info.level === 'debug' && !process.env.DEBUG_ENABLED) {\n    return false;\n  }\n  return info;\n});\n\n// Create the logger with silent debug by default\nconst baseLogger = createLogger({\n  levels: customLevels.levels,\n  format: combine(\n    silenceDebug(),\n    timestamp(),\n    customFormat\n  ),\n  transports: [\n    new transports.Console({\n      level: 'info'\n    })\n  ]\n});\n\n// Add success method to match our interface\n(baseLogger as any).success = baseLogger.info;\n\nexport const logger = baseLogger as CustomLogger;\n\n// Add colors to winston\nwinston.addColors(customLevels.colors);\n\n// Function to configure logger based on debug flag\nexport function configureLogger(debug: boolean = false) {\n  process.env.DEBUG_ENABLED = debug ? 'true' : '';\n  const level = debug ? 'debug' : 'info';\n  logger.transports.forEach(transport => {\n    if (transport instanceof winston.transports.Console) {\n      transport.level = level;\n    }\n  });\n}\n\n// Re-export error types for convenience\nexport { IssueError, FileNotFoundError, InvalidFilenameError, InvalidTargetError, FileExistsError, handleError }; ","import { createReadStream, createWriteStream } from 'fs';\nimport { promises as fs } from 'fs';\nimport path from 'path';\nimport { PathnameService } from '../services/pathname-service.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface FileSystemAdapter {\n  readFile(path: string): Promise<string>;\n  writeFile(path: string, data: string): Promise<void>;\n  exists(path: string): Promise<boolean>;\n  pathExists(path: string): Promise<boolean>;\n  ensureDir(path: string): Promise<void>;\n  readdir(path: string): Promise<string[]>;\n  move(src: string, dest: string): Promise<void>;\n  remove(path: string): Promise<void>;\n  createReadStream(path: string): NodeJS.ReadableStream;\n  createWriteStream(path: string): NodeJS.WritableStream;\n  stat(path: string): Promise<{ isDirectory(): boolean }>;\n  rename(oldPath: string, newPath: string): Promise<void>;\n  mkdtemp(prefix: string): Promise<string>;\n  rm(path: string, options: { recursive?: boolean; force?: boolean }): Promise<void>;\n}\n\n// Real filesystem implementation\nexport const realFileSystemAdapter: FileSystemAdapter = {\n  async readFile(path: string): Promise<string> {\n    return fs.readFile(path, 'utf8');\n  },\n\n  async writeFile(path: string, data: string): Promise<void> {\n    return fs.writeFile(path, data, 'utf8');\n  },\n\n  async exists(path: string): Promise<boolean> {\n    try {\n      await fs.access(path);\n      return true;\n    } catch {\n      return false;\n    }\n  },\n\n  async pathExists(path: string): Promise<boolean> {\n    return this.exists(path);\n  },\n\n  async ensureDir(path: string): Promise<void> {\n    await fs.mkdir(path, { recursive: true });\n  },\n\n  async readdir(path: string): Promise<string[]> {\n    return fs.readdir(path);\n  },\n\n  async move(src: string, dest: string): Promise<void> {\n    await fs.rename(src, dest);\n  },\n\n  async remove(path: string): Promise<void> {\n    await fs.unlink(path);\n  },\n\n  createReadStream(path: string): NodeJS.ReadableStream {\n    return createReadStream(path);\n  },\n\n  createWriteStream(path: string): NodeJS.WritableStream {\n    return createWriteStream(path);\n  },\n\n  async stat(path: string): Promise<{ isDirectory(): boolean }> {\n    const stats = await fs.stat(path);\n    return {\n      isDirectory: () => stats.isDirectory()\n    };\n  },\n\n  async rename(oldPath: string, newPath: string): Promise<void> {\n    await fs.rename(oldPath, newPath);\n  },\n\n  async mkdtemp(prefix: string): Promise<string> {\n    return fs.mkdtemp(path.join(prefix, ''));\n  },\n\n  async rm(path: string, options: { recursive?: boolean; force?: boolean }): Promise<void> {\n    await fs.rm(path, options);\n  }\n};\n\n/**\n * Wraps a FileSystemAdapter to handle path resolution relative to a root directory.\n * This ensures all paths passed to the underlying adapter are properly prefixed with the root directory.\n */\nexport class RootedFileSystemAdapter implements FileSystemAdapter {\n  constructor(\n    private fs: FileSystemAdapter,\n    private rootDir: string,\n    private pathnameService?: PathnameService\n  ) {\n    // Ensure rootDir is absolute and normalized\n    this.rootDir = path.resolve(rootDir);\n    logger.debug('RootedFileSystemAdapter initialized with rootDir:', this.rootDir);\n  }\n\n  private resolvePath(filePath: string): string {\n    // If pathname service is available, use it to canonicalize the path\n    if (this.pathnameService) {\n      filePath = this.pathnameService.toCanonicalPath(filePath);\n    }\n\n    // Normalize the input path\n    const normalizedPath = path.normalize(filePath);\n    \n    // If it's already absolute\n    if (path.isAbsolute(normalizedPath)) {\n      // If it's already under our root dir, return it as is\n      if (normalizedPath.startsWith(this.rootDir)) {\n        return normalizedPath;\n      }\n      \n      // For any other absolute path, get just the relative portion\n      const projectRoot = path.resolve(process.cwd());\n      let relativePath;\n      \n      if (normalizedPath.startsWith(projectRoot)) {\n        // Get path relative to project root\n        relativePath = path.relative(projectRoot, normalizedPath);\n      } else {\n        // For paths outside project root, use the path relative to root directory\n        relativePath = path.relative('/', normalizedPath);\n      }\n      \n      // Remove any leading directory components that match our root dir structure\n      const rootParts = this.rootDir.split(path.sep).filter(Boolean);\n      const pathParts = relativePath.split(path.sep).filter(Boolean);\n      \n      // Find where the paths diverge\n      let i = 0;\n      while (i < rootParts.length && i < pathParts.length && rootParts[i] === pathParts[i]) {\n        i++;\n      }\n      \n      // Use only the unique part of the path\n      const uniquePath = pathParts.slice(i).join(path.sep);\n      \n      return path.join(this.rootDir, uniquePath);\n    }\n    \n    // For relative paths, just join with root\n    return path.join(this.rootDir, normalizedPath);\n  }\n\n  async readFile(filePath: string): Promise<string> {\n    return this.fs.readFile(this.resolvePath(filePath));\n  }\n\n  async writeFile(filePath: string, content: string): Promise<void> {\n    return this.fs.writeFile(this.resolvePath(filePath), content);\n  }\n\n  async exists(filePath: string): Promise<boolean> {\n    return this.fs.exists(this.resolvePath(filePath));\n  }\n\n  async pathExists(filePath: string): Promise<boolean> {\n    return this.fs.pathExists(this.resolvePath(filePath));\n  }\n\n  async ensureDir(dirPath: string): Promise<void> {\n    return this.fs.ensureDir(this.resolvePath(dirPath));\n  }\n\n  async readdir(dirPath: string): Promise<string[]> {\n    return this.fs.readdir(this.resolvePath(dirPath));\n  }\n\n  async move(src: string, dest: string): Promise<void> {\n    return this.fs.move(this.resolvePath(src), this.resolvePath(dest));\n  }\n\n  async remove(filePath: string): Promise<void> {\n    return this.fs.remove(this.resolvePath(filePath));\n  }\n\n  createReadStream(filePath: string): NodeJS.ReadableStream {\n    return this.fs.createReadStream(this.resolvePath(filePath));\n  }\n\n  createWriteStream(filePath: string): NodeJS.WritableStream {\n    return this.fs.createWriteStream(this.resolvePath(filePath));\n  }\n\n  async stat(filePath: string): Promise<{ isDirectory(): boolean }> {\n    return this.fs.stat(this.resolvePath(filePath));\n  }\n\n  async rename(oldPath: string, newPath: string): Promise<void> {\n    return this.fs.rename(this.resolvePath(oldPath), this.resolvePath(newPath));\n  }\n\n  async mkdtemp(prefix: string): Promise<string> {\n    return this.fs.mkdtemp(this.resolvePath(prefix));\n  }\n\n  async rm(path: string, options: { recursive?: boolean; force?: boolean }): Promise<void> {\n    return this.fs.rm(this.resolvePath(path), options);\n  }\n} "]}