import Entry, { DefaultEntry, BaseEntry } from './entry'; declare namespace FSTree { type Operand = 'unlink' | 'rmdir' | 'create' | 'change' | 'mkdir'; type Operation = [Operand, string, DefaultEntry] | [Operand, string]; type Patch = Operation[]; type Entry = import('./entry').DefaultEntry; interface Options { entries?: BaseEntry[]; sortAndExpand?: boolean; } interface StaticOptions { sortAndExpand?: boolean; } interface PatchDelegate { unlink?(inputPath: string, outputPath: string, relativePath: string): void; rmdir?(inputPath: string, outputPath: string, relativePath: string): void; mkdir?(inputPath: string, outputPath: string, relativePath: string): void; change?(inputPath: string, outputPath: string, relativePath: string): void; create?(inputPath: string, outputPath: string, relativePath: string): void; } } declare class FSTree<T extends BaseEntry = DefaultEntry> { entries: T[]; constructor(options?: { entries?: T[]; sortAndExpand?: boolean; }); static fromPaths(paths: string[], options?: FSTree.StaticOptions): FSTree<Entry>; static fromEntries<T extends BaseEntry>(entries: T[], options?: FSTree.StaticOptions): FSTree<T>; readonly size: number; addEntries(entries: T[], options?: FSTree.StaticOptions): void; addPaths(paths: string[], options?: FSTree.StaticOptions): void; forEach(fn: (entry: T, index: number, collection: T[]) => void, context: any): void; calculatePatch<K extends BaseEntry>(theirFSTree: FSTree<K>, isEqual?: (a: T, b: K) => boolean): FSTree.Patch; calculateAndApplyPatch(otherFSTree: FSTree<T>, input: string, output: string, delegate?: FSTree.PatchDelegate): void; static defaultIsEqual(entryA: DefaultEntry, entryB: DefaultEntry): boolean; static applyPatch(input: string, output: string, patch: FSTree.Patch, _delegate?: FSTree.PatchDelegate): void; } export = FSTree;