{"id":23004468,"url":"https://github.com/marvin-j97/walk-it","last_synced_at":"2025-09-07T08:33:53.538Z","repository":{"id":36982242,"uuid":"449378406","full_name":"marvin-j97/walk-it","owner":"marvin-j97","description":"Recursive file walk-iterator for Node.js, Bun and Deno","archived":false,"fork":false,"pushed_at":"2024-10-29T20:14:18.000Z","size":368,"stargazers_count":1,"open_issues_count":3,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-10-29T22:39:38.475Z","etag":null,"topics":["deno","javascript","nodejs","npm","npm-package","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/marvin-j97.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,"dei":null,"publiccode":null,"codemeta":null},"funding":{"buy_me_a_coffee":"marvin.j97"}},"created_at":"2022-01-18T17:18:16.000Z","updated_at":"2024-10-29T20:12:28.000Z","dependencies_parsed_at":"2023-12-07T09:26:29.043Z","dependency_job_id":"eaae3a34-fc89-48d2-954c-3e3427160fca","html_url":"https://github.com/marvin-j97/walk-it","commit_stats":{"total_commits":67,"total_committers":3,"mean_commits":"22.333333333333332","dds":0.3731343283582089,"last_synced_commit":"7a9ca4e723e645c7b9e3f16cf80ce01a385d10d8"},"previous_names":[],"tags_count":11,"template":false,"template_full_name":"marvin-j97/typescript-eslint-ava-template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marvin-j97%2Fwalk-it","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marvin-j97%2Fwalk-it/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marvin-j97%2Fwalk-it/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marvin-j97%2Fwalk-it/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/marvin-j97","download_url":"https://codeload.github.com/marvin-j97/walk-it/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":229791390,"owners_count":18124680,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["deno","javascript","nodejs","npm","npm-package","typescript"],"created_at":"2024-12-15T07:18:37.095Z","updated_at":"2025-08-14T01:32:43.010Z","avatar_url":"https://github.com/marvin-j97.png","language":"TypeScript","funding_links":["https://buymeacoffee.com/marvin.j97"],"categories":[],"sub_categories":[],"readme":"# walk-it\n\n[![TS ready](https://img.shields.io/static/v1?label=\u0026message=TS+ready\u0026color=000000\u0026logo=typescript)]()\n[![ESM ready](https://img.shields.io/static/v1?label=\u0026message=ESM+ready\u0026color=%23000000\u0026logo=javascript)]()\n[![Deno ready](https://img.shields.io/static/v1?label=\u0026message=Deno+ready\u0026color=%23000000\u0026logo=deno)]()\n[![Bun ready](https://img.shields.io/static/v1?label=\u0026message=Bun+ready\u0026color=%23000000\u0026logo=bun)]()\n[![Node.js CI](https://github.com/marvin-j97/walk-it/actions/workflows/node.yml/badge.svg)](https://github.com/marvin-j97/walk-it/actions/workflows/node.yml)\n[![npm](https://img.shields.io/npm/v/walk-it)](https://www.npmjs.com/package/walk-it)\n[![jsr](https://img.shields.io/jsr/v/@svarta/walk-it)](https://jsr.io/@svarta/walk-it)\n[![npm bundle size](https://img.shields.io/bundlephobia/minzip/walk-it)](https://bundlephobia.com/package/walk-it)\n[![codecov](https://codecov.io/gh/marvin-j97/walk-it/branch/main/graph/badge.svg?token=ExVQZnlhqk)](https://codecov.io/gh/marvin-j97/walk-it)\n![GitHub](https://img.shields.io/github/license/marvin-j97/walk-it)\n\nRecursive file **walk-it**erator. Requires Node 20+, Deno or Bun.\n\n## Install (Node)\n\n```bash\nnpm i walk-it\npnpm i walk-it\nyarn add walk-it\nbun install walk-it\n```\n\n## Install (JSR)\n\n```bash\nnpx jsr add @svarta/walk-it\npnpm jsr add @svarta/walk-it\nyarn jsr add @svarta/walk-it\nbunx jsr add @svarta/walk-it\n```\n\n## Deno usage\n\n```typescript\nimport { walk } from \"npm:walk-it\";\n```\n\n## Default behaviour\n\nBy default, all folders will be visited recursively starting at the given directory.\n\nNote that subfolders are visited _eagerly_, meaning the _level_ is not sorted (aka. [pre-order traversal is used instead of level-order](https://en.wikipedia.org/wiki/Tree_traversal)).\n\n## Usage \u0026 examples\n\n#### Walk all folders recursively\n\n```typescript\nimport { walk } from \"walk-it\";\n\nfor await (const x of walk(dir)) {\n  // x contains:\n  // dir    : the scanned folder's absolute path\n  // files  : files as directory entries (Dirent)\n  // folders: folders as directory entries (Dirent)\n  // level  : the tree level (0 being the start directory)\n  console.log(x);\n}\n```\n\n#### Get files only\n\n```typescript\nimport { walkFiles } from \"walk-it\";\n\nfor await (const { file, path } of walkFiles(dir)) {\n  // file is a Dirent object\n  // path is the absolute path of the visited file\n  console.log(file, path);\n}\n```\n\n#### Limit recursive descent\n\n```typescript\nimport { walk } from \"walk-it\";\n\n// 0 = Only output 'dir'\n// 1 = Descent once\n// 2 = Descent twice\n// ...\nfor await (const x of walk(dir, { maxLevel: 2 })) {\n  console.log(x);\n}\n```\n\n#### Disable recursive descent altogether\n\nSame as maxLevel = 0\n\n```typescript\nimport { walk } from \"walk-it\";\n\nfor await (const x of walk(dir, { recursive: false })) {\n  console.log(x);\n}\n```\n\n#### Whitelist files by extension\n\n```typescript\nimport { walk } from \"walk-it\";\n\nfor await (const x of walk(\".\", {\n  filterFile: ({ name }) =\u003e name.endsWith(\".jpg\"),\n})) {\n  console.log(x);\n}\n```\n\n#### Blacklist folders\n\n```typescript\nimport { walk } from \"walk-it\";\n\nfor await (const x of walk(\".\", {\n  filterFolder: ({ name }) =\u003e ![\"node_modules\", \".git\"].includes(name),\n})) {\n  console.log(x);\n}\n```\n\n_filterFolder_ should be preferred over filtering after walking because it will stop the recursive descent, thus increasing performance.\n\n#### Count files\n\n```typescript\nimport { countFiles } from \"walk-it\";\n\nconst count = await countFiles(\".\");\nconsole.log(`${count} files found`);\n\nconst count = await countFiles(\".\", {\n  // You can also use the same options as walk and walkFiles\n  filterFolder: ({ name }) =\u003e ![\"node_modules\", \".git\"].includes(name),\n});\nconsole.log(`${count} files found`);\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarvin-j97%2Fwalk-it","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarvin-j97%2Fwalk-it","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarvin-j97%2Fwalk-it/lists"}