Skip to content

Replacements for fs-extra

fs and fs/promises (native, Node.js)

Modern Node.js includes built-in fs and fs/promises APIs that cover what fs-extra historically provided.

js
import fsExtra from 'fs-extra'
import * as fs from 'node:fs'
import * as fsPromises from 'node:fs/promises'

copy

js
await fsExtra.copy(src, dest) 
await fsPromises.cp(src, dest, { recursive: true }) 

NOTE

If src is a file and dest is an existing directory, fs-extra throws; fs.cp copies into the directory.

copySync

js
fsExtra.copySync(src, dest) 
fs.cpSync(src, dest, { recursive: true }) 

remove

js
await fsExtra.remove(path) 
await fsPromises.rm(path, { recursive: true, force: true }) 

IMPORTANT

Remember to set { recursive: true, force: true } to match the behavior of fs-extra.

js
fsExtra.removeSync(path) 
fs.rmSync(path, { recursive: true, force: true }) 

mkdirs / mkdirp / ensureDir

js
await fsExtra.mkdirs(dir) 
await fsPromises.mkdir(dir, { recursive: true }) 

mkdirsSync / mkdirpSync / ensureDirSync

js
fsExtra.mkdirsSync(dir) 
fs.mkdirSync(dir, { recursive: true }) 

pathExists

js
await fsExtra.pathExists(path) 
await fsPromises.access(path).then(() => true, () => false) 

pathExistsSync

js
fsExtra.pathExistsSync(path) 
fs.existsSync(path) 

outputFile

js
await fsExtra.outputFile(file, data) 

await fsPromises.mkdir(path.dirname(file), { recursive: true }) 
await fsPromises.writeFile(file, data) 

outputFileSync

js
fsExtra.outputFileSync(file, data) 

fs.mkdirSync(path.dirname(file), { recursive: true }) 
fs.writeFileSync(file, data) 

readJson

js
await fsExtra.readJson(file) 
await fsPromises.readFile(file, 'utf8').then(JSON.parse) 

writeJson / outputJson

js
await fsExtra.writeJson(file, obj) 

await fsPromises.mkdir(path.dirname(file), { recursive: true }) 
await fsPromises.writeFile(file, JSON.stringify(obj, null, 2)) 

ensureFile / createFile

js
await fsExtra.ensureFile(file) 

await fsPromises.mkdir(path.dirname(file), { recursive: true }) 
await fsPromises.access(file).catch(() => fsPromises.writeFile(file, '')) 

ensureFileSync / createFileSync

js
fsExtra.ensureFileSync(file) 

fs.mkdirSync(path.dirname(file), { recursive: true }) 
fs.writeFileSync(file, '') 
js
await fsExtra.ensureLink(src, dest) 

await fsPromises.mkdir(path.dirname(dest), { recursive: true }) 
await fsPromises.link(src, dest) 

ensureLinkSync / createLinkSync

js
fsExtra.ensureLinkSync(src, dest) 
fs.mkdirSync(path.dirname(dest), { recursive: true }) 
fs.linkSync(src, dest) 
js
await fsExtra.ensureSymlink(src, dest) 

await fsPromises.mkdir(path.dirname(dest), { recursive: true }) 
await fsPromises.symlink(src, dest) 

ensureSymlinkSync / createSymlinkSync

js
fsExtra.ensureSymlinkSync(src, dest) 

fs.mkdirSync(path.dirname(dest), { recursive: true }) 
fs.symlinkSync(src, dest) 

emptyDir / emptydir

js
await fsExtra.emptyDir(dir) 

await fsPromises.rm(dir, { recursive: true, force: true }) 
await fsPromises.mkdir(dir, { recursive: true }) 

move

js
await fsExtra.move(src, dest) 
await fsPromises.rename(src, dest) 

NOTE

Does not work cross-device; add cp + rm fallback.

For example:

js
try {
  await fsPromises.rename(src, dest)
} catch (err) {
  if (err.code === 'EXDEV') {
    await fsPromises.cp(src, dest, { recursive: true })
    await fsPromises.rm(src, { recursive: true, force: true })
  } else {
    throw err
  }
}

Released under the MIT License. (90583048)