fs-extra

Drop-in replacement for Node's fs module adding copy, remove, mkdirs, and JSON helpers with native promise support.

Library
npm
v11.4.1
9,594 stars
MIT License

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
59 /100 Fair
Development Activity 52
Maintenance 20
Community 64
Maturity 60
Momentum 40

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation. How we score it →
86 /100 Excellent
Architecture 85
Code Quality 85
Innovation 88
Learning Curve 85

fs-extra is one of the most depended-upon packages in the npm ecosystem, adding the file-system methods Node’s built-in fs module leaves out — recursive copy, recursive remove, mkdir -p semantics, empty-directory helpers, symlink/hardlink creation, and direct JSON read/write. Every fs method is re-exported and promisified via universalify, so callers can mix callbacks, promises, and async/await without a separate wrapper library.

Because it clones and extends the native fs object rather than replacing it, teams can swap require('fs') for require('fs-extra') with zero API changes elsewhere in a codebase, then opt into the extra methods as needed. Backed by graceful-fs to avoid EMFILE errors under heavy concurrent file access, it has been a stable dependency of build tools, CLIs, and test harnesses for over a decade.

What You Get

  • Recursive copy/copySync with filters, overwrite control, and timestamp preservation
  • Recursive remove/removeSync (rm -rf equivalent) and emptyDir/emptyDirSync
  • ensureDir/mkdirs (mkdir -p semantics) plus ensureFile, ensureLink, ensureSymlink
  • Direct JSON helpers: readJson, writeJson, outputJson and their sync variants
  • move/moveSync for cross-device-safe renames, and outputFile for write-with-mkdir
  • Every native fs method re-exported and promisified via universalify, plus an ESM build at fs-extra/esm

Common Use Cases

  • Build tools and CLIs that need to copy or clean template/output directories recursively
  • Test suites that scaffold and tear down temporary fixture directories between runs
  • Config and cache tooling that reads/writes JSON files without manual JSON.parse/stringify + mkdir boilerplate
  • Deployment and packaging scripts that move build artifacts between directories across devices

Under The Hood

Architecture fs-extra organizes each capability as its own directory under lib/ (copy, remove, mkdirs, move, json, ensure, empty, output-file, path-exists, plus a shared fs and util), each exporting an async/sync pair that lib/index.js merges into a single namespace via object spread; lib/esm.mjs hand-maps the same functions to named exports for the fs-extra/esm entry point. The fs submodule (lib/fs/index.js) filters Node’s fs method list to what’s actually available on the running Node version, clones it onto the export object, then wraps each method with universalify.fromCallback so native fs behavior is preserved while gaining promise support — this is the mechanism that makes fs-extra a genuine drop-in replacement rather than a parallel API. Tech Stack The runtime dependency surface is deliberately tiny: graceful-fs (queues and retries fs calls to avoid EMFILE/EPERM under load), jsonfile (the JSON read/write engine readJson/writeJson delegate to), and universalify (the promise/callback duality helper used throughout). Pure JavaScript, no native bindings, engines.node >=14.14, and CommonJS-first with a hand-written ESM shim rather than a build step. Code Quality Nearly every lib/<feature> directory has a co-located __tests__ folder (visible under copy, remove, mkdirs, move, json, ensure, empty, fs, util, output-file, path-exists), run through mocha/nyc via npm run unit, plus a dedicated test.mjs for the ESM build and standard as the enforced lint/style config — there is no ambiguity about formatting since standard is non-configurable. Error handling favors explicit try/finally cleanup, visible in lib/util/utimes.js where a file descriptor is always closed even if futimes throws, with the original error preserved and rethrown rather than swallowed. API Design The public surface reads as an extension of fs rather than a competing library: sync methods keep the *Sync suffix Node uses, async methods return promises by default and accept an optional trailing callback for backward compatibility, and naming choices like remove/copy/mkdirs were deliberately chosen (per the README’s naming-rationale section) over inconsistent POSIX-style shorthand. Getting started requires no configuration beyond require('fs-extra') in place of require('fs'), which is close to zero boilerplate for the common case.

Used by 84 apps in this directory

TypeScript
95%
AGPL 3.0

HeyForm

Forms Surveys · No Code Platforms

9,048

Open-source conversational form builder with AI generation, conditional logic, and 30+ integrations — self-host with full data ownership.

View details
86
Repo Health
67
Technical
67
Dependency
Built with
TypeScript 95%
Updated 6 days ago
TypeScript
71%
Other

highlight.io

Analytics · Developer Tools · Monitoring

9,384

Open-source full-stack monitoring that unifies session replay, error tracking, logging, and distributed tracing so you can stop context-switching between tools.

View details
76
Repo Health
78
Technical
65
Dependency
Built with
TypeScript 71%
Go 16%
Updated 1 weeks ago
Rust
51%
Other

hoodik

File Storage · Security

1,539

Self-hosted, end-to-end encrypted cloud storage with browser-based encryption and S3-compatible storage support

View details
77
Repo Health
71
Technical
63
Dependency
Built with
Rust 51%
TypeScript 34%
Vue 14%
Updated 1 weeks ago
HTML
45%
LGPL-2.1

Horilla

ERP · Human Resources

1,470

Open-source HRMS covering recruitment, attendance, payroll, and biometrics in one self-hosted Django application.

View details
91
Repo Health
60
Technical
64
Dependency
Built with
HTML 45%
Python 41%
JavaScript 11%
Updated 1 weeks ago
TypeScript
77%
Other

Joplin

Note Taking

56,853

The privacy-first, open-source note-taking app with end-to-end encrypted sync, AI assistance, and a powerful plugin ecosystem across every platform.

View details
93
Repo Health
87
Technical
60
Dependency
Built with
TypeScript 77%
JavaScript 14%
Updated 1 weeks ago
TypeScript
94%
AGPL 3.0

Laudspeaker

Automation · Marketing

2,629

Open-source customer engagement platform for building visual, event-triggered messaging journeys across email, SMS, push, in-app, and webhooks.

View details
45
Repo Health
66
Technical
62
Dependency
Built with
TypeScript 94%
Updated 3 months ago
TypeScript
85%
MIT

LibreChat

AI Assistants · Developer Tools

46,236

Unite every major AI model in one self-hosted chat platform with agents, code execution, MCP tools, and enterprise authentication.

View details
93
Repo Health
81
Technical
62
Dependency
Built with
TypeScript 85%
JavaScript 14%
Updated 6 days ago
TypeScript
97%
Other

Lightdash

Analytics · Data Engineering

6,196

The open-source Looker alternative that turns your dbt project's metrics and dimensions into governed, self-serve charts and dashboards — no license key required.

View details
93
Repo Health
84
Technical
64
Dependency
Built with
TypeScript 97%
Updated 6 days ago
JavaScript
42%
Other

LimeSurvey

Forms Surveys

3,778

The world's most flexible open-source survey platform with 900+ templates, conditional logic, 80+ languages, and full GDPR compliance for any scale.

View details
86
Repo Health
62
Technical
62
Dependency
Built with
JavaScript 42%
PHP 36%
CSS 12%
Updated 6 days ago

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers