{"id":13526908,"url":"https://github.com/gliviu/dir-compare","last_synced_at":"2026-01-23T19:39:58.917Z","repository":{"id":24883254,"uuid":"28299302","full_name":"gliviu/dir-compare","owner":"gliviu","description":"Node JS directory compare","archived":false,"fork":false,"pushed_at":"2024-09-05T01:08:34.000Z","size":876,"stargazers_count":185,"open_issues_count":8,"forks_count":12,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-08-09T04:38:48.866Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/dir-compare","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gliviu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2014-12-21T12:45:12.000Z","updated_at":"2025-08-07T18:52:35.000Z","dependencies_parsed_at":"2024-05-04T20:25:31.778Z","dependency_job_id":"e6971595-71fc-4846-b65a-066f67b08af6","html_url":"https://github.com/gliviu/dir-compare","commit_stats":{"total_commits":212,"total_committers":6,"mean_commits":"35.333333333333336","dds":0.03301886792452835,"last_synced_commit":"5473f4aa4f79d0d4689d2c52bdb0e0fbc677350f"},"previous_names":[],"tags_count":36,"template":false,"template_full_name":null,"purl":"pkg:github/gliviu/dir-compare","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gliviu%2Fdir-compare","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gliviu%2Fdir-compare/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gliviu%2Fdir-compare/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gliviu%2Fdir-compare/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gliviu","download_url":"https://codeload.github.com/gliviu/dir-compare/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gliviu%2Fdir-compare/sbom","scorecard":{"id":429916,"data":{"date":"2025-08-11","repo":{"name":"github.com/gliviu/dir-compare","commit":"5473f4aa4f79d0d4689d2c52bdb0e0fbc677350f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.3,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: npmCommand not pinned by hash: test/extended/gitignoreSupport/init.sh:8","Warn: npmCommand not pinned by hash: test/run.sh:32","Info:   0 out of   2 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":4,"reason":"6 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-pq67-2wwv-3xjx","Warn: Project is vulnerable to: GHSA-8cj5-5rvv-wf4v"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-19T03:05:41.708Z","repository_id":24883254,"created_at":"2025-08-19T03:05:41.708Z","updated_at":"2025-08-19T03:05:41.708Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28699113,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T17:25:48.045Z","status":"ssl_error","status_checked_at":"2026-01-23T17:25:47.153Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-01T06:01:37.248Z","updated_at":"2026-01-23T19:39:58.896Z","avatar_url":"https://github.com/gliviu.png","language":"TypeScript","readme":"dir-compare\n==========\nNode JS directory compare\n\n**Starting with v3.0.0 the CLI utility moved to [dir-compare-cli](https://www.npmjs.com/package/dir-compare-cli).**\n\n[![Build status](https://ci.appveyor.com/api/projects/status/fpnqkr2gfg7pwkxk/branch/master?svg=true)](https://ci.appveyor.com/project/gliviu/dir-compare)\n[![codecov.io](http://codecov.io/github/gliviu/dir-compare/coverage.svg?branch=master)](http://codecov.io/github/gliviu/dir-compare?branch=master)\n\n- [Installation](#installation)\n- [Library](#library)\n  * [Use](#use)\n  * [Api](#api)\n  * [Glob patterns](#glob-patterns)\n  * [Symbolic links](#symbolic-links)\n  * [Handling permission denied errors](#handling-permission-denied-errors)\n- [Extension points](#extension-points)\n  * [File content comparators](#file-content-comparators)\n    + [Ignore line endings and white spaces](#ignore-line-endings-and-white-spaces)\n  * [Glob filter](#glob-filter)\n    + [Implement .gitignore filter](#implement-gitignore-filter)\n  * [Name comparators](#name-comparators)\n  * [Result builder](#result-builder)\n- [UI tools](#ui-tools)\n- [Changelog](#changelog)\n\n# Installation\n```bash\nnpm install dir-compare\n```\n\n# Library\n\n## Use\n```javascript\nconst dircompare = require('dir-compare');\n\nconst options = { compareSize: true };\n// Multiple compare strategy can be used simultaneously - compareSize, compareContent, compareDate, compareSymlink.\n// If one comparison fails for a pair of files, they are considered distinct.\nconst path1 = '...';\nconst path2 = '...';\n\n// Synchronous\nconst res = dircompare.compareSync(path1, path2, options)\nprint(res)\n\n// Asynchronous\ndircompare.compare(path1, path2, options)\n  .then(res =\u003e print(res))\n  .catch(error =\u003e console.error(error));\n\nfunction print(result) {\n  console.log('Directories are %s', result.same ? 'identical' : 'different')\n\n  console.log('Statistics - equal entries: %s, distinct entries: %s, left only entries: %s, right only entries: %s, differences: %s',\n    result.equal, result.distinct, result.left, result.right, result.differences)\n\n  result.diffSet.forEach(dif =\u003e console.log('Difference - path: %s, name1: %s, type1: %s, name2: %s, type2: %s, state: %s',\n    dif.relativePath, dif.name1, dif.type1, dif.name2, dif.type2, dif.state))\n}\n```\n\nTypescript\n```typescript\nimport { compare, compareSync, Options, Result } from \"dir-compare\";\nconst path1 = '...';\nconst path2 = '...';\nconst options: Options = { compareSize: true };\n\nconst res: Result = compareSync(path1, path2, options);\nconsole.log(res)\n\ncompare(path1, path2, options)\n  .then(res =\u003e console.log(res))\n  .catch(error =\u003e console.error(error));\n```\n\n## Api\n\n```typescript\ncompare(path1: string, path2: string, options?: Options): Promise\u003cResult\u003e\ncompareSync(path1: string, path2: string, options?: Options): Result\n```\nMore details can be found in the reference documentation:\n* [compare](https://gliviu.github.io/dc-api/functions/compare.html)\n* [compareSync](https://gliviu.github.io/dc-api/functions/compareSync.html)\n* [Options](https://gliviu.github.io/dc-api/interfaces/Options.html) \n* [Result](https://gliviu.github.io/dc-api/interfaces/Result.html)\n\nCommon options:\n* [compareSize](https://gliviu.github.io/dc-api/interfaces/Options.html#compareSize)\n* [compareContent](https://gliviu.github.io/dc-api/interfaces/Options.html#compareContent)\n* [compareDate](https://gliviu.github.io/dc-api/interfaces/Options.html#compareDate) \n* [excludeFilter](https://gliviu.github.io/dc-api/interfaces/Options.html#excludeFilter)\n* [includeFilter](https://gliviu.github.io/dc-api/interfaces/Options.html#includeFilter) \n* [ignoreCase](https://gliviu.github.io/dc-api/interfaces/Options.html#ignoreCase) \n* [skipSubdirs](https://gliviu.github.io/dc-api/interfaces/Options.html#skipSubdirs)\n* [skipEmptyDirs](https://gliviu.github.io/dc-api/interfaces/Options.html#skipEmptyDirs)\n\n##  Glob patterns\n[Minimatch](https://www.npmjs.com/package/minimatch) patterns are used to include/exclude files to be compared.\n\nThe pattern is matched against the relative path of the entry being compared.\n\nFollowing examples assume we are comparing two [dir-compare](https://github.com/gliviu/dir-compare) code bases.\n\n```javascript\nconst options = { \n  excludeFilter: \".git,node_modules\",   //  exclude git and node modules directories  \n  excludeFilter: \"expected\"         ,   //  exclude '/tests/expected' directory  \n  excludeFilter: \"/tests/expected\"  ,   //  exclude '/tests/expected' directory  \n  excludeFilter: \"**/expected\"      ,   //  exclude '/tests/expected' directory  \n  excludeFilter: \"**/tests/**/*.js\" ,   //  exclude all js files in '/tests' directory and subdirectories  \n\n  includeFilter: \"*.js,*.yml\"       ,   //  include js and yaml files  \n  includeFilter: \"/tests/**/*.js\"   ,   //  include all js files in '/tests' directory and subdirectories  \n  includeFilter: \"**/tests/**/*.ts\"     //  include all js files in '/tests' directory and subdirectories  \n}\n```\nThis behavior can be changed with [Glob filter extensions](#glob-filter).\n\n\n## Symbolic links\nUnless `compareSymlink` option is used, symbolic links are resolved and any comparison is applied to the file/directory they point to.\n\nCircular loops are handled by breaking the loop as soon as it is detected.\n\nVersion `1.x` treats broken links as `ENOENT: no such file or directory`.  \nSince `2.0` they are treated as a special type of entry - `broken-link` - and are available as stats (`totalBrokenLinks`, `distinctBrokenLinks`, ...).\n\nUsing `compareSymlink` option causes `dircompare` to check symlink values for equality.\nIn this mode two entries with identical names are considered different if\n* one is symlink, the other is not\n* both are symlinks but point to different locations\n\nThese rules are applied in addition to the other comparison modes; ie. by content, by size...\n\nIf entries are different because of symlinks, `reason` will be `different-symlink`. Also statistics summarize differences caused by symbolic links.\n\n## Handling permission denied errors\nUnreadable files or directories are normally reported as errors. The comparison will be interrupted with an `EACCES` exception.\nThis behavior can be altered with [Options.handlePermissionDenied](https://gliviu.github.io/dc-api/interfaces/Options.html#handlePermissionDenied).\n\n# Extension points\n\n## File content comparators\nBy default file content is binary compared. As of version 1.5.0 custom file comparison handlers may be specified.\n\nCustom handlers are specified by `compareFileSync` and `compareFileAsync` options which correspond to `dircompare.compareSync()` or `dircompare.compare()` methods.\n\nA couple of handlers are included in the library:\n* binary sync compare - `dircompare.fileCompareHandlers.defaultFileCompare.compareSync`\n* binary async compare - `dircompare.fileCompareHandlers.defaultFileCompare.compareAsync`\n* text sync compare - `dircompare.fileCompareHandlers.lineBasedFileCompare.compareSync`\n* text async compare - `dircompare.fileCompareHandlers.lineBasedFileCompare.compareAsync`\n\nUse [defaultFileCompare](https://github.com/gliviu/dir-compare/blob/master/src/FileCompareHandler/default/defaultFileCompare.ts) as an example to create your own.\n\n### Ignore line endings and white spaces\nLine based comparator can be used to ignore line ending and white space differences.\n```javascript\nconst dircompare = require('dir-compare');\n\nconst options = {\n  compareContent: true,\n  compareFileSync: dircompare.fileCompareHandlers.lineBasedFileCompare.compareSync,\n  compareFileAsync: dircompare.fileCompareHandlers.lineBasedFileCompare.compareAsync,\n  ignoreLineEnding: true,      // Ignore crlf/lf line ending differences\n  ignoreWhiteSpaces: true,     // Ignore white spaces at the beginning and end of a line (similar to 'diff -b')\n  ignoreAllWhiteSpaces: true,  // Ignore all white space differences (similar to 'diff -w')\n  ignoreEmptyLines: true       // Ignores differences caused by empty lines (similar to 'diff -B')\n};\n\nconst path1 = '...';\nconst path2 = '...';\nconst res = dircompare.compareSync(path1, path2, options);\nconsole.log(res)\n\ndircompare.compare(path1, path2, options)\n.then(res =\u003e console.log(res))\n```\n\n## Glob filter\nThe current implementation of the glob filter uses minimatch and is based on [includeFilter and excludeFilter options](#glob-patterns). While it is meant to fit most use cases, [some scenarios](https://github.com/gliviu/dir-compare/issues/67) are not addressed.\n\nUse [filterHandler option](https://gliviu.github.io/dc-api/interfaces/Options.html#filterHandler) to alter this behavior.\n\nThe following example demonstrates how to include only files with a specific extension in our comparison.\n```typescript\nimport { Options, compareSync, Result, FilterHandler, Entry, filterHandlers } from 'dir-compare'\nimport { extname } from 'path'\n\nvar d1 = '...';\nvar d2 = '...';\n\nconst filterByfileExtension: FilterHandler = (entry: Entry, relativePath: string, options: Options): boolean =\u003e {\n  if (!options.fileExtension) {\n    // Fallback on the default 'minimatch' implementation\n    return filterHandlers.defaultFilterHandler(entry, relativePath, options)\n  }\n\n  return options.fileExtension === extname(entry.name)\n}\n\nconst options: Options = {\n  compareSize: true,\n  fileExtension: '.txt',\n  filterHandler: filterByfileExtension\n}\n\nconst res: Result = compareSync(d1, d2, options)\n```\n\nFor reference, the default minimatch filter can be found in [defaultFilterHandler](https://github.com/gliviu/dir-compare/blob/master/src/FilterHandler/defaultFilterHandler.ts) which is exposed by [filterHandlers property](https://gliviu.github.io/dc-api/variables/filterHandlers.html).\n\n### Implement .gitignore filter\n[Globby](https://www.npmjs.com/package/globby) library provides the functionality to parse and apply `.gitignore` rules.\nThis is a [sample implementation](https://github.com/gliviu/dir-compare/blob/master/test/extended/gitignoreSupport/gitignoreFilter.ts) that uses globby and dir-compare filter extension.\n\nUsage:\n```typescript\nimport { Options, compareSync, Result} from 'dir-compare'\nimport { getGitignoreFilter } from './gitignoreFilter.js'\n\nvar d1 = '...';\nvar d2 = '...';\n\nconst options: Options = {\n  compareSize: true,\n  filterHandler: getGitignoreFilter(d1, d2),\n  includeFilter: '*.js'  // if present, regular filters are applied after .gitignore rules.\n}\n\nconst res: Result = compareSync(d1, d2, options)\n\n```\n\n## Name comparators\nIf [default](https://github.com/gliviu/dir-compare/blob/master/src/NameCompare/defaultNameCompare.ts) name comparison is not enough, custom behavior can be specified with [compareNameHandler](https://gliviu.github.io/dc-api/interfaces/Options.html#compareNameHandler) option.\nFollowing example adds the possibility to ignore file extensions.\n```typescript\nimport { Options, compare } from 'dir-compare'\nimport path from 'path'\n\nconst options: Options = {\n    compareSize: false,                    // compare only name by disabling size and content criteria\n    compareContent: false,\n    compareNameHandler: customNameCompare, // new name comparator used to ignore extensions\n    ignoreExtension: true,                 // supported by the custom name compare below\n};\n\nfunction customNameCompare(name1: string, name2: string, options: Options) {\n    if (options.ignoreCase) {\n        name1 = name1.toLowerCase()\n        name2 = name2.toLowerCase()\n    }\n    if (options.ignoreExtension) {\n        name1 = path.basename(name1, path.extname(name1))\n        name2 = path.basename(name2, path.extname(name2))\n    }\n    return ((name1 === name2) ? 0 : ((name1 \u003e name2) ? 1 : -1))\n}\n\nconst path1 = '/tmp/a';\nconst path2 = '/tmp/b';\n\nconst res = compare(path1, path2, options).then(res =\u003e {\n    console.log(`Same: ${res.same}`)\n    if (!res.diffSet) {\n        return\n    }\n    res.diffSet.forEach(dif =\u003e console.log(`${dif.name1} ${dif.name2} ${dif.state}`))\n})\n\n// Outputs\n// icon.svg icon.png equal\n// logo.svg logo.jpg equal\n```\nFor reference, the default name comparator can be found in [defaultNameCompare](https://github.com/gliviu/dir-compare/blob/master/src/NameCompare/defaultNameCompare.ts) which is exposed by [compareNameHandlers property](https://gliviu.github.io/dc-api/variables/compareNameHandlers.html).\n\n\n## Result builder\n[Result builder](https://gliviu.github.io/dc-api/interfaces/Options.html#resultBuilder) is called for each pair of entries encountered during comparison. Its purpose is to append entries in `diffSet` and eventually update `statistics` object with new stats.\n\nIf needed it can be replaced with custom implementation.\n\n```javascript\nconst dircompare = require(\"dircompare\")\n\nconst customResultBuilder = function (entry1, entry2, state, level, relativePath, options, statistics, diffSet, reason) {\n    ...\n}\n\nconst options = {\n    compareSize: true,\n    resultBuilder: customResultBuilder\n}\nconst res = dircompare.compareSync('...', '...', options)\n\n```\n\nThe [default](https://github.com/gliviu/dir-compare/blob/master/src/ResultBuilder/defaultResultBuilderCallback.ts) builder can be used as an example.\n\n# UI tools\n* [dir-compare-cli](https://github.com/gliviu/dir-compare-cli)\n* [Visual Studio Code - Compare Folders](https://marketplace.visualstudio.com/items?itemName=moshfeu.compare-folders)\n\n# Changelog\n* v5.0.0\n  Breaking changes:\n    * `skipSubdirs` option has slightly different behavior. More details in [#77](https://github.com/gliviu/dir-compare/issues/77#issuecomment-2094375352)\n* v4.2.0\n  * Updated dependencies\n  * Increased test coverage\n* v4.1.0\n  * Possibility to alter the default [Glob filter](#glob-filter) behavior\n  * [Ignore files and directories according to .gitignore rules](#implement-gitignore-filter).\n  * New [origin](https://gliviu.github.io/dc-api/interfaces/Entry.html#origin) field in Entry to distinguish between the left or right directory\n  * Improved api documentation\n* v4.0.0\n    * Switched project to typescript\n    * [Async comparator](https://gliviu.github.io/dc-api/functions/compare.html) improvements when comparing large directory structures\n      * Heap usage has decreased 3x compared to previous version\n      * Works 2x faster when comparing by content\n      * Better concurrency. UI apps will be more responsive while comparison is ongoing\n\n  Breaking changes:\n    * Using this library to compare two files will ignore the name of the files. More details in [#48](https://github.com/gliviu/dir-compare/issues/48)\n    * Removed support for node 8, 9\n* v3.3.0 Added `skipEmptyDirs` option\n* v3.2.0 [Handle permission denied errors](#handling-permission-denied-errors)\n* v3.1.0 Added `ignoreAllWhiteSpaces` and `ignoreEmptyLines` options\n* v3.0.0 Moved CLI component into separate project [dir-compare-cli](https://github.com/gliviu/dir-compare-cli)\n* v2.4.0 [New option](https://gliviu.github.io/dc-api/interfaces/Options.html#compareNameHandler) to customize file/folder name comparison\n* v2.3.0 Fixes\n* v2.1.0 Removed [bluebird](https://github.com/petkaantonov/bluebird/#%EF%B8%8Fnote%EF%B8%8F) dependency\n* v2.0.0\n  * New option to compare symlinks.\n  * New field indicating reason for two entries being distinct.\n  * Improved command line output format.\n  * Tests are no longer part of published package.\n  * Generated [Api](https://gliviu.github.io/dc-api) documentation.\n  \n  Breaking changes:\n  * Broken links are no longer treated as errors. As a result there are new statistics (leftBrokenLinks, rightBrokenLinks, distinctBrokenLinks, totalBrokenLinks) and new entry type - broken-link.\n    Details in [Symbolic links](#symbolic-links).\n  * Typescript correction: new interface `Result` replaced `Statistics`.\n* v1.8.0 \n    * globstar patterns\n    * typescript corrections\n    * removed support for node 0.11, 0.12, iojs\n* v1.7.0 performance improvements\n* v1.6.0 typescript support\n* v1.5.0 added option to ignore line endings and white space differences\n* v1.3.0 added date tolerance option\n* v1.2.0 added compare by date option\n* v1.1.0\n    * detect symlink loops\n    * improved color scheme for command line utility\n* v1.0.0\n    * asynchronous comparison\n    * new library options: noDiffSet, resultBuilder\n    * new statistics: distinctFiles, equalFiles, leftFiles, rightFiles, distinctDirs, equalDirs, leftDirs, rightDirs\n    * new --async command line option\n    * Fix for https://github.com/tj/commander.js/issues/125\n* v0.0.3 Fix file ordering issue for newer node versions\n\n","funding_links":[],"categories":["Repository"],"sub_categories":["Filesystem"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgliviu%2Fdir-compare","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgliviu%2Fdir-compare","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgliviu%2Fdir-compare/lists"}