import type * as d from '../../internal/index'; /** * An in-memory FS which proxies the underlying OS filesystem using a simple * in-memory cache. FS writes can accumulate on the in-memory system, using an * API similar to Node.js' `"fs"` module, and then be committed to disk as a * unit. * * Files written to the in-memory system can be edited, deleted, and so on. * This allows the compiler to proceed freely as if it is modifying the * filesystem, modifying the world in whatever way suits it, while deferring * actual FS writes until the end of the compilation process, making actual * changes to the filesystem on disk contingent on an error-free build or any * other condition. * * Usage example: * * ```ts * // create an in-memory FS * const sys = createSystem(); * const inMemoryFs = createInMemoryFs(sys); * * // do a few fs operations * await inMemoryFs.writeFile("path/to/file.js", 'console.log("hey!");') * await inMemoryFs.remove("path/to/another_file.ts"); * * // commit the results to disk * const commitStats = await inMemoryFs.commit(); * ``` * * In the above example the write operation and the delete operation (w/ * `.remove`) are both queued in the in-memory proxy but not committed to * disk until the `.commit` method is called. */ export type InMemoryFileSystem = ReturnType; /** * A node in the in-memory file system. This may represent a file or * a directory, and pending copy, write, and delete operations may be stored * on it. */ export interface FsItem { fileText: string; isFile: boolean; isDirectory: boolean; size: number; mtimeMs: number; exists: boolean; queueCopyFileToDest: string; queueWriteToDisk: boolean; queueDeleteFromDisk?: boolean; useCache: boolean; } /** * Storage format for the in-memory cache used to proxy the OS filesystem. * * Filesystem paths (of type `string`) are mapped to objects satisfying the * `FsItem` interface. */ export type FsItems = Map; /** * Options supported by write methods on the in-memory filesystem. */ export interface FsWriteOptions { inMemoryOnly?: boolean; clearFileCache?: boolean; immediateWrite?: boolean; useCache?: boolean; /** * An optional tag for the current output target for which this file is being * written. */ outputTargetType?: string; } /** * Results from a write operation on the in-memory filesystem. */ export interface FsWriteResults { changedContent: boolean; queuedWrite: boolean; ignored: boolean; } /** * Options supported by read methods on the in-memory filesystem. */ export interface FsReadOptions { useCache?: boolean; setHash?: boolean; } /** * Options supported by the readdir option on the in-memory filesystem. */ interface FsReaddirOptions { inMemoryOnly?: boolean; recursive?: boolean; /** * Directory names to exclude. Just the basename, * not the entire path. Basically for "node_modules". */ excludeDirNames?: string[]; /** * Extensions we know we can avoid. Each extension * should include the `.` so that we can test for both * `.d.ts.` and `.ts`. If `excludeExtensions` isn't provided it * doesn't try to exclude anything. This only checks against * the filename, not directory names when recursive. */ excludeExtensions?: string[]; } /** * A result from a directory read operation */ interface FsReaddirItem { absPath: string; relPath: string; isDirectory: boolean; isFile: boolean; } /** * Information about a file in the in-memory filesystem. */ interface FsStat { exists: boolean; isFile: boolean; isDirectory: boolean; size: number; } /** * Create an in-memory FS which proxies the underlying OS filesystem using an * in-memory cache. FS writes can accumulate on the in-memory system, using an * API similar to Node.js' `"fs"` module, and then be committed to disk as a * unit. * * Files written to the in-memory system can be edited, deleted, and so on. * This allows the compiler to proceed freely as if it is modifying the * filesystem, modifying the world in whatever way suits it, while deferring * actual FS writes until the end of the compilation process, making actual * changes to the filesystem on disk contingent on an error-free build or any * other condition. * * @param sys a compiler system object * @returns an in-memory filesystem interface */ export declare const createInMemoryFs: (sys: d.CompilerSystem) => { access: (filePath: string) => Promise; accessSync: (filePath: string) => boolean; cancelDeleteDirectoriesFromDisk: (dirPaths: string[]) => void; cancelDeleteFilesFromDisk: (filePaths: string[]) => void; clearCache: () => void; clearDirCache: (dirPath: string) => void; clearFileCache: (filePath: string) => void; commit: () => Promise; copyFile: (src: string, dest: string) => Promise; emptyDirs: (dirs: string[]) => Promise; getBuildOutputs: () => d.BuildOutput[]; getItem: (itemPath: string) => FsItem; getMemoryStats: () => string; readFile: (filePath: string, opts?: FsReadOptions) => Promise; readFileSync: (filePath: string, opts?: FsReadOptions) => string; readdir: (dirPath: string, opts?: FsReaddirOptions) => Promise; remove: (itemPath: string) => Promise; stat: (itemPath: string) => Promise; statSync: (itemPath: string) => FsStat; sys: d.CompilerSystem; writeFile: (filePath: string, content: string, opts?: FsWriteOptions) => Promise; writeFiles: (files: { [filePath: string]: string; } | Map, opts?: FsWriteOptions) => Promise; }; /** * The information needed to carry out a file copy operation. * * `[ source, destination ]` */ type FileCopyTuple = [string, string]; /** * Collected instructions for all pending filesystem operations saved * to the in-memory filesystem. */ interface FsCommitInstructions { filesToDelete: string[]; filesToWrite: string[]; /** * Files queued for copy operations are stored as an array of `[source, dest]` * tuples. */ filesToCopy: FileCopyTuple[]; dirsToDelete: string[]; dirsToEnsure: string[]; } /** * Results from committing pending filesystem operations */ interface FsCommitResults { filesCopied: FileCopyTuple[]; filesWritten: string[]; filesDeleted: string[]; dirsDeleted: string[]; dirsAdded: string[]; } /** * Given the current state of the in-memory proxy filesystem, collect all of * the changes that need to be made in order to commit the currently-pending * operations (e.g. write, copy, delete) to the OS filesystem. * * @param items the storage data structure for the in-memory FS cache * @returns a collection of all the operations that need to be done */ export declare const getCommitInstructions: (items: FsItems) => FsCommitInstructions; /** * Check whether a given filepath should be ignored * * We have a little ignore list, and we just check whether the * filepath ends with any of the strings on the ignore list. * * @param filePath the filepath to check! * @returns whether we should ignore it or not */ export declare const shouldIgnore: (filePath: string) => boolean; export {};