{"version":3,"sources":["../src/index.ts","../src/types/FileSystemEvents.ts","../src/utils/paths.ts","../src/utils/EventEmitter.ts","../src/mixins/withEvents.ts","../src/base/BaseFileSystem.ts"],"sourcesContent":["// Core interfaces\nexport * from \"./interfaces/IFileSystem\";\nexport * from \"./interfaces/IWatchable\";\nexport * from \"./interfaces/IEventEmitter\";\nexport * from \"./interfaces/IReactiveFileSystem\";\nexport * from \"./interfaces/FileSystemCapabilities\";\n\n// Types\nexport * from \"./types/FileEntry\";\nexport * from \"./types/Events\";\nexport * from \"./types/Common\";\nexport * from \"./types/FileSystemEvents\";\n\n// Utilities\nexport * from \"./utils/paths\";\nexport * from \"./utils/EventEmitter\";\n\n// Mixins\nexport * from \"./mixins/withEvents\";\n\n// Base classes\nexport * from \"./base/BaseFileSystem\";\n","import type { FileMetadata } from \"./FileEntry\";\n\n/**\n * Standard file system events that implementations can emit\n */\nexport const FileSystemEvents = {\n  // Initialization events\n  INITIALIZING: \"fs:initializing\",\n  INITIALIZED: \"fs:initialized\",\n  INIT_PROGRESS: \"fs:init:progress\",\n  INIT_ERROR: \"fs:init:error\",\n\n  // Operation lifecycle events\n  OPERATION_START: \"fs:operation:start\",\n  OPERATION_END: \"fs:operation:end\",\n  OPERATION_ERROR: \"fs:operation:error\",\n\n  // File events (complement to watch)\n  FILE_READING: \"fs:file:reading\",\n  FILE_READ: \"fs:file:read\",\n  FILE_WRITING: \"fs:file:writing\",\n  FILE_WRITTEN: \"fs:file:written\",\n  FILE_DELETING: \"fs:file:deleting\",\n  FILE_DELETED: \"fs:file:deleted\",\n\n  // Directory events\n  DIR_READING: \"fs:dir:reading\",\n  DIR_READ: \"fs:dir:read\",\n  DIR_CREATING: \"fs:dir:creating\",\n  DIR_CREATED: \"fs:dir:created\",\n  DIR_DELETING: \"fs:dir:deleting\",\n  DIR_DELETED: \"fs:dir:deleted\",\n\n  // Batch operations\n  BATCH_START: \"fs:batch:start\",\n  BATCH_PROGRESS: \"fs:batch:progress\",\n  BATCH_END: \"fs:batch:end\",\n\n  // Storage events\n  STORAGE_CLEARING: \"fs:storage:clearing\",\n  STORAGE_CLEARED: \"fs:storage:cleared\",\n  STORAGE_SIZE_CALCULATED: \"fs:storage:size\",\n} as const;\n\n/**\n * Event payload types\n */\nexport interface FileSystemEventPayloads {\n  [FileSystemEvents.INITIALIZING]: void;\n  [FileSystemEvents.INITIALIZED]: { duration: number };\n  [FileSystemEvents.INIT_PROGRESS]: {\n    loaded: number;\n    total: number;\n    phase?: string;\n  };\n  [FileSystemEvents.INIT_ERROR]: { error: Error };\n\n  [FileSystemEvents.OPERATION_START]: {\n    operation: string;\n    path?: string;\n    id?: string;\n  };\n  [FileSystemEvents.OPERATION_END]: {\n    operation: string;\n    path?: string;\n    id?: string;\n    duration: number;\n  };\n  [FileSystemEvents.OPERATION_ERROR]: {\n    operation: string;\n    path?: string;\n    error: Error;\n  };\n\n  [FileSystemEvents.FILE_READING]: { path: string };\n  [FileSystemEvents.FILE_READ]: { path: string; size: number };\n  [FileSystemEvents.FILE_WRITING]: { path: string; size?: number };\n  [FileSystemEvents.FILE_WRITTEN]: { path: string; size: number };\n  [FileSystemEvents.FILE_DELETING]: { path: string };\n  [FileSystemEvents.FILE_DELETED]: { path: string };\n\n  [FileSystemEvents.DIR_READING]: { path: string };\n  [FileSystemEvents.DIR_READ]: { path: string; count: number };\n  [FileSystemEvents.DIR_CREATING]: { path: string; recursive: boolean };\n  [FileSystemEvents.DIR_CREATED]: { path: string };\n  [FileSystemEvents.DIR_DELETING]: { path: string; recursive: boolean };\n  [FileSystemEvents.DIR_DELETED]: { path: string };\n\n  [FileSystemEvents.BATCH_START]: { total: number; operation: string };\n  [FileSystemEvents.BATCH_PROGRESS]: { current: number; total: number };\n  [FileSystemEvents.BATCH_END]: { total: number; duration: number };\n\n  [FileSystemEvents.STORAGE_CLEARING]: void;\n  [FileSystemEvents.STORAGE_CLEARED]: { duration: number };\n  [FileSystemEvents.STORAGE_SIZE_CALCULATED]: { size: number };\n}\n\n/**\n * File system event emitter type\n */\nexport type FileSystemEventEmitter =\n  import(\"../interfaces/IEventEmitter\").ITypedEventEmitter<FileSystemEventPayloads>;\n","/**\n * Path utilities for virtual file systems\n */\n\n/**\n * Normalize a path\n */\nexport function normalizePath(path: string): string {\n  // Handle empty path as root\n  if (!path) return \"/\";\n\n  // Ensure path starts with /\n  if (!path.startsWith(\"/\")) {\n    path = \"/\" + path;\n  }\n\n  // Remove duplicate slashes\n  path = path.replace(/\\/+/g, \"/\");\n\n  // Remove trailing slash except for root\n  if (path.length > 1 && path.endsWith(\"/\")) {\n    path = path.slice(0, -1);\n  }\n\n  return path;\n}\n\n/**\n * Get directory name from path\n */\nexport function dirname(path: string): string {\n  const normalized = normalizePath(path);\n  const lastSlash = normalized.lastIndexOf(\"/\");\n  return lastSlash === 0 ? \"/\" : normalized.slice(0, lastSlash);\n}\n\n/**\n * Get base name from path\n */\nexport function basename(path: string): string {\n  const normalized = normalizePath(path);\n  const lastSlash = normalized.lastIndexOf(\"/\");\n  return normalized.slice(lastSlash + 1);\n}\n\n/**\n * Join path segments\n */\nexport function join(...segments: string[]): string {\n  const joined = segments.join(\"/\");\n  return normalizePath(joined);\n}\n\n/**\n * Check if path is absolute\n */\nexport function isAbsolute(path: string): boolean {\n  return path.startsWith(\"/\");\n}\n\n/**\n * Get file extension\n */\nexport function extname(path: string): string {\n  const base = basename(path);\n  const lastDot = base.lastIndexOf(\".\");\n  return lastDot === -1 ? \"\" : base.slice(lastDot);\n}\n","import type { Disposable } from \"../types/Common\";\nimport type {\n  IEventEmitter,\n  ITypedEventEmitter,\n} from \"../interfaces/IEventEmitter\";\n\n/**\n * Simple event emitter implementation that file systems can use\n * Implementations are free to use their own event system\n */\nexport class EventEmitter implements IEventEmitter {\n  private events = new Map<string | symbol, Set<Function>>();\n\n  on(event: string | symbol, handler: (...args: any[]) => void): Disposable {\n    if (!this.events.has(event)) {\n      this.events.set(event, new Set());\n    }\n\n    this.events.get(event)!.add(handler);\n\n    return {\n      dispose: () => this.off(event, handler),\n    };\n  }\n\n  once(event: string | symbol, handler: (...args: any[]) => void): Disposable {\n    const wrappedHandler = (...args: any[]) => {\n      handler(...args);\n      this.off(event, wrappedHandler);\n    };\n\n    return this.on(event, wrappedHandler);\n  }\n\n  emit(event: string | symbol, ...args: any[]): boolean {\n    const handlers = this.events.get(event);\n    if (!handlers || handlers.size === 0) {\n      return false;\n    }\n\n    handlers.forEach((handler) => {\n      try {\n        handler(...args);\n      } catch (error) {\n        console.error(`Error in event handler for ${String(event)}:`, error);\n      }\n    });\n\n    return true;\n  }\n\n  off(event: string | symbol, handler?: (...args: any[]) => void): void {\n    if (!handler) {\n      this.events.delete(event);\n      return;\n    }\n\n    const handlers = this.events.get(event);\n    if (handlers) {\n      handlers.delete(handler);\n      if (handlers.size === 0) {\n        this.events.delete(event);\n      }\n    }\n  }\n\n  removeAllListeners(event?: string | symbol): void {\n    if (event) {\n      this.events.delete(event);\n    } else {\n      this.events.clear();\n    }\n  }\n}\n\n/**\n * Typed event emitter implementation\n */\nexport class TypedEventEmitter<T extends Record<string, any>>\n  implements ITypedEventEmitter<T>\n{\n  private emitter = new EventEmitter();\n\n  on<K extends keyof T>(\n    event: K,\n    handler: (payload: T[K]) => void,\n  ): Disposable {\n    return this.emitter.on(event as string, handler);\n  }\n\n  once<K extends keyof T>(\n    event: K,\n    handler: (payload: T[K]) => void,\n  ): Disposable {\n    return this.emitter.once(event as string, handler);\n  }\n\n  emit<K extends keyof T>(event: K, payload: T[K]): boolean {\n    return this.emitter.emit(event as string, payload);\n  }\n\n  off<K extends keyof T>(event: K, handler?: (payload: T[K]) => void): void {\n    this.emitter.off(event as string, handler);\n  }\n\n  removeAllListeners<K extends keyof T>(event?: K): void {\n    this.emitter.removeAllListeners(event as string);\n  }\n}\n","import type { IFileSystem } from \"../interfaces/IFileSystem\";\nimport type { IReactiveFileSystem } from \"../interfaces/IReactiveFileSystem\";\nimport type { FileEntry, FileMetadata } from \"../types/FileEntry\";\nimport type { FileSystemEventPayloads } from \"../types/FileSystemEvents\";\nimport { TypedEventEmitter } from \"../utils/EventEmitter\";\nimport { FileSystemEvents } from \"../types/FileSystemEvents\";\n\n/**\n * Constructor type helper\n */\ntype Constructor<T = {}> = new (...args: any[]) => T;\n\n/**\n * Mixin to add event support to any file system implementation\n */\nexport function withEvents<TBase extends Constructor<IFileSystem>>(\n  Base: TBase,\n): TBase & Constructor<IReactiveFileSystem> {\n  return class extends Base {\n    public readonly events = new TypedEventEmitter<FileSystemEventPayloads>();\n\n    // Override methods to emit events\n    async readFile(path: string): Promise<FileEntry> {\n      const startTime = Date.now();\n      const operationId = `read-${path}-${startTime}`;\n\n      this.events.emit(FileSystemEvents.OPERATION_START, {\n        operation: \"readFile\",\n        path,\n        id: operationId,\n      });\n\n      this.events.emit(FileSystemEvents.FILE_READING, { path });\n\n      try {\n        const result = await super.readFile(path);\n\n        this.events.emit(FileSystemEvents.FILE_READ, {\n          path,\n          size: result.size || 0,\n        });\n\n        this.events.emit(FileSystemEvents.OPERATION_END, {\n          operation: \"readFile\",\n          path,\n          id: operationId,\n          duration: Date.now() - startTime,\n        });\n\n        return result;\n      } catch (error) {\n        this.events.emit(FileSystemEvents.OPERATION_ERROR, {\n          operation: \"readFile\",\n          path,\n          error: error as Error,\n        });\n        throw error;\n      }\n    }\n\n    async writeFile(\n      path: string,\n      content: any,\n      metadata?: FileMetadata,\n    ): Promise<FileEntry> {\n      const startTime = Date.now();\n      const operationId = `write-${path}-${startTime}`;\n      const size =\n        typeof content === \"string\"\n          ? content.length\n          : JSON.stringify(content).length;\n\n      this.events.emit(FileSystemEvents.OPERATION_START, {\n        operation: \"writeFile\",\n        path,\n        id: operationId,\n      });\n\n      this.events.emit(FileSystemEvents.FILE_WRITING, { path, size });\n\n      try {\n        const result = await super.writeFile(path, content, metadata);\n\n        this.events.emit(FileSystemEvents.FILE_WRITTEN, { path, size });\n\n        this.events.emit(FileSystemEvents.OPERATION_END, {\n          operation: \"writeFile\",\n          path,\n          id: operationId,\n          duration: Date.now() - startTime,\n        });\n\n        return result;\n      } catch (error) {\n        this.events.emit(FileSystemEvents.OPERATION_ERROR, {\n          operation: \"writeFile\",\n          path,\n          error: error as Error,\n        });\n        throw error;\n      }\n    }\n\n    async deleteFile(path: string): Promise<void> {\n      const startTime = Date.now();\n      const operationId = `delete-${path}-${startTime}`;\n\n      this.events.emit(FileSystemEvents.OPERATION_START, {\n        operation: \"deleteFile\",\n        path,\n        id: operationId,\n      });\n\n      this.events.emit(FileSystemEvents.FILE_DELETING, { path });\n\n      try {\n        await super.deleteFile(path);\n\n        this.events.emit(FileSystemEvents.FILE_DELETED, { path });\n\n        this.events.emit(FileSystemEvents.OPERATION_END, {\n          operation: \"deleteFile\",\n          path,\n          id: operationId,\n          duration: Date.now() - startTime,\n        });\n      } catch (error) {\n        this.events.emit(FileSystemEvents.OPERATION_ERROR, {\n          operation: \"deleteFile\",\n          path,\n          error: error as Error,\n        });\n        throw error;\n      }\n    }\n\n    async readDir(path: string): Promise<FileEntry[]> {\n      const startTime = Date.now();\n      const operationId = `readDir-${path}-${startTime}`;\n\n      this.events.emit(FileSystemEvents.OPERATION_START, {\n        operation: \"readDir\",\n        path,\n        id: operationId,\n      });\n\n      this.events.emit(FileSystemEvents.DIR_READING, { path });\n\n      try {\n        const result = await super.readDir(path);\n\n        this.events.emit(FileSystemEvents.DIR_READ, {\n          path,\n          count: result.length,\n        });\n\n        this.events.emit(FileSystemEvents.OPERATION_END, {\n          operation: \"readDir\",\n          path,\n          id: operationId,\n          duration: Date.now() - startTime,\n        });\n\n        return result;\n      } catch (error) {\n        this.events.emit(FileSystemEvents.OPERATION_ERROR, {\n          operation: \"readDir\",\n          path,\n          error: error as Error,\n        });\n        throw error;\n      }\n    }\n\n    async mkdir(path: string, recursive: boolean = false): Promise<FileEntry> {\n      const startTime = Date.now();\n      const operationId = `mkdir-${path}-${startTime}`;\n\n      this.events.emit(FileSystemEvents.OPERATION_START, {\n        operation: \"mkdir\",\n        path,\n        id: operationId,\n      });\n\n      this.events.emit(FileSystemEvents.DIR_CREATING, { path, recursive });\n\n      try {\n        const result = await super.mkdir(path, recursive);\n\n        this.events.emit(FileSystemEvents.DIR_CREATED, { path });\n\n        this.events.emit(FileSystemEvents.OPERATION_END, {\n          operation: \"mkdir\",\n          path,\n          id: operationId,\n          duration: Date.now() - startTime,\n        });\n\n        return result;\n      } catch (error) {\n        this.events.emit(FileSystemEvents.OPERATION_ERROR, {\n          operation: \"mkdir\",\n          path,\n          error: error as Error,\n        });\n        throw error;\n      }\n    }\n\n    async rmdir(path: string, recursive: boolean = false): Promise<void> {\n      const startTime = Date.now();\n      const operationId = `rmdir-${path}-${startTime}`;\n\n      this.events.emit(FileSystemEvents.OPERATION_START, {\n        operation: \"rmdir\",\n        path,\n        id: operationId,\n      });\n\n      this.events.emit(FileSystemEvents.DIR_DELETING, { path, recursive });\n\n      try {\n        await super.rmdir(path, recursive);\n\n        this.events.emit(FileSystemEvents.DIR_DELETED, { path });\n\n        this.events.emit(FileSystemEvents.OPERATION_END, {\n          operation: \"rmdir\",\n          path,\n          id: operationId,\n          duration: Date.now() - startTime,\n        });\n      } catch (error) {\n        this.events.emit(FileSystemEvents.OPERATION_ERROR, {\n          operation: \"rmdir\",\n          path,\n          error: error as Error,\n        });\n        throw error;\n      }\n    }\n\n    async clear(): Promise<void> {\n      const startTime = Date.now();\n      const operationId = `clear-${startTime}`;\n\n      this.events.emit(FileSystemEvents.OPERATION_START, {\n        operation: \"clear\",\n        id: operationId,\n      });\n\n      this.events.emit(FileSystemEvents.STORAGE_CLEARING, undefined as any);\n\n      try {\n        await super.clear();\n\n        const duration = Date.now() - startTime;\n        this.events.emit(FileSystemEvents.STORAGE_CLEARED, { duration });\n\n        this.events.emit(FileSystemEvents.OPERATION_END, {\n          operation: \"clear\",\n          id: operationId,\n          duration,\n        });\n      } catch (error) {\n        this.events.emit(FileSystemEvents.OPERATION_ERROR, {\n          operation: \"clear\",\n          error: error as Error,\n        });\n        throw error;\n      }\n    }\n\n    async size(): Promise<number> {\n      const startTime = Date.now();\n      const operationId = `size-${startTime}`;\n\n      this.events.emit(FileSystemEvents.OPERATION_START, {\n        operation: \"size\",\n        id: operationId,\n      });\n\n      try {\n        const size = await super.size();\n\n        this.events.emit(FileSystemEvents.STORAGE_SIZE_CALCULATED, { size });\n\n        this.events.emit(FileSystemEvents.OPERATION_END, {\n          operation: \"size\",\n          id: operationId,\n          duration: Date.now() - startTime,\n        });\n\n        return size;\n      } catch (error) {\n        this.events.emit(FileSystemEvents.OPERATION_ERROR, {\n          operation: \"size\",\n          error: error as Error,\n        });\n        throw error;\n      }\n    }\n  };\n}\n","import type { IReactiveFileSystem } from \"../interfaces/IReactiveFileSystem\";\nimport type { IFileSystemCapabilities } from \"../interfaces/FileSystemCapabilities\";\nimport type { FileEntry, FileStat, FileMetadata } from \"../types/FileEntry\";\nimport type { FSEvent } from \"../types/Events\";\nimport type { Disposable } from \"../types/Common\";\nimport { normalizePath } from \"../utils/paths\";\n\n/**\n * Classe base abstrata com implementações padrão para FileSystem\n * Fornece implementações padrão para os novos métodos de permissão\n */\nexport abstract class BaseFileSystem implements IReactiveFileSystem {\n  // Métodos abstratos que cada implementação deve fornecer\n  abstract get events(): any;\n  abstract readFile(path: string): Promise<FileEntry>;\n  abstract writeFile(\n    path: string,\n    content: any,\n    metadata?: FileMetadata,\n  ): Promise<FileEntry>;\n  abstract deleteFile(path: string): Promise<void>;\n  abstract exists(path: string): Promise<boolean>;\n  abstract readDir(path: string): Promise<FileEntry[]>;\n  abstract mkdir(path: string, recursive?: boolean): Promise<FileEntry>;\n  abstract rmdir(path: string, recursive?: boolean): Promise<void>;\n  abstract rename(oldPath: string, newPath: string): Promise<FileEntry>;\n  abstract move(sourcePaths: string[], targetPath: string): Promise<void>;\n  abstract copy(sourcePath: string, targetPath: string): Promise<FileEntry>;\n  abstract watch(\n    pattern: string,\n    callback: (event: FSEvent) => void,\n  ): Disposable;\n  abstract stat(path: string): Promise<FileStat>;\n  abstract glob(pattern: string): Promise<string[]>;\n  abstract clear(): Promise<void>;\n  abstract size(): Promise<number>;\n\n  // Implementações padrão dos novos métodos\n\n  /**\n   * Por padrão, permite modificação se o arquivo existe ou se pode ser criado\n   */\n  async canModify(path: string): Promise<boolean> {\n    try {\n      const stat = await this.stat(path);\n      return !stat.readonly;\n    } catch {\n      // Se não existe, verifica se pode criar no diretório pai\n      const parentPath = this.getParentPath(path);\n      if (parentPath === \"/\") {\n        return true; // Root sempre permite criar\n      }\n      return this.canCreateIn(parentPath);\n    }\n  }\n\n  /**\n   * Por padrão, permite criar se o diretório existe e não é readonly\n   */\n  async canCreateIn(parentPath: string): Promise<boolean> {\n    try {\n      const stat = await this.stat(parentPath);\n      return stat.type === \"directory\" && !stat.readonly;\n    } catch {\n      return false; // Diretório não existe\n    }\n  }\n\n  /**\n   * Implementação padrão de escrita atômica usando temp + rename\n   */\n  async writeFileAtomic(\n    path: string,\n    content: any,\n    metadata?: FileMetadata,\n  ): Promise<FileEntry> {\n    const normalizedPath = normalizePath(path);\n    const tempPath = `${normalizedPath}.tmp${Date.now()}`;\n\n    try {\n      // 1. Escreve no arquivo temporário\n      await this.writeFile(tempPath, content, metadata);\n\n      // 2. Remove o original se existir\n      if (await this.exists(normalizedPath)) {\n        await this.deleteFile(normalizedPath);\n      }\n\n      // 3. Renomeia temp para final\n      return await this.rename(tempPath, normalizedPath);\n    } catch (error) {\n      // Cleanup em caso de erro\n      try {\n        await this.deleteFile(tempPath);\n      } catch {\n        // Ignora erro no cleanup\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Helper para extrair diretório pai\n   */\n  protected getParentPath(path: string): string {\n    const normalized = normalizePath(path);\n    const lastSlash = normalized.lastIndexOf(\"/\");\n    return lastSlash <= 0 ? \"/\" : normalized.substring(0, lastSlash);\n  }\n}\n"],"mappings":"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","names":[]}