createVfs
API
Create a new Vfs instance with a great set of built-in plugins:
typescript
declare function createVfs(path: string, params?: CreateHeadlessVfsParams): Promise<Vfs>;
createHeadlessVfs
Creates a new vfs
instance without any built-in plugins.
typescript
declare function createHeadlessVfs(
path: string,
params?: CreateHeadlessVfsParams
): Promise<HeadlessVfs>;
Vfs
Prebuilt instance of vfs
with all built-in plugins.
List of all methods (simplified, see concrete plugin docs for more details):
typescript
interface Vfs extends HeadlessVfs {
// Json
jsonFile(path: string): JsonFileApi;
readJson<T>(path: string, options): Promise<T>;
writeJson<T>(path: string, json: T, options): Promise<void>;
updateJson<T>(path: string, updater: JsonUpdate<T>, options): Promise<void>;
// Glob
glob(pattern: string | string[], options): Promise<string[]>;
// Scan
scan(path: string, options): Promise<ScanResult>;
// Eslint
fix(path: string): Promise<void>;
fixAll(): Promise<void>;
// Prettier
format(path: string): Promise<void>;
formatAll(): Promise<void>;
// PackageJson
packageJson(path?: string): PackageJsonFileApi;
}
HeadlessVfs
Default ready-to-use instance of vfs
without any built-in plugins.
You can use it if you want to disable or replace some built-in plugins.
typescript
interface HeadlessVfs {
// Common
/**
* Applies all changes to the underlying vfs backend.
*/
apply(): Promise<void>;
/**
* Creates a new vfs instance under the specified path.
* All plugins will be inherited.
* All changes are two-way synced.
*/
child(path: string): Promise<HeadlessVfs>;
/**
* Immutable extension of the current vfs instance with the specified plugins.
* You can use it in any order and any number of times.
* @example
* const vfs = createHeadlessVfs('/root/path');
* const enhanced = vfs.pipe(glob(), json());
* const superEnhanced = vfs.pipe(json()).pipe(glob()).pipe(prettier(), eslint());
*/
pipe(...plugins: VfsPlugin[]): Promise<HeadlessVfs>;
/** Is current VFS virtual? */
readonly virtual: boolean;
/** Is current VFS readonly? */
readonly readonly: boolean;
// Path API
/** Absolute path to current dir */
readonly path: string;
/** Absolute path to parent directory */
readonly dirname: string;
/**
* Resolves an absolute path to the current directory.
* Uses `path.resolve` internally.
*
* @example createVfs('/root/path').resolve('subdir') // -> '/root/path/subdir'
* @example createVfs('/root/path').resolve('subdir', 'file.txt') // -> '/root/path/subdir/file.txt'
* @example createVfs('/root/path').resolve('/other/path') // -> '/other/path'
*/
resolve(...to: string[]): string;
/**
* Returns a relative path to the current directory.
*
* @example createVfs('/root/path').relative('/root/path/subdir') // -> 'subdir'
* @example createVfs('/root/path').relative('relative/file.txt') // -> 'relative/file.txt'
*/
relative(path: string): string;
// Operations
/** Safe file read. Returns null if file doesn't exist or some error occurred. */
tryRead(path: string): Promise<Buffer | null>;
tryRead(path: string, encoding: BufferEncoding): Promise<string | null>;
/** Read file content. Throws an error if something went wrong. */
read(path: string): Promise<Buffer>;
read(path: string, encoding: BufferEncoding): Promise<string>;
/**
* Write file content.
* If the file doesn't exist, it will be created, including all parent directories.
* Otherwise, the file will be overwritten with new content.
*/
write(path: string, content: VfsContentLike): Promise<void>;
/** Rename file or directory. */
rename(from: string, ...to: string[]): Promise<void>;
/**
* Read directory children.
* @param path Path to directory. If not specified, the current directory will be used.
* @param params.withFileTypes If true, returns `VfsDirent[]` instead of `string[]`.
*/
readDir(path?: string): Promise<string[]>;
readDir(params: { withFileTypes: true }): Promise<VfsDirent[]>;
readDir(path: string, params: { withFileTypes: true }): Promise<VfsDirent[]>;
/** Check if a path exists. */
exists(path?: string): Promise<boolean>;
/** Check if a path is a file. */
isFile(path: string): Promise<boolean>;
/** Check if a path is a directory. */
isDir(path: string): Promise<boolean>;
/** Delete file or directory (recursively). */
delete(path: string): Promise<void>;
}
CreateHeadlessVfsParams
typescript
interface CreateHeadlessVfsParams extends CreateDefaultVfsBackendParams {
/** @see @neodx/log */
log?: VfsLogger | VfsLogMethod | 'silent';
/** Pass your own vfs backend. */
backend?: VfsBackend;
/** If not specified, will use `node:fs` backend. */
virtual?: boolean | VirtualInitializer;
/** If true, all operations will be read-only (if you didn't pass your own backend). */
readonly?: boolean;
}
type VfsLogger = Logger<VfsLogMethod>;
type VfsLogMethod = 'debug' | 'info' | 'warn' | 'error';