{"id":13515661,"url":"https://github.com/folder/readdir","last_synced_at":"2026-03-11T21:27:36.900Z","repository":{"id":52795151,"uuid":"182813764","full_name":"folder/readdir","owner":"folder","description":"Recursively read a directory, blazing fast. Use with picomatch or micromatch to match globs. ","archived":false,"fork":false,"pushed_at":"2023-07-03T02:16:54.000Z","size":76,"stargazers_count":42,"open_issues_count":1,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-10-27T12:06:43.729Z","etag":null,"topics":["dir","directories","directory","fdir","file-system","fs","javascript","jonschlinkert","nested","node","nodejs","path","read","readdir","readdirp","realpath","recurse","recursive","walk"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/folder.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"github":["jonschlinkert","doowb"]}},"created_at":"2019-04-22T15:17:59.000Z","updated_at":"2025-08-27T13:21:11.000Z","dependencies_parsed_at":"2024-01-13T22:24:58.262Z","dependency_job_id":"bcb972bb-099a-4d4f-8917-f6d2b7f48ca2","html_url":"https://github.com/folder/readdir","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/folder/readdir","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/folder%2Freaddir","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/folder%2Freaddir/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/folder%2Freaddir/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/folder%2Freaddir/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/folder","download_url":"https://codeload.github.com/folder/readdir/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/folder%2Freaddir/sbom","scorecard":{"id":406036,"data":{"date":"2025-08-11","repo":{"name":"github.com/folder/readdir","commit":"365d689b3237b173c6258816ef4e29626650387a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"checks":[{"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/main.yml:1","Info: no jobLevel write permissions found"],"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":"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":"Code-Review","score":0,"reason":"Found 0/28 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":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/folder/readdir/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/folder/readdir/main.yml/master?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/main.yml:20","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 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":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"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":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"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":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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":"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 1 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T21:17:17.541Z","repository_id":52795151,"created_at":"2025-08-18T21:17:17.541Z","updated_at":"2025-08-18T21:17:17.541Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30401877,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-11T21:02:20.017Z","status":"ssl_error","status_checked_at":"2026-03-11T20:59:32.667Z","response_time":84,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["dir","directories","directory","fdir","file-system","fs","javascript","jonschlinkert","nested","node","nodejs","path","read","readdir","readdirp","realpath","recurse","recursive","walk"],"created_at":"2024-08-01T05:01:14.393Z","updated_at":"2026-03-11T21:27:36.883Z","avatar_url":"https://github.com/folder.png","language":"JavaScript","readme":"# @folder/readdir [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/jonathanschlinkert?locale.x=en_US) [![NPM version](https://img.shields.io/npm/v/@folder/readdir.svg?style=flat)](https://www.npmjs.com/package/@folder/readdir) [![NPM monthly downloads](https://img.shields.io/npm/dm/@folder/readdir.svg?style=flat)](https://npmjs.org/package/@folder/readdir) [![NPM total downloads](https://img.shields.io/npm/dt/@folder/readdir.svg?style=flat)](https://npmjs.org/package/@folder/readdir)\n\n\u003e Recursively read a directory, blazing fast.\n\nPlease consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.\n\n## Install\n\nInstall with [npm](https://www.npmjs.com/) (requires [Node.js](https://nodejs.org/en/) \u003e=10):\n\n```sh\n$ npm install --save @folder/readdir\n```\n\n## Why use @folder/readdir and not some other lib?\n\n* It's [blazing fast](#benchmarks).\n* It has a simple, [straightforward API](#usage) and intuitive [options](#options) for advanced use cases.\n* Optionally returns an array of file objects (extends node.js native [fs.Dirent](https://nodejs.org/api/fs.html#fs_class_fs_dirent)). Returns path strings by default.\n* No dependencies\n\n## Usage\n\n```js\nconst readdir = require('@folder/readdir');\nconst options = {};\n\n// async usage\nconsole.log(await readdir('somedir', options));\nconsole.log(await readdir(['two', 'dirs'], options));\n\n// sync usage\nconsole.log(readdir.sync('somedir', options));\nconsole.log(readdir.sync(['two' 'dirs'], options));\n```\n\n**params**\n\nBoth the async and sync functions take the same arguments:\n\n```js\nreaddir(dir, options);\n```\n\n* `dir` (string|array) - one or more directories to read\n* `options` - see available [options](#options)\n\n## Options\n\n### absolute\n\nWhen true, absolute paths are returned. Otherwise, returned paths are relative to [options.base](#base) if defined, or the given directory.\n\n**Type**: `boolean`\n\n**Default**: `undefined`\n\n**Example**\n\n```js\nconsole.log(await readdir('some/dir', { absolute: true }));\n```\n\n### base\n\nThe base directory from which relative paths should be created.\n\n**Type**: `string`\n\n**Default**: Defaults to the directory passed as the first argument.\n\n**Example**\n\n```js\nconst files = await readdir('some/dir', { base: 'dir' });\nconsole.log(files);\n```\n\n### basename\n\nWhen true, only the basename of each file is returned.\n\n**Type**: `boolean`\n\n**Default**: `undefined`\n\n**Example**\n\n```js\nconsole.log(await readdir('some/dir', { basename: true }));\n```\n\n### depth\n\nThe maximum folder depth to recursively read directories.\n\n**Type**: `number`\n\n**Default**: `undefined`\n\n**Example**\n\n```js\nconst files = await readdir('some/dir', { depth: 2 });\nconsole.log(files);\n```\n\n### dot\n\nDotfiles are included in the result by default. Pass `false` to ignore all dotfiles. Use [onEach][], [onFile][], [onDirectory][], or [isMatch] if you need something more granular.\n\n**Type**: `boolean`\n\n**Default**: `true`\n\n**Example**\n\n```js\nconst files = await readdir('.');\nconsole.log(files);\n//=\u003e ['.DS_Store', '.git', 'LICENSE', 'README.md', 'package.json']\n\nconst files = await readdir('.', { dot: false });\nconsole.log(files);\n//=\u003e ['LICENSE', 'README.md', 'package.json']\n```\n\n### filter\n\n**Type**: `function|string|array|regexp`\n\n**Default**: `undefined`\n\n**Example**\n\n```js\n// only return file paths with \"foo\" somewhere in the path\nconsole.log(await readdir('some/dir', { filter: /foo/ }));\n\n// only return file paths without \"foo\" somewhere in the path\nconsole.log(await readdir('some/dir', { filter: file =\u003e !/foo/.test(file.path) }));\n```\n\n### follow\n\nFollow symbolic links.\n\n**Type**: `boolean`\n\n**Default**: `undefined`\n\n**Example**\n\n```js\nconsole.log(await readdir('some/dir', { follow: true }));\n```\n\n### isMatch\n\n**Type**: `function|string|regex|array\u003cfunction|string|regex\u003e`\n\n**Default**: `undefined`\n\n**Example**\n\n```js\n// only return file paths with \"/.git/\" somewhere in the path\nconsole.log(await readdir('some/dir', { isMatch: /\\/\\.git\\// }));\n\n// only return file paths that are not inside \"node_modules\"\nconsole.log(await readdir('some/dir', { isMatch: file =\u003e !file.relative.includes('node_modules') }));\n\n// get all files that are not named .DS_Store\nconsole.log(await readdir('some/dir', { isMatch: file =\u003e file.name !== '.DS_Store' }));\n\n// use globs\nconst picomatch = require('picomatch');\nconst isMatch = picomatch('*/*.js');\nconsole.log(await readdir('some/dir', { isMatch: file =\u003e isMatch(file.relative) }));\n```\n\n### nodir\n\nWhen `true` directories are excluded from the result.\n\n**Type**: `boolean`\n\n**Default**: `undefined`\n\n### objects\n\nReturn [fs.Dirent](https://nodejs.org/api/fs.html#fs_class_fs_dirent) objects instead of paths.\n\n**Type**: `boolean`\n\n**Default**: `undefined`\n\n```js\nconsole.log(await readdir('some/dir', { objects: true }));\n```\n\n### onDirectory\n\nFunction to be called on all directories.\n\n**Type**: `function`\n\n**Default**: `undefined`\n\n**Example**\n\n```js\nconst onDirectory = file =\u003e {\n  if (file.name === 'node_modules') {\n    file.recurse = false;\n  }\n};\nconsole.log(await readdir('some/dir', { onDirectory }));\n```\n\n### onEach\n\nFunction to be called on all directories and files.\n\n**Type**: `function`\n\n**Default**: `undefined`\n\n**Example**\n\n```js\nconst onEach = file =\u003e {\n  if (file.name === 'node_modules') {\n    file.recurse = false;\n  }\n  if (file.isFile() \u0026\u0026 file.name[0] === '.') {\n    file.keep = true;\n  }\n};\nconsole.log(await readdir('some/dir', { onEach }));\n```\n\n### onFile\n\nFunction to be called on all files.\n\n**Type**: `function`\n\n**Default**: `undefined`\n\n**Example**\n\n```js\nconst onFile = file =\u003e {\n  if (file.isFile() \u0026\u0026 file.name[0] === '.') {\n    file.keep = true;\n  }\n};\nconsole.log(await readdir('some/dir', { onFile }));\n```\n\n### onSymbolicLink\n\nFunction to be called on all symbolic links.\n\n**Type**: `function`\n\n**Default**: `undefined`\n\n**Example**\n\n```js\nconst onSymbolicLink = file =\u003e {\n  // do stuff\n};\nconsole.log(await readdir('some/dir', { onSymbolicLink }));\n```\n\n### realpath\n\nWhen true, the realpath of the file is returned in the result. This can be used in combination with other options, like `basename` or `relative`.\n\n**Type**: `boolean`\n\n**Default**: `undefined`\n\n**Example**\n\n```js\nconsole.log(await readdir('some/dir', { realpath: true }));\n```\n\n### recursive\n\n**Type**: `function`\n\n**Type**: `string`\n\n**Type**: `boolean`\n\n**Default**: `undefined`\n\n**Example**\n\n```js\nconst files = await readdir('some/dir', { recursive: true });\nconsole.log(files);\n```\n\n### symlinks\n\nReturns the first directory level of symbolic links. Use [options.follow](#follow) to recursively follow symlinks.\n\n**Type**: `boolean`\n\n**Default**: `undefined`\n\n**Example**\n\n```js\nconsole.log(await readdir('some/dir', { symlinks: true }));\n```\n\n### unique\n\nReturn only unique file paths. Only needed when [options.realpath](#realpath) is `true`.\n\n**Type**: `boolean`\n\n**Default**: `undefined`\n\n**Example**\n\n```js\nconsole.log(await readdir('some/dir', { unique: true }));\n```\n\n## Tips \u0026 Tricks\n\nUse the [onFile](#onFile) option to operate on files as they are read from the file system, before they are pushed onto the results array.\n\nThis allows you to pricisely control which files are returned.\n\n_(Note that even when you specify that files should be returned as _paths_ rather than objects, all functions passed on the options will receive files as objects, so that you may manipulate the paths that are returned however you need to)_\n\n```js\nconst readdir = require('@folder/readdir');\nconst isMatch = file =\u003e true;\n\nmodule.exports = async (dir, options) =\u003e {\n  const opts = { absolute: true, recursive: true, objects: true, ...options };\n  const files = [];\n\n  const onFile = file =\u003e {\n    if (isMatch(file)) {\n      files.push(file);\n    }\n  };\n\n  await readdir(dir, { ...opts, onFile });\n  return files;\n};\n```\n\n**Files and directories**\n\nThe `onFile` option does not receive dir objects, only dirents (files). If you need both files and directories, you can do the following:\n\n```js\nconst readdir = require('@folder/readdir');\nconst isMatch = file =\u003e true;\n\nmodule.exports = async (dir, options) =\u003e {\n  const opts = { recursive: true, objects: true, ...options };\n  const files = [];\n\n  const onDirectory = file =\u003e {\n    if (file.name === 'node_modules') {\n      file.recurse = false;\n    }\n  };\n\n  const onFile = file =\u003e {\n    if (isMatch(file)) {\n      files.push(file);\n    }\n  };\n\n  await readdir(dir, { ...opts, onFile, onDirectory });\n  return files;\n};\n```\n\nOr you can use [onEach](#onEach) (which gives you each file before it has been determined whether or not the file will be returned based on other criteria and options. this allows you to override default behavior in a granular way), or [onPush](#onPush) (which gives you a file that is going to be returned in the results array).\n\nHere, we only show `onEach`, since it's identical to `onPush` in terms of usage.\n\n```js\nconst readdir = require('@folder/readdir');\n\nconst ignore = ['node_modules', '.git'];\nconst isIgnored = file =\u003e ignore.includes(file.nane);\n\nmodule.exports = async (dir, options) =\u003e {\n  const opts = { recursive: true, objects: true, ...options };\n  const files = [];\n\n  const onEach = file =\u003e {\n    if (file.isDirectory()) {\n      file.recurse = !isIgnored(file);\n    } else {\n      files.push(file);\n    }\n  };\n\n  await readdir(dir, { ...opts, onFile, onEach });\n  return files;\n};\n```\n\n## Benchmarks\n\n_(Note that only the benchmarks against `fdir` are included here since that library claims to be the fastest)_\n\nTo run the benchmarks yourself, you'll need to cd into the `bench` folder and run `$ npm i`. Run the `recursive-large` benchmarks last, and before you run them cd into `bench/fixtures` and do `$ npm i`.\n\n**Specs**\n\n* CPU: Intel® Core™ i9-9980HK 2.4GHz\n* Cores: 16 (8 Physical)\n* RAM: 64GB\n* Disk: Apple APPLE SSD AP2048N 1864GB NVMe (PCIe x4)\n* OS: macOS macOS Big Sur (darwin)\n* Kernel: 20.3.0 x64\n* Node: v15.14.0\n* V8: 8.6.395.17-node.28\n\n```\n# single directory (~5-10 files)\n  @folder/readdir x 24,938 ops/sec (124,693 runs sampled)\n             fdir x 24,771 ops/sec (123,858 runs sampled)\n\n# recursive ~220 files\n  @folder/readdir x 1,915 ops/sec (9,576 runs sampled)\n             fdir x 1,850 ops/sec (9,253 runs sampled)\n\n# recursive ~2,700 files\n  @folder/readdir x 155 ops/sec (780 runs sampled)\n             fdir x 145 ops/sec (730 runs sampled)\n\n# recursive ~57,200 files (just gatsby!)\n  @folder/readdir x 11 ops/sec (57 runs sampled)\n             fdir x 10 ops/sec (54 runs sampled)\n```\n\n## About\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eContributing\u003c/strong\u003e\u003c/summary\u003e\n\nPull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eRunning Tests\u003c/strong\u003e\u003c/summary\u003e\n\nRunning and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:\n\n```sh\n$ npm install \u0026\u0026 npm test\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eBuilding docs\u003c/strong\u003e\u003c/summary\u003e\n\n_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_\n\nTo generate the readme, run the following command:\n\n```sh\n$ npm install -g verbose/verb#dev verb-generate-readme \u0026\u0026 verb\n```\n\n\u003c/details\u003e\n\n### Author\n\n**Jon Schlinkert**\n\n* [GitHub Profile](https://github.com/jonschlinkert)\n* [Twitter Profile](https://twitter.com/jonschlinkert)\n* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)\n\n### License\n\nCopyright © 2021, [Jon Schlinkert](https://github.com/jonschlinkert).\nReleased under the [MIT License](LICENSE).\n\n***\n\n_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on April 19, 2021._\n","funding_links":["https://github.com/sponsors/jonschlinkert","https://github.com/sponsors/doowb","https://paypal.me/jonathanschlinkert?locale.x=en_US"],"categories":["JavaScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffolder%2Freaddir","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffolder%2Freaddir","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffolder%2Freaddir/lists"}