import { Readable } from 'node:stream'; import { EventEmitter } from 'node:events'; export interface VFSOptions { moduleHooks?: boolean; virtualCwd?: boolean; overlay?: boolean; } export interface MkdirOptions { recursive?: boolean; mode?: number; } export interface ReaddirOptions { withFileTypes?: boolean; } export interface WatchOptions { persistent?: boolean; recursive?: boolean; interval?: number; signal?: AbortSignal; } export interface WatchFileOptions { persistent?: boolean; interval?: number; } export interface ReadStreamOptions { start?: number; end?: number; highWaterMark?: number; encoding?: BufferEncoding; autoClose?: boolean; } export interface StatOptions { bigint?: boolean; } export class VirtualStats { dev: number; mode: number; nlink: number; uid: number; gid: number; rdev: number; blksize: number; ino: number; size: number; blocks: number; atimeMs: number; mtimeMs: number; ctimeMs: number; birthtimeMs: number; atime: Date; mtime: Date; ctime: Date; birthtime: Date; isFile(): boolean; isDirectory(): boolean; isSymbolicLink(): boolean; isBlockDevice(): boolean; isCharacterDevice(): boolean; isFIFO(): boolean; isSocket(): boolean; } export class VirtualDirent { get name(): string; get parentPath(): string; get path(): string; isFile(): boolean; isDirectory(): boolean; isSymbolicLink(): boolean; isBlockDevice(): boolean; isCharacterDevice(): boolean; isFIFO(): boolean; isSocket(): boolean; } export class VirtualReadStream extends Readable { constructor(vfs: VirtualFileSystem, filePath: string, options?: ReadStreamOptions); get path(): string; } export class VFSWatcher extends EventEmitter { close(): void; unref(): this; ref(): this; } export interface WatchAsyncEvent { eventType: string; filename: string; } export class VFSWatchAsyncIterable implements AsyncIterable { [Symbol.asyncIterator](): AsyncIterator; next(): Promise>; return(): Promise>; throw(error?: unknown): Promise>; } export class VFSStatWatcher extends EventEmitter { addListener(listener: (curr: VirtualStats, prev: VirtualStats) => void): void; removeListener(listener: (curr: VirtualStats, prev: VirtualStats) => void): boolean; hasNoListeners(): boolean; stop(): void; unref(): this; ref(): this; } export interface VFSPromisesAPI { readFile(filePath: string, options?: { encoding?: null } | null): Promise; readFile(filePath: string, options: BufferEncoding | { encoding: BufferEncoding }): Promise; readFile(filePath: string, options?: BufferEncoding | { encoding?: BufferEncoding | null } | null): Promise; writeFile(filePath: string, data: string | Buffer, options?: { encoding?: BufferEncoding; mode?: number } | BufferEncoding): Promise; appendFile(filePath: string, data: string | Buffer, options?: { encoding?: BufferEncoding; mode?: number } | BufferEncoding): Promise; stat(filePath: string, options?: StatOptions): Promise; lstat(filePath: string, options?: StatOptions): Promise; readdir(dirPath: string, options?: ReaddirOptions & { withFileTypes?: false }): Promise; readdir(dirPath: string, options: ReaddirOptions & { withFileTypes: true }): Promise; readdir(dirPath: string, options?: ReaddirOptions): Promise; mkdir(dirPath: string, options?: MkdirOptions): Promise; rmdir(dirPath: string): Promise; unlink(filePath: string): Promise; rename(oldPath: string, newPath: string): Promise; copyFile(src: string, dest: string, mode?: number): Promise; realpath(filePath: string, options?: { encoding?: BufferEncoding }): Promise; readlink(linkPath: string, options?: { encoding?: BufferEncoding }): Promise; symlink(target: string, path: string, type?: string): Promise; access(filePath: string, mode?: number): Promise; watch(filePath: string, options?: WatchOptions): VFSWatchAsyncIterable; } type Callback = T extends void ? (err: NodeJS.ErrnoException | null) => void : (err: NodeJS.ErrnoException | null, result: T) => void; export class VirtualFileSystem { constructor(provider?: VirtualProvider, options?: VFSOptions); constructor(options?: VFSOptions); get provider(): VirtualProvider; get mountPoint(): string | null; get mounted(): boolean; get readonly(): boolean; get overlay(): boolean; get virtualCwdEnabled(): boolean; // Virtual Working Directory cwd(): string; chdir(dirPath: string): void; resolvePath(inputPath: string): string; // Mount mount(prefix: string): this; unmount(): void; [Symbol.dispose](): void; shouldHandle(inputPath: string): boolean; // Sync operations existsSync(filePath: string): boolean; statSync(filePath: string, options?: StatOptions): VirtualStats; lstatSync(filePath: string, options?: StatOptions): VirtualStats; readFileSync(filePath: string, options?: { encoding?: null } | null): Buffer; readFileSync(filePath: string, options: BufferEncoding | { encoding: BufferEncoding }): string; readFileSync(filePath: string, options?: BufferEncoding | { encoding?: BufferEncoding | null } | null): Buffer | string; writeFileSync(filePath: string, data: string | Buffer, options?: { encoding?: BufferEncoding; mode?: number } | BufferEncoding): void; appendFileSync(filePath: string, data: string | Buffer, options?: { encoding?: BufferEncoding; mode?: number } | BufferEncoding): void; readdirSync(dirPath: string, options?: ReaddirOptions & { withFileTypes?: false }): string[]; readdirSync(dirPath: string, options: ReaddirOptions & { withFileTypes: true }): VirtualDirent[]; readdirSync(dirPath: string, options?: ReaddirOptions): string[] | VirtualDirent[]; mkdirSync(dirPath: string, options?: MkdirOptions): string | undefined; rmdirSync(dirPath: string): void; unlinkSync(filePath: string): void; renameSync(oldPath: string, newPath: string): void; copyFileSync(src: string, dest: string, mode?: number): void; realpathSync(filePath: string, options?: { encoding?: BufferEncoding }): string; readlinkSync(linkPath: string, options?: { encoding?: BufferEncoding }): string; symlinkSync(target: string, path: string, type?: string): void; accessSync(filePath: string, mode?: number): void; // File descriptor operations openSync(filePath: string, flags?: string, mode?: number): number; closeSync(fd: number): void; readSync(fd: number, buffer: Buffer, offset: number, length: number, position: number | null): number; fstatSync(fd: number, options?: StatOptions): VirtualStats; // Callback operations readFile(filePath: string, callback: Callback): void; readFile(filePath: string, options: BufferEncoding | { encoding: BufferEncoding }, callback: Callback): void; readFile(filePath: string, options: { encoding?: BufferEncoding | null } | null | undefined, callback: Callback): void; writeFile(filePath: string, data: string | Buffer, callback: Callback): void; writeFile(filePath: string, data: string | Buffer, options: { encoding?: BufferEncoding; mode?: number } | BufferEncoding, callback: Callback): void; stat(filePath: string, callback: Callback): void; stat(filePath: string, options: StatOptions, callback: Callback): void; lstat(filePath: string, callback: Callback): void; lstat(filePath: string, options: StatOptions, callback: Callback): void; readdir(dirPath: string, callback: Callback): void; readdir(dirPath: string, options: ReaddirOptions & { withFileTypes: true }, callback: Callback): void; readdir(dirPath: string, options: ReaddirOptions, callback: Callback): void; realpath(filePath: string, callback: Callback): void; realpath(filePath: string, options: { encoding?: BufferEncoding }, callback: Callback): void; readlink(linkPath: string, callback: Callback): void; readlink(linkPath: string, options: { encoding?: BufferEncoding }, callback: Callback): void; access(filePath: string, callback: Callback): void; access(filePath: string, mode: number, callback: Callback): void; open(filePath: string, callback: Callback): void; open(filePath: string, flags: string, callback: Callback): void; open(filePath: string, flags: string, mode: number, callback: Callback): void; close(fd: number, callback: Callback): void; read(fd: number, buffer: Buffer, offset: number, length: number, position: number | null, callback: (err: NodeJS.ErrnoException | null, bytesRead: number, buffer: Buffer) => void): void; fstat(fd: number, callback: Callback): void; fstat(fd: number, options: StatOptions, callback: Callback): void; // Stream operations createReadStream(filePath: string, options?: ReadStreamOptions): VirtualReadStream; // Watch operations watch(filePath: string, options?: WatchOptions, listener?: (eventType: string, filename: string) => void): VFSWatcher; watch(filePath: string, listener?: (eventType: string, filename: string) => void): VFSWatcher; watchFile(filePath: string, options?: WatchFileOptions, listener?: (curr: VirtualStats, prev: VirtualStats) => void): VFSStatWatcher; watchFile(filePath: string, listener?: (curr: VirtualStats, prev: VirtualStats) => void): VFSStatWatcher; unwatchFile(filePath: string, listener?: (curr: VirtualStats, prev: VirtualStats) => void): void; // Promise API get promises(): VFSPromisesAPI; } export class VirtualProvider { get readonly(): boolean; get supportsSymlinks(): boolean; get supportsWatch(): boolean; // Essential primitives open(path: string, flags?: string, mode?: number): Promise; openSync(path: string, flags?: string, mode?: number): unknown; stat(path: string, options?: StatOptions): Promise; statSync(path: string, options?: StatOptions): VirtualStats; lstat(path: string, options?: StatOptions): Promise; lstatSync(path: string, options?: StatOptions): VirtualStats; readdir(path: string, options?: ReaddirOptions): Promise; readdirSync(path: string, options?: ReaddirOptions): string[] | VirtualDirent[]; mkdir(path: string, options?: MkdirOptions): Promise; mkdirSync(path: string, options?: MkdirOptions): string | undefined; rmdir(path: string): Promise; rmdirSync(path: string): void; unlink(path: string): Promise; unlinkSync(path: string): void; rename(oldPath: string, newPath: string): Promise; renameSync(oldPath: string, newPath: string): void; // Default implementations readFile(path: string, options?: BufferEncoding | { encoding?: BufferEncoding | null } | null): Promise; readFileSync(path: string, options?: BufferEncoding | { encoding?: BufferEncoding | null } | null): Buffer | string; writeFile(path: string, data: string | Buffer, options?: { encoding?: BufferEncoding; mode?: number } | BufferEncoding): Promise; writeFileSync(path: string, data: string | Buffer, options?: { encoding?: BufferEncoding; mode?: number } | BufferEncoding): void; appendFile(path: string, data: string | Buffer, options?: { encoding?: BufferEncoding; mode?: number } | BufferEncoding): Promise; appendFileSync(path: string, data: string | Buffer, options?: { encoding?: BufferEncoding; mode?: number } | BufferEncoding): void; exists(path: string): Promise; existsSync(path: string): boolean; copyFile(src: string, dest: string, mode?: number): Promise; copyFileSync(src: string, dest: string, mode?: number): void; internalModuleStat(path: string): number; realpath(path: string, options?: { encoding?: BufferEncoding }): Promise; realpathSync(path: string, options?: { encoding?: BufferEncoding }): string; access(path: string, mode?: number): Promise; accessSync(path: string, mode?: number): void; // Symlink operations readlink(path: string, options?: { encoding?: BufferEncoding }): Promise; readlinkSync(path: string, options?: { encoding?: BufferEncoding }): string; symlink(target: string, path: string, type?: string): Promise; symlinkSync(target: string, path: string, type?: string): void; // Watch operations watch(path: string, options?: WatchOptions): VFSWatcher; watchAsync(path: string, options?: WatchOptions): VFSWatchAsyncIterable; watchFile(path: string, options?: WatchFileOptions, listener?: (curr: VirtualStats, prev: VirtualStats) => void): VFSStatWatcher; unwatchFile(path: string, listener?: (curr: VirtualStats, prev: VirtualStats) => void): void; } export class MemoryProvider extends VirtualProvider { constructor(); get readonly(): boolean; get supportsWatch(): boolean; get supportsSymlinks(): boolean; setReadOnly(): void; } export class RealFSProvider extends VirtualProvider { constructor(rootPath: string); get rootPath(): string; get readonly(): boolean; get supportsSymlinks(): boolean; } export class SqliteProvider extends VirtualProvider { constructor(pathOrMemory?: string); get readonly(): boolean; get supportsWatch(): boolean; get supportsSymlinks(): boolean; setReadOnly(): void; close(): void; } export function create(options?: VFSOptions): VirtualFileSystem; export function create(provider: VirtualProvider, options?: VFSOptions): VirtualFileSystem;