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
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
|