You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1107 lines
39 KiB
TypeScript

/// <reference types="node" />
/// <reference types="node" />
/// <reference types="node" />
import { LRUCache } from 'lru-cache';
import { posix, win32 } from 'path';
import type { Dirent, Stats } from 'fs';
import { Minipass } from 'minipass';
/**
* An object that will be used to override the default `fs`
* methods. Any methods that are not overridden will use Node's
* built-in implementations.
*
* - lstatSync
* - readdir (callback `withFileTypes` Dirent variant, used for
* readdirCB and most walks)
* - readdirSync
* - readlinkSync
* - realpathSync
* - promises: Object containing the following async methods:
* - lstat
* - readdir (Dirent variant only)
* - readlink
* - realpath
*/
export interface FSOption {
lstatSync?: (path: string) => Stats;
readdir?: (path: string, options: {
withFileTypes: true;
}, cb: (er: NodeJS.ErrnoException | null, entries?: Dirent[]) => any) => void;
readdirSync?: (path: string, options: {
withFileTypes: true;
}) => Dirent[];
readlinkSync?: (path: string) => string;
realpathSync?: (path: string) => string;
promises?: {
lstat?: (path: string) => Promise<Stats>;
readdir?: (path: string, options: {
withFileTypes: true;
}) => Promise<Dirent[]>;
readlink?: (path: string) => Promise<string>;
realpath?: (path: string) => Promise<string>;
[k: string]: any;
};
[k: string]: any;
}
interface FSValue {
lstatSync: (path: string) => Stats;
readdir: (path: string, options: {
withFileTypes: true;
}, cb: (er: NodeJS.ErrnoException | null, entries?: Dirent[]) => any) => void;
readdirSync: (path: string, options: {
withFileTypes: true;
}) => Dirent[];
readlinkSync: (path: string) => string;
realpathSync: (path: string) => string;
promises: {
lstat: (path: string) => Promise<Stats>;
readdir: (path: string, options: {
withFileTypes: true;
}) => Promise<Dirent[]>;
readlink: (path: string) => Promise<string>;
realpath: (path: string) => Promise<string>;
[k: string]: any;
};
[k: string]: any;
}
export type Type = 'Unknown' | 'FIFO' | 'CharacterDevice' | 'Directory' | 'BlockDevice' | 'File' | 'SymbolicLink' | 'Socket';
/**
* Options that may be provided to the Path constructor
*/
export interface PathOpts {
fullpath?: string;
relative?: string;
relativePosix?: string;
parent?: PathBase;
/**
* See {@link FSOption}
*/
fs?: FSOption;
}
/**
* An LRUCache for storing resolved path strings or Path objects.
* @internal
*/
export declare class ResolveCache extends LRUCache<string, string> {
constructor();
}
/**
* an LRUCache for storing child entries.
* @internal
*/
export declare class ChildrenCache extends LRUCache<PathBase, Children> {
constructor(maxSize?: number);
}
/**
* Array of Path objects, plus a marker indicating the first provisional entry
*
* @internal
*/
export type Children = PathBase[] & {
provisional: number;
};
declare const setAsCwd: unique symbol;
/**
* Path objects are sort of like a super-powered
* {@link https://nodejs.org/docs/latest/api/fs.html#class-fsdirent fs.Dirent}
*
* Each one represents a single filesystem entry on disk, which may or may not
* exist. It includes methods for reading various types of information via
* lstat, readlink, and readdir, and caches all information to the greatest
* degree possible.
*
* Note that fs operations that would normally throw will instead return an
* "empty" value. This is in order to prevent excessive overhead from error
* stack traces.
*/
export declare abstract class PathBase implements Dirent {
#private;
/**
* the basename of this path
*
* **Important**: *always* test the path name against any test string
* usingthe {@link isNamed} method, and not by directly comparing this
* string. Otherwise, unicode path strings that the system sees as identical
* will not be properly treated as the same path, leading to incorrect
* behavior and possible security issues.
*/
name: string;
/**
* the Path entry corresponding to the path root.
*
* @internal
*/
root: PathBase;
/**
* All roots found within the current PathScurry family
*
* @internal
*/
roots: {
[k: string]: PathBase;
};
/**
* a reference to the parent path, or undefined in the case of root entries
*
* @internal
*/
parent?: PathBase;
/**
* boolean indicating whether paths are compared case-insensitively
* @internal
*/
nocase: boolean;
/**
* the string or regexp used to split paths. On posix, it is `'/'`, and on
* windows it is a RegExp matching either `'/'` or `'\\'`
*/
abstract splitSep: string | RegExp;
/**
* The path separator string to use when joining paths
*/
abstract sep: string;
get dev(): number | undefined;
get mode(): number | undefined;
get nlink(): number | undefined;
get uid(): number | undefined;
get gid(): number | undefined;
get rdev(): number | undefined;
get blksize(): number | undefined;
get ino(): number | undefined;
get size(): number | undefined;
get blocks(): number | undefined;
get atimeMs(): number | undefined;
get mtimeMs(): number | undefined;
get ctimeMs(): number | undefined;
get birthtimeMs(): number | undefined;
get atime(): Date | undefined;
get mtime(): Date | undefined;
get ctime(): Date | undefined;
get birthtime(): Date | undefined;
/**
* This property is for compatibility with the Dirent class as of
* Node v20, where Dirent['path'] refers to the path of the directory
* that was passed to readdir. So, somewhat counterintuitively, this
* property refers to the *parent* path, not the path object itself.
* For root entries, it's the path to the entry itself.
*/
get path(): string;
/**
* Do not create new Path objects directly. They should always be accessed
* via the PathScurry class or other methods on the Path class.
*
* @internal
*/
constructor(name: string, type: number | undefined, root: PathBase | undefined, roots: {
[k: string]: PathBase;
}, nocase: boolean, children: ChildrenCache, opts: PathOpts);
/**
* Returns the depth of the Path object from its root.
*
* For example, a path at `/foo/bar` would have a depth of 2.
*/
depth(): number;
/**
* @internal
*/
abstract getRootString(path: string): string;
/**
* @internal
*/
abstract getRoot(rootPath: string): PathBase;
/**
* @internal
*/
abstract newChild(name: string, type?: number, opts?: PathOpts): PathBase;
/**
* @internal
*/
childrenCache(): ChildrenCache;
/**
* Get the Path object referenced by the string path, resolved from this Path
*/
resolve(path?: string): PathBase;
/**
* Returns the cached children Path objects, if still available. If they
* have fallen out of the cache, then returns an empty array, and resets the
* READDIR_CALLED bit, so that future calls to readdir() will require an fs
* lookup.
*
* @internal
*/
children(): Children;
/**
* Resolves a path portion and returns or creates the child Path.
*
* Returns `this` if pathPart is `''` or `'.'`, or `parent` if pathPart is
* `'..'`.
*
* This should not be called directly. If `pathPart` contains any path
* separators, it will lead to unsafe undefined behavior.
*
* Use `Path.resolve()` instead.
*
* @internal
*/
child(pathPart: string, opts?: PathOpts): PathBase;
/**
* The relative path from the cwd. If it does not share an ancestor with
* the cwd, then this ends up being equivalent to the fullpath()
*/
relative(): string;
/**
* The relative path from the cwd, using / as the path separator.
* If it does not share an ancestor with
* the cwd, then this ends up being equivalent to the fullpathPosix()
* On posix systems, this is identical to relative().
*/
relativePosix(): string;
/**
* The fully resolved path string for this Path entry
*/
fullpath(): string;
/**
* On platforms other than windows, this is identical to fullpath.
*
* On windows, this is overridden to return the forward-slash form of the
* full UNC path.
*/
fullpathPosix(): string;
/**
* Is the Path of an unknown type?
*
* Note that we might know *something* about it if there has been a previous
* filesystem operation, for example that it does not exist, or is not a
* link, or whether it has child entries.
*/
isUnknown(): boolean;
isType(type: Type): boolean;
getType(): Type;
/**
* Is the Path a regular file?
*/
isFile(): boolean;
/**
* Is the Path a directory?
*/
isDirectory(): boolean;
/**
* Is the path a character device?
*/
isCharacterDevice(): boolean;
/**
* Is the path a block device?
*/
isBlockDevice(): boolean;
/**
* Is the path a FIFO pipe?
*/
isFIFO(): boolean;
/**
* Is the path a socket?
*/
isSocket(): boolean;
/**
* Is the path a symbolic link?
*/
isSymbolicLink(): boolean;
/**
* Return the entry if it has been subject of a successful lstat, or
* undefined otherwise.
*
* Does not read the filesystem, so an undefined result *could* simply
* mean that we haven't called lstat on it.
*/
lstatCached(): PathBase | undefined;
/**
* Return the cached link target if the entry has been the subject of a
* successful readlink, or undefined otherwise.
*
* Does not read the filesystem, so an undefined result *could* just mean we
* don't have any cached data. Only use it if you are very sure that a
* readlink() has been called at some point.
*/
readlinkCached(): PathBase | undefined;
/**
* Returns the cached realpath target if the entry has been the subject
* of a successful realpath, or undefined otherwise.
*
* Does not read the filesystem, so an undefined result *could* just mean we
* don't have any cached data. Only use it if you are very sure that a
* realpath() has been called at some point.
*/
realpathCached(): PathBase | undefined;
/**
* Returns the cached child Path entries array if the entry has been the
* subject of a successful readdir(), or [] otherwise.
*
* Does not read the filesystem, so an empty array *could* just mean we
* don't have any cached data. Only use it if you are very sure that a
* readdir() has been called recently enough to still be valid.
*/
readdirCached(): PathBase[];
/**
* Return true if it's worth trying to readlink. Ie, we don't (yet) have
* any indication that readlink will definitely fail.
*
* Returns false if the path is known to not be a symlink, if a previous
* readlink failed, or if the entry does not exist.
*/
canReadlink(): boolean;
/**
* Return true if readdir has previously been successfully called on this
* path, indicating that cachedReaddir() is likely valid.
*/
calledReaddir(): boolean;
/**
* Returns true if the path is known to not exist. That is, a previous lstat
* or readdir failed to verify its existence when that would have been
* expected, or a parent entry was marked either enoent or enotdir.
*/
isENOENT(): boolean;
/**
* Return true if the path is a match for the given path name. This handles
* case sensitivity and unicode normalization.
*
* Note: even on case-sensitive systems, it is **not** safe to test the
* equality of the `.name` property to determine whether a given pathname
* matches, due to unicode normalization mismatches.
*
* Always use this method instead of testing the `path.name` property
* directly.
*/
isNamed(n: string): boolean;
/**
* Return the Path object corresponding to the target of a symbolic link.
*
* If the Path is not a symbolic link, or if the readlink call fails for any
* reason, `undefined` is returned.
*
* Result is cached, and thus may be outdated if the filesystem is mutated.
*/
readlink(): Promise<PathBase | undefined>;
/**
* Synchronous {@link PathBase.readlink}
*/
readlinkSync(): PathBase | undefined;
/**
* Call lstat() on this Path, and update all known information that can be
* determined.
*
* Note that unlike `fs.lstat()`, the returned value does not contain some
* information, such as `mode`, `dev`, `nlink`, and `ino`. If that
* information is required, you will need to call `fs.lstat` yourself.
*
* If the Path refers to a nonexistent file, or if the lstat call fails for
* any reason, `undefined` is returned. Otherwise the updated Path object is
* returned.
*
* Results are cached, and thus may be out of date if the filesystem is
* mutated.
*/
lstat(): Promise<PathBase | undefined>;
/**
* synchronous {@link PathBase.lstat}
*/
lstatSync(): PathBase | undefined;
/**
* Standard node-style callback interface to get list of directory entries.
*
* If the Path cannot or does not contain any children, then an empty array
* is returned.
*
* Results are cached, and thus may be out of date if the filesystem is
* mutated.
*
* @param cb The callback called with (er, entries). Note that the `er`
* param is somewhat extraneous, as all readdir() errors are handled and
* simply result in an empty set of entries being returned.
* @param allowZalgo Boolean indicating that immediately known results should
* *not* be deferred with `queueMicrotask`. Defaults to `false`. Release
* zalgo at your peril, the dark pony lord is devious and unforgiving.
*/
readdirCB(cb: (er: NodeJS.ErrnoException | null, entries: PathBase[]) => any, allowZalgo?: boolean): void;
/**
* Return an array of known child entries.
*
* If the Path cannot or does not contain any children, then an empty array
* is returned.
*
* Results are cached, and thus may be out of date if the filesystem is
* mutated.
*/
readdir(): Promise<PathBase[]>;
/**
* synchronous {@link PathBase.readdir}
*/
readdirSync(): PathBase[];
canReaddir(): boolean;
shouldWalk(dirs: Set<PathBase | undefined>, walkFilter?: (e: PathBase) => boolean): boolean;
/**
* Return the Path object corresponding to path as resolved
* by realpath(3).
*
* If the realpath call fails for any reason, `undefined` is returned.
*
* Result is cached, and thus may be outdated if the filesystem is mutated.
* On success, returns a Path object.
*/
realpath(): Promise<PathBase | undefined>;
/**
* Synchronous {@link realpath}
*/
realpathSync(): PathBase | undefined;
/**
* Internal method to mark this Path object as the scurry cwd,
* called by {@link PathScurry#chdir}
*
* @internal
*/
[setAsCwd](oldCwd: PathBase): void;
}
/**
* Path class used on win32 systems
*
* Uses `'\\'` as the path separator for returned paths, either `'\\'` or `'/'`
* as the path separator for parsing paths.
*/
export declare class PathWin32 extends PathBase {
/**
* Separator for generating path strings.
*/
sep: '\\';
/**
* Separator for parsing path strings.
*/
splitSep: RegExp;
/**
* Do not create new Path objects directly. They should always be accessed
* via the PathScurry class or other methods on the Path class.
*
* @internal
*/
constructor(name: string, type: number | undefined, root: PathBase | undefined, roots: {
[k: string]: PathBase;
}, nocase: boolean, children: ChildrenCache, opts: PathOpts);
/**
* @internal
*/
newChild(name: string, type?: number, opts?: PathOpts): PathWin32;
/**
* @internal
*/
getRootString(path: string): string;
/**
* @internal
*/
getRoot(rootPath: string): PathBase;
/**
* @internal
*/
sameRoot(rootPath: string, compare?: string): boolean;
}
/**
* Path class used on all posix systems.
*
* Uses `'/'` as the path separator.
*/
export declare class PathPosix extends PathBase {
/**
* separator for parsing path strings
*/
splitSep: '/';
/**
* separator for generating path strings
*/
sep: '/';
/**
* Do not create new Path objects directly. They should always be accessed
* via the PathScurry class or other methods on the Path class.
*
* @internal
*/
constructor(name: string, type: number | undefined, root: PathBase | undefined, roots: {
[k: string]: PathBase;
}, nocase: boolean, children: ChildrenCache, opts: PathOpts);
/**
* @internal
*/
getRootString(path: string): string;
/**
* @internal
*/
getRoot(_rootPath: string): PathBase;
/**
* @internal
*/
newChild(name: string, type?: number, opts?: PathOpts): PathPosix;
}
/**
* Options that may be provided to the PathScurry constructor
*/
export interface PathScurryOpts {
/**
* perform case-insensitive path matching. Default based on platform
* subclass.
*/
nocase?: boolean;
/**
* Number of Path entries to keep in the cache of Path child references.
*
* Setting this higher than 65536 will dramatically increase the data
* consumption and construction time overhead of each PathScurry.
*
* Setting this value to 256 or lower will significantly reduce the data
* consumption and construction time overhead, but may also reduce resolve()
* and readdir() performance on large filesystems.
*
* Default `16384`.
*/
childrenCacheSize?: number;
/**
* An object that overrides the built-in functions from the fs and
* fs/promises modules.
*
* See {@link FSOption}
*/
fs?: FSOption;
}
/**
* The base class for all PathScurry classes, providing the interface for path
* resolution and filesystem operations.
*
* Typically, you should *not* instantiate this class directly, but rather one
* of the platform-specific classes, or the exported {@link PathScurry} which
* defaults to the current platform.
*/
export declare abstract class PathScurryBase {
#private;
/**
* The root Path entry for the current working directory of this Scurry
*/
root: PathBase;
/**
* The string path for the root of this Scurry's current working directory
*/
rootPath: string;
/**
* A collection of all roots encountered, referenced by rootPath
*/
roots: {
[k: string]: PathBase;
};
/**
* The Path entry corresponding to this PathScurry's current working directory.
*/
cwd: PathBase;
/**
* Perform path comparisons case-insensitively.
*
* Defaults true on Darwin and Windows systems, false elsewhere.
*/
nocase: boolean;
/**
* The path separator used for parsing paths
*
* `'/'` on Posix systems, either `'/'` or `'\\'` on Windows
*/
abstract sep: string | RegExp;
/**
* This class should not be instantiated directly.
*
* Use PathScurryWin32, PathScurryDarwin, PathScurryPosix, or PathScurry
*
* @internal
*/
constructor(cwd: string | URL | undefined, pathImpl: typeof win32 | typeof posix, sep: string | RegExp, { nocase, childrenCacheSize, fs, }?: PathScurryOpts);
/**
* Get the depth of a provided path, string, or the cwd
*/
depth(path?: Path | string): number;
/**
* Parse the root portion of a path string
*
* @internal
*/
abstract parseRootPath(dir: string): string;
/**
* create a new Path to use as root during construction.
*
* @internal
*/
abstract newRoot(fs: FSValue): PathBase;
/**
* Determine whether a given path string is absolute
*/
abstract isAbsolute(p: string): boolean;
/**
* Return the cache of child entries. Exposed so subclasses can create
* child Path objects in a platform-specific way.
*
* @internal
*/
childrenCache(): ChildrenCache;
/**
* Resolve one or more path strings to a resolved string
*
* Same interface as require('path').resolve.
*
* Much faster than path.resolve() when called multiple times for the same
* path, because the resolved Path objects are cached. Much slower
* otherwise.
*/
resolve(...paths: string[]): string;
/**
* Resolve one or more path strings to a resolved string, returning
* the posix path. Identical to .resolve() on posix systems, but on
* windows will return a forward-slash separated UNC path.
*
* Same interface as require('path').resolve.
*
* Much faster than path.resolve() when called multiple times for the same
* path, because the resolved Path objects are cached. Much slower
* otherwise.
*/
resolvePosix(...paths: string[]): string;
/**
* find the relative path from the cwd to the supplied path string or entry
*/
relative(entry?: PathBase | string): string;
/**
* find the relative path from the cwd to the supplied path string or
* entry, using / as the path delimiter, even on Windows.
*/
relativePosix(entry?: PathBase | string): string;
/**
* Return the basename for the provided string or Path object
*/
basename(entry?: PathBase | string): string;
/**
* Return the dirname for the provided string or Path object
*/
dirname(entry?: PathBase | string): string;
/**
* Return an array of known child entries.
*
* First argument may be either a string, or a Path object.
*
* If the Path cannot or does not contain any children, then an empty array
* is returned.
*
* Results are cached, and thus may be out of date if the filesystem is
* mutated.
*
* Unlike `fs.readdir()`, the `withFileTypes` option defaults to `true`. Set
* `{ withFileTypes: false }` to return strings.
*/
readdir(): Promise<PathBase[]>;
readdir(opts: {
withFileTypes: true;
}): Promise<PathBase[]>;
readdir(opts: {
withFileTypes: false;
}): Promise<string[]>;
readdir(opts: {
withFileTypes: boolean;
}): Promise<PathBase[] | string[]>;
readdir(entry: PathBase | string): Promise<PathBase[]>;
readdir(entry: PathBase | string, opts: {
withFileTypes: true;
}): Promise<PathBase[]>;
readdir(entry: PathBase | string, opts: {
withFileTypes: false;
}): Promise<string[]>;
readdir(entry: PathBase | string, opts: {
withFileTypes: boolean;
}): Promise<PathBase[] | string[]>;
/**
* synchronous {@link PathScurryBase.readdir}
*/
readdirSync(): PathBase[];
readdirSync(opts: {
withFileTypes: true;
}): PathBase[];
readdirSync(opts: {
withFileTypes: false;
}): string[];
readdirSync(opts: {
withFileTypes: boolean;
}): PathBase[] | string[];
readdirSync(entry: PathBase | string): PathBase[];
readdirSync(entry: PathBase | string, opts: {
withFileTypes: true;
}): PathBase[];
readdirSync(entry: PathBase | string, opts: {
withFileTypes: false;
}): string[];
readdirSync(entry: PathBase | string, opts: {
withFileTypes: boolean;
}): PathBase[] | string[];
/**
* Call lstat() on the string or Path object, and update all known
* information that can be determined.
*
* Note that unlike `fs.lstat()`, the returned value does not contain some
* information, such as `mode`, `dev`, `nlink`, and `ino`. If that
* information is required, you will need to call `fs.lstat` yourself.
*
* If the Path refers to a nonexistent file, or if the lstat call fails for
* any reason, `undefined` is returned. Otherwise the updated Path object is
* returned.
*
* Results are cached, and thus may be out of date if the filesystem is
* mutated.
*/
lstat(entry?: string | PathBase): Promise<PathBase | undefined>;
/**
* synchronous {@link PathScurryBase.lstat}
*/
lstatSync(entry?: string | PathBase): PathBase | undefined;
/**
* Return the Path object or string path corresponding to the target of a
* symbolic link.
*
* If the path is not a symbolic link, or if the readlink call fails for any
* reason, `undefined` is returned.
*
* Result is cached, and thus may be outdated if the filesystem is mutated.
*
* `{withFileTypes}` option defaults to `false`.
*
* On success, returns a Path object if `withFileTypes` option is true,
* otherwise a string.
*/
readlink(): Promise<string | undefined>;
readlink(opt: {
withFileTypes: false;
}): Promise<string | undefined>;
readlink(opt: {
withFileTypes: true;
}): Promise<PathBase | undefined>;
readlink(opt: {
withFileTypes: boolean;
}): Promise<PathBase | string | undefined>;
readlink(entry: string | PathBase, opt?: {
withFileTypes: false;
}): Promise<string | undefined>;
readlink(entry: string | PathBase, opt: {
withFileTypes: true;
}): Promise<PathBase | undefined>;
readlink(entry: string | PathBase, opt: {
withFileTypes: boolean;
}): Promise<string | PathBase | undefined>;
/**
* synchronous {@link PathScurryBase.readlink}
*/
readlinkSync(): string | undefined;
readlinkSync(opt: {
withFileTypes: false;
}): string | undefined;
readlinkSync(opt: {
withFileTypes: true;
}): PathBase | undefined;
readlinkSync(opt: {
withFileTypes: boolean;
}): PathBase | string | undefined;
readlinkSync(entry: string | PathBase, opt?: {
withFileTypes: false;
}): string | undefined;
readlinkSync(entry: string | PathBase, opt: {
withFileTypes: true;
}): PathBase | undefined;
readlinkSync(entry: string | PathBase, opt: {
withFileTypes: boolean;
}): string | PathBase | undefined;
/**
* Return the Path object or string path corresponding to path as resolved
* by realpath(3).
*
* If the realpath call fails for any reason, `undefined` is returned.
*
* Result is cached, and thus may be outdated if the filesystem is mutated.
*
* `{withFileTypes}` option defaults to `false`.
*
* On success, returns a Path object if `withFileTypes` option is true,
* otherwise a string.
*/
realpath(): Promise<string | undefined>;
realpath(opt: {
withFileTypes: false;
}): Promise<string | undefined>;
realpath(opt: {
withFileTypes: true;
}): Promise<PathBase | undefined>;
realpath(opt: {
withFileTypes: boolean;
}): Promise<PathBase | string | undefined>;
realpath(entry: string | PathBase, opt?: {
withFileTypes: false;
}): Promise<string | undefined>;
realpath(entry: string | PathBase, opt: {
withFileTypes: true;
}): Promise<PathBase | undefined>;
realpath(entry: string | PathBase, opt: {
withFileTypes: boolean;
}): Promise<string | PathBase | undefined>;
realpathSync(): string | undefined;
realpathSync(opt: {
withFileTypes: false;
}): string | undefined;
realpathSync(opt: {
withFileTypes: true;
}): PathBase | undefined;
realpathSync(opt: {
withFileTypes: boolean;
}): PathBase | string | undefined;
realpathSync(entry: string | PathBase, opt?: {
withFileTypes: false;
}): string | undefined;
realpathSync(entry: string | PathBase, opt: {
withFileTypes: true;
}): PathBase | undefined;
realpathSync(entry: string | PathBase, opt: {
withFileTypes: boolean;
}): string | PathBase | undefined;
/**
* Asynchronously walk the directory tree, returning an array of
* all path strings or Path objects found.
*
* Note that this will be extremely memory-hungry on large filesystems.
* In such cases, it may be better to use the stream or async iterator
* walk implementation.
*/
walk(): Promise<PathBase[]>;
walk(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Promise<PathBase[]>;
walk(opts: WalkOptionsWithFileTypesFalse): Promise<string[]>;
walk(opts: WalkOptions): Promise<string[] | PathBase[]>;
walk(entry: string | PathBase): Promise<PathBase[]>;
walk(entry: string | PathBase, opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Promise<PathBase[]>;
walk(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Promise<string[]>;
walk(entry: string | PathBase, opts: WalkOptions): Promise<PathBase[] | string[]>;
/**
* Synchronously walk the directory tree, returning an array of
* all path strings or Path objects found.
*
* Note that this will be extremely memory-hungry on large filesystems.
* In such cases, it may be better to use the stream or async iterator
* walk implementation.
*/
walkSync(): PathBase[];
walkSync(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): PathBase[];
walkSync(opts: WalkOptionsWithFileTypesFalse): string[];
walkSync(opts: WalkOptions): string[] | PathBase[];
walkSync(entry: string | PathBase): PathBase[];
walkSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue): PathBase[];
walkSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): string[];
walkSync(entry: string | PathBase, opts: WalkOptions): PathBase[] | string[];
/**
* Support for `for await`
*
* Alias for {@link PathScurryBase.iterate}
*
* Note: As of Node 19, this is very slow, compared to other methods of
* walking. Consider using {@link PathScurryBase.stream} if memory overhead
* and backpressure are concerns, or {@link PathScurryBase.walk} if not.
*/
[Symbol.asyncIterator](): AsyncGenerator<PathBase, void, void>;
/**
* Async generator form of {@link PathScurryBase.walk}
*
* Note: As of Node 19, this is very slow, compared to other methods of
* walking, especially if most/all of the directory tree has been previously
* walked. Consider using {@link PathScurryBase.stream} if memory overhead
* and backpressure are concerns, or {@link PathScurryBase.walk} if not.
*/
iterate(): AsyncGenerator<PathBase, void, void>;
iterate(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): AsyncGenerator<PathBase, void, void>;
iterate(opts: WalkOptionsWithFileTypesFalse): AsyncGenerator<string, void, void>;
iterate(opts: WalkOptions): AsyncGenerator<string | PathBase, void, void>;
iterate(entry: string | PathBase): AsyncGenerator<PathBase, void, void>;
iterate(entry: string | PathBase, opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): AsyncGenerator<PathBase, void, void>;
iterate(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): AsyncGenerator<string, void, void>;
iterate(entry: string | PathBase, opts: WalkOptions): AsyncGenerator<PathBase | string, void, void>;
/**
* Iterating over a PathScurry performs a synchronous walk.
*
* Alias for {@link PathScurryBase.iterateSync}
*/
[Symbol.iterator](): Generator<PathBase, void, void>;
iterateSync(): Generator<PathBase, void, void>;
iterateSync(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Generator<PathBase, void, void>;
iterateSync(opts: WalkOptionsWithFileTypesFalse): Generator<string, void, void>;
iterateSync(opts: WalkOptions): Generator<string | PathBase, void, void>;
iterateSync(entry: string | PathBase): Generator<PathBase, void, void>;
iterateSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Generator<PathBase, void, void>;
iterateSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Generator<string, void, void>;
iterateSync(entry: string | PathBase, opts: WalkOptions): Generator<PathBase | string, void, void>;
/**
* Stream form of {@link PathScurryBase.walk}
*
* Returns a Minipass stream that emits {@link PathBase} objects by default,
* or strings if `{ withFileTypes: false }` is set in the options.
*/
stream(): Minipass<PathBase>;
stream(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Minipass<PathBase>;
stream(opts: WalkOptionsWithFileTypesFalse): Minipass<string>;
stream(opts: WalkOptions): Minipass<string | PathBase>;
stream(entry: string | PathBase): Minipass<PathBase>;
stream(entry: string | PathBase, opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue): Minipass<PathBase>;
stream(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Minipass<string>;
stream(entry: string | PathBase, opts: WalkOptions): Minipass<string> | Minipass<PathBase>;
/**
* Synchronous form of {@link PathScurryBase.stream}
*
* Returns a Minipass stream that emits {@link PathBase} objects by default,
* or strings if `{ withFileTypes: false }` is set in the options.
*
* Will complete the walk in a single tick if the stream is consumed fully.
* Otherwise, will pause as needed for stream backpressure.
*/
streamSync(): Minipass<PathBase>;
streamSync(opts: WalkOptionsWithFileTypesTrue | WalkOptionsWithFileTypesUnset): Minipass<PathBase>;
streamSync(opts: WalkOptionsWithFileTypesFalse): Minipass<string>;
streamSync(opts: WalkOptions): Minipass<string | PathBase>;
streamSync(entry: string | PathBase): Minipass<PathBase>;
streamSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesUnset | WalkOptionsWithFileTypesTrue): Minipass<PathBase>;
streamSync(entry: string | PathBase, opts: WalkOptionsWithFileTypesFalse): Minipass<string>;
streamSync(entry: string | PathBase, opts: WalkOptions): Minipass<string> | Minipass<PathBase>;
chdir(path?: string | Path): void;
}
/**
* Options provided to all walk methods.
*/
export interface WalkOptions {
/**
* Return results as {@link PathBase} objects rather than strings.
* When set to false, results are fully resolved paths, as returned by
* {@link PathBase.fullpath}.
* @default true
*/
withFileTypes?: boolean;
/**
* Attempt to read directory entries from symbolic links. Otherwise, only
* actual directories are traversed. Regardless of this setting, a given
* target path will only ever be walked once, meaning that a symbolic link
* to a previously traversed directory will never be followed.
*
* Setting this imposes a slight performance penalty, because `readlink`
* must be called on all symbolic links encountered, in order to avoid
* infinite cycles.
* @default false
*/
follow?: boolean;
/**
* Only return entries where the provided function returns true.
*
* This will not prevent directories from being traversed, even if they do
* not pass the filter, though it will prevent directories themselves from
* being included in the result set. See {@link walkFilter}
*
* Asynchronous functions are not supported here.
*
* By default, if no filter is provided, all entries and traversed
* directories are included.
*/
filter?: (entry: PathBase) => boolean;
/**
* Only traverse directories (and in the case of {@link follow} being set to
* true, symbolic links to directories) if the provided function returns
* true.
*
* This will not prevent directories from being included in the result set,
* even if they do not pass the supplied filter function. See {@link filter}
* to do that.
*
* Asynchronous functions are not supported here.
*/
walkFilter?: (entry: PathBase) => boolean;
}
export type WalkOptionsWithFileTypesUnset = WalkOptions & {
withFileTypes?: undefined;
};
export type WalkOptionsWithFileTypesTrue = WalkOptions & {
withFileTypes: true;
};
export type WalkOptionsWithFileTypesFalse = WalkOptions & {
withFileTypes: false;
};
/**
* Windows implementation of {@link PathScurryBase}
*
* Defaults to case insensitve, uses `'\\'` to generate path strings. Uses
* {@link PathWin32} for Path objects.
*/
export declare class PathScurryWin32 extends PathScurryBase {
/**
* separator for generating path strings
*/
sep: '\\';
constructor(cwd?: URL | string, opts?: PathScurryOpts);
/**
* @internal
*/
parseRootPath(dir: string): string;
/**
* @internal
*/
newRoot(fs: FSValue): PathWin32;
/**
* Return true if the provided path string is an absolute path
*/
isAbsolute(p: string): boolean;
}
/**
* {@link PathScurryBase} implementation for all posix systems other than Darwin.
*
* Defaults to case-sensitive matching, uses `'/'` to generate path strings.
*
* Uses {@link PathPosix} for Path objects.
*/
export declare class PathScurryPosix extends PathScurryBase {
/**
* separator for generating path strings
*/
sep: '/';
constructor(cwd?: URL | string, opts?: PathScurryOpts);
/**
* @internal
*/
parseRootPath(_dir: string): string;
/**
* @internal
*/
newRoot(fs: FSValue): PathPosix;
/**
* Return true if the provided path string is an absolute path
*/
isAbsolute(p: string): boolean;
}
/**
* {@link PathScurryBase} implementation for Darwin (macOS) systems.
*
* Defaults to case-insensitive matching, uses `'/'` for generating path
* strings.
*
* Uses {@link PathPosix} for Path objects.
*/
export declare class PathScurryDarwin extends PathScurryPosix {
constructor(cwd?: URL | string, opts?: PathScurryOpts);
}
/**
* Default {@link PathBase} implementation for the current platform.
*
* {@link PathWin32} on Windows systems, {@link PathPosix} on all others.
*/
export declare const Path: typeof PathWin32 | typeof PathPosix;
export type Path = PathBase | InstanceType<typeof Path>;
/**
* Default {@link PathScurryBase} implementation for the current platform.
*
* {@link PathScurryWin32} on Windows systems, {@link PathScurryDarwin} on
* Darwin (macOS) systems, {@link PathScurryPosix} on all others.
*/
export declare const PathScurry: typeof PathScurryWin32 | typeof PathScurryDarwin | typeof PathScurryPosix;
export type PathScurry = PathScurryBase | InstanceType<typeof PathScurry>;
export {};
//# sourceMappingURL=index.d.ts.map