///
import * as fs from "fs";
/**
* Comparison options.
*/
export interface Options {
/**
* Properties to be used in various extension points ie. result builder.
*/
[key: string]: any;
/**
* Compares files by size. Defaults to 'false'.
*
* Usually one of `compareSize` or `compareContent` options has to be activated. Otherwise files are compared by name disregarding size or content.
*/
compareSize?: boolean;
/**
* Compares files by content. Defaults to 'false'.
*
* Usually one of `compareSize` or `compareContent` options has to be activated. Otherwise files are compared by name disregarding size or content.
*/
compareContent?: boolean;
/**
* Compares files by date of modification (stat.mtime). Defaults to 'false'.
*
* Also see [[Options.dateTolerance]].
*/
compareDate?: boolean;
/**
* Two files are considered to have the same date if the difference between their modification dates fits within date tolerance. Defaults to 1000 ms.
*/
dateTolerance?: number;
/**
* Compares entries by symlink. Defaults to 'false'.
* If this option is enabled two entries must have the same type in order to be considered equal.
* They have to be either two fies, two directories or two symlinks.
*
* If left entry is a file and right entry is a symlink, they are considered distinct disregarding the content of the file.
*
* Further if both entries are symlinks they need to have the same link value. For example if one symlink points to '/x/b.txt' and the other to '/x/../x/b.txt' the symlinks are considered distinct even if they point to the same file.
*/
compareSymlink?: boolean;
/**
* Skips sub directories. Defaults to 'false'.
*/
skipSubdirs?: boolean;
/**
* Ignore empty directories. Defaults to 'false'.
*/
skipEmptyDirs?: boolean;
/**
* Ignore symbolic links. Defaults to 'false'.
*/
skipSymlinks?: boolean;
/**
* Ignores case when comparing names. Defaults to 'false'.
*/
ignoreCase?: boolean;
/**
* Toggles presence of diffSet in output. If true, only statistics are provided. Use this when comparing large number of files to avoid out of memory situations. Defaults to 'false'.
*/
noDiffSet?: boolean;
/**
* File name filter. Comma separated minimatch patterns. See [Glob patterns](https://github.com/gliviu/dir-compare#glob-patterns).
*/
includeFilter?: string;
/**
* File/directory name exclude filter. Comma separated minimatch patterns. See [Glob patterns](https://github.com/gliviu/dir-compare#glob-patterns)
*/
excludeFilter?: string;
/**
* Handle permission denied errors. Defaults to 'false'.
*
* By default when some entry cannot be read due to `EACCES` error the comparison will
* stop immediately with an exception.
*
* If `handlePermissionDenied` is set to true the comparison will continue when unreadable entries are encountered.
*
* Offending entries will be reported within [[Difference.permissionDeniedState]], [[Difference.reason]] and [[Result.permissionDenied]].
*
* Lets consider we want to compare two identical folders `A` and `B` with `B/dir2` being unreadable for the current user.
* ```
* A B
* ├── dir1 ├── dir1
* ├──── file1 ├──── file1
* ├── dir2 ├── dir2 (permission denied)
* └─────file2 └─────file2
* ```
*
* [[Result.diffSet]] will look like:
*
* |relativePath |path1 |path2 | state |reason |permissionDeniedState|
* |--------------|---------|---------|------------|------------------------|---------------------|
* |[/] |dir1 |dir1 |`equal` | | |
* |[/dir1] |file1 |file1 |`equal` | | |
* |[/] |dir2 |dir2 |`distinct` | `permission-denied` |`access-error-right` |
* |[/dir2] |file2 |missing |`left` | | |
*
* And [[Result.permissionDenied]] statistics look like - left: 0, right: 1, distinct: 0, total: 1
*
*/
handlePermissionDenied?: boolean;
/**
* Callback for constructing result. Called for each compared entry pair.
*
* Updates 'statistics' and 'diffSet'.
*
* See [Custom result builder](https://github.com/gliviu/dir-compare#custom-result-builder).
*/
resultBuilder?: ResultBuilder;
/**
* File comparison handler. See [Custom file comparators](https://github.com/gliviu/dir-compare#custom-file-content-comparators).
*/
compareFileSync?: CompareFileSync;
/**
* File comparison handler. See [Custom file comparators](https://github.com/gliviu/dir-compare#custom-file-content-comparators).
*/
compareFileAsync?: CompareFileAsync;
/**
* Entry name comparison handler. See [Custom name comparators](https://github.com/gliviu/dir-compare#custom-name-comparators).
*/
compareNameHandler?: CompareNameHandler;
}
/**
* Callback for constructing result. Called for each compared entry pair.
*
* Updates 'statistics' and 'diffSet'.
*/
export declare type ResultBuilder =
/**
* @param entry1 Left entry.
* @param entry2 Right entry.
* @param state See [[DifferenceState]].
* @param level Depth level relative to root dir.
* @param relativePath Path relative to root dir.
* @param statistics Statistics to be updated.
* @param diffSet Status per each entry to be appended.
* Do not append if [[Options.noDiffSet]] is false.
* @param reason See [[Reason]]. Not available if entries are equal.
*/
(entry1: Entry | undefined, entry2: Entry | undefined, state: DifferenceState, level: number, relativePath: string, options: Options, statistics: Statistics, diffSet: Array | undefined, reason: Reason | undefined) => void;
export interface Entry {
name: string;
absolutePath: string;
path: string;
stat: fs.Stats;
lstat: fs.Stats;
symlink: boolean;
/**
* True when this entry is not readable.
* This value is set only when [[Options.handlePermissionDenied]] is enabled.
*/
isPermissionDenied: boolean;
}
/**
* Comparison result.
*/
export interface Result extends Statistics {
/**
* List of changes (present if [[Options.noDiffSet]] is false).
*/
diffSet?: Array;
}
export interface Statistics {
/**
* Any property is allowed if default result builder is not used.
*/
[key: string]: any;
/**
* True if directories are identical.
*/
same: boolean;
/**
* Number of distinct entries.
*/
distinct: number;
/**
* Number of equal entries.
*/
equal: number;
/**
* Number of entries only in path1.
*/
left: number;
/**
* Number of entries only in path2.
*/
right: number;
/**
* Total number of differences (distinct+left+right).
*/
differences: number;
/**
* Total number of entries (differences+equal).
*/
total: number;
/**
* Number of distinct files.
*/
distinctFiles: number;
/**
* Number of equal files.
*/
equalFiles: number;
/**
* Number of files only in path1.
*/
leftFiles: number;
/**
* Number of files only in path2
*/
rightFiles: number;
/**
* Total number of different files (distinctFiles+leftFiles+rightFiles).
*/
differencesFiles: number;
/**
* Total number of files (differencesFiles+equalFiles).
*/
totalFiles: number;
/**
* Number of distinct directories.
*/
distinctDirs: number;
/**
* Number of equal directories.
*/
equalDirs: number;
/**
* Number of directories only in path1.
*/
leftDirs: number;
/**
* Number of directories only in path2.
*/
rightDirs: number;
/**
* Total number of different directories (distinctDirs+leftDirs+rightDirs).
*/
differencesDirs: number;
/**
* Total number of directories (differencesDirs+equalDirs).
*/
totalDirs: number;
/**
* Stats about broken links.
*/
brokenLinks: BrokenLinksStatistics;
/**
* Statistics available if 'compareSymlink' options is used.
*/
symlinks?: SymlinkStatistics;
/**
* Stats about entries that could not be accessed.
*/
permissionDenied: PermissionDeniedStatistics;
}
export interface BrokenLinksStatistics {
/**
* Number of broken links only in path1
*/
leftBrokenLinks: number;
/**
* Number of broken links only in path2
*/
rightBrokenLinks: number;
/**
* Number of broken links with same name appearing in both path1 and path2 (leftBrokenLinks + rightBrokenLinks + distinctBrokenLinks)
*/
distinctBrokenLinks: number;
/**
* Total number of broken links
*/
totalBrokenLinks: number;
}
export interface PermissionDeniedStatistics {
/**
* Number of forbidden entries found only in path1
*/
leftPermissionDenied: number;
/**
* Number of forbidden entries found only in path2
*/
rightPermissionDenied: number;
/**
* Number of forbidden entries with same name appearing in both path1 and path2 (leftPermissionDenied + rightPermissionDenied + distinctPermissionDenied)
*/
distinctPermissionDenied: number;
/**
* Total number of forbidden entries
*/
totalPermissionDenied: number;
}
export interface SymlinkStatistics {
/**
* Number of distinct links.
*/
distinctSymlinks: number;
/**
* Number of equal links.
*/
equalSymlinks: number;
/**
* Number of links only in path1.
*/
leftSymlinks: number;
/**
* Number of links only in path2
*/
rightSymlinks: number;
/**
* Total number of different links (distinctSymlinks+leftSymlinks+rightSymlinks).
*/
differencesSymlinks: number;
/**
* Total number of links (differencesSymlinks+equalSymlinks).
*/
totalSymlinks: number;
}
/**
* State of left/right entries relative to each other.
* * `equal` - Identical entries are found in both left/right dirs.
* * `left` - Entry is found only in left dir.
* * `right` - Entry is found only in right dir.
* * `distinct` - Entries exist in both left/right dir but have different content. See [[Difference.reason]] to understan why entries are considered distinct.
*/
export declare type DifferenceState = "equal" | "left" | "right" | "distinct";
/**
* Permission related state of left/right entries. Available only when [[Options.handlePermissionDenied]] is enabled.
* * `access-ok` - Both entries are accessible.
* * `access-error-both` - Neither entry can be accessed.
* * `access-error-left` - Left entry cannot be accessed.
* * `access-error-right` - Right entry cannot be accessed.
*/
export declare type PermissionDeniedState = "access-ok" | "access-error-both" | "access-error-left" | "access-error-right";
/**
* Type of entry.
*/
export declare type DifferenceType = "missing" | "file" | "directory" | "broken-link";
/**
* Provides reason when two identically named entries are distinct.
*
* Not available if entries are equal.
*
* * `different-size` - Files differ in size.
* * `different-date - Entry dates are different. Used when [[Options.compareDate]] is `true`.
* * `different-content` - File contents are different. Used when [[Options.compareContent]] is `true`.
* * `broken-link` - Both left/right entries are broken links.
* * `different-symlink` - Symlinks are different. See [[Options.compareSymlink]] for details.
* * `permission-denied` - One or both left/right entries are not accessible. See [[Options.handlePermissionDenied]] for details.
*/
export declare type Reason = undefined | "different-size" | "different-date" | "different-content" | "broken-link" | 'different-symlink' | 'permission-denied';
export interface Difference {
/**
* Any property is allowed if default result builder is not used.
*/
[key: string]: any;
/**
* Path not including file/directory name; can be relative or absolute depending on call to compare().
* Is undefined if missing on the left side.
*/
path1?: string;
/**
* Path not including file/directory name; can be relative or absolute depending on call to compare().
* Is undefined if missing on the right side.
*/
path2?: string;
/**
* Path relative to root dir.
*/
relativePath: string;
/**
* Left file/directory name.
* Is undefined if missing on the left side.
*/
name1?: string;
/**
* Right file/directory name.
* Is undefined if missing on the right side.
*/
name2?: string;
/**
* See [[DifferenceState]]
*/
state: DifferenceState;
/**
* Permission related state of left/right entries.
*/
permissionDeniedState: PermissionDeniedState;
/**
* Type of left entry.
* Is undefined if missing on the left side.
*/
type1: DifferenceType;
/**
* Type of right entry.
* Is undefined if missing on the right side.
*/
type2: DifferenceType;
/**
* Left file size.
* Is undefined if missing on the left side.
*/
size1?: number;
/**
* Right file size.
* Is undefined if missing on the right side.
*/
size2?: number;
/**
* Left entry modification date (stat.mtime).
* Is undefined if missing on the left side.
*/
date1?: number;
/**
* Right entry modification date (stat.mtime).
* Is undefined if missing on the right side.
*/
date2?: number;
/**
* Depth level relative to root dir.
*/
level: number;
/**
* Provides reason when two identically named entries are distinct.
*/
reason: Reason;
}
/**
* Synchronous file content comparison handler.
*/
export declare type CompareFileSync = (path1: string, stat1: fs.Stats, path2: string, stat2: fs.Stats, options: Options) => boolean;
/**
* Asynchronous file content comparison handler.
*/
export declare type CompareFileAsync = (path1: string, stat1: fs.Stats, path2: string, stat2: fs.Stats, options: Options) => Promise;
export interface CompareFileHandler {
compareSync: CompareFileSync;
compareAsync: CompareFileAsync;
}
/**
* Compares the names of two entries.
* The comparison should be dependent on received options (ie. case sensitive, ...).
* Returns 0 if names are identical, -1 if name1name2.
*/
export declare type CompareNameHandler = (name1: string, name2: string, options: Options) => 0 | 1 | -1;
//# sourceMappingURL=types.d.ts.map