/// <reference types="node" /> import * as fs from "fs" /** * Synchronously compares given paths. * @param path1 Left file or directory to be compared. * @param path2 Right file or directory to be compared. * @param options Comparison options. */ export function compareSync(path1: string, path2: string, options?: Options): Result /** * Asynchronously compares given paths. * @param path1 Left file or directory to be compared. * @param path2 Right file or directory to be compared. * @param options Comparison options. */ export function compare(path1: string, path2: string, options?: Options): Promise<Result> /** * 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'. */ compareSize?: boolean /** * Compares files by date of modification (stat.mtime). Defaults to 'false'. */ 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 files by content. Defaults to 'false'. */ compareContent?: boolean /** * Compares entries by symlink. Defaults to 'false'. */ compareSymlink?: boolean /** * Skips sub directories. Defaults to 'false'. */ skipSubdirs?: 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 /** * 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 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<Difference> | undefined, reason: Reason | undefined ) => void export interface Entry { name: string absolutePath: string path: string stat: fs.Stats lstat: fs.Stats symlink: boolean } /** * Comparison result. */ export interface Result extends Statistics { /** * List of changes (present if [[Options.noDiffSet]] is false). */ diffSet?: Array<Difference> } 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 } 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 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. */ export type DifferenceState = "equal" | "left" | "right" | "distinct" /** * Type of entry. */ export type DifferenceType = "missing" | "file" | "directory" | "broken-link" /** * Provides reason when two identically named entries are distinct. */ export type Reason = "different-size" | "different-date" | "different-content" | "broken-link" | 'different-symlink' 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(). */ path1?: string /** * Path not including file/directory name; can be relative or absolute depending on call to compare(). */ path2?: string /** * Path relative to root dir. */ relativePath: string /** * Left file/directory name. */ name1?: string /** * Right file/directory name. */ name2?: string /** * See [[DifferenceState]] */ state: DifferenceState /** * Type of left entry. */ type1: DifferenceType /** * Type of right entry. */ type2: DifferenceType /** * Left file size. */ size1?: number /** * Right file size. */ size2?: number /** * Left entry modification date (stat.mtime). */ date1?: number /** * Right entry modification date (stat.mtime). */ date2?: number /** * Depth level relative to root dir. */ level: number /** * See [[Reason]]. * Not available if entries are equal. */ reason?: Reason } /** * Synchronous file content comparison handler. */ export type CompareFileSync = ( path1: string, stat1: fs.Stats, path2: string, stat2: fs.Stats, options: Options ) => boolean /** * Asynchronous file content comparison handler. */ export type CompareFileAsync = ( path1: string, stat1: fs.Stats, path2: string, stat2: fs.Stats, options: Options ) => Promise<boolean> export interface CompareFileHandler { compareSync: CompareFileSync, compareAsync: CompareFileAsync } /** * Available file content comparison handlers. * These handlers are used when [[Options.compareContent]] is set. */ export const fileCompareHandlers: { /** * Default file content comparison handlers, used if [[Options.compareFileAsync]] or [[Options.compareFileSync]] are not specified. * * Performs binary comparison. */ defaultFileCompare: CompareFileHandler, /** * Compares files line by line. * * Options: * * ignoreLineEnding - tru/false (default: false) * * ignoreWhiteSpaces - tru/false (default: false) */ lineBasedFileCompare: CompareFileHandler } /** * 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 name1<name2, 1 if name1>name2. */ export type CompareNameHandler = ( name1: string, name2: string, options: Options ) => 0 | 1 | -1