Skip to content

Commit

Permalink
Use arrow functions
Browse files Browse the repository at this point in the history
BREAKING CHANGE: this drops support for node 0.x
  • Loading branch information
isaacs committed Aug 14, 2019
1 parent 592a4b6 commit d7e41a2
Showing 1 changed file with 42 additions and 46 deletions.
88 changes: 42 additions & 46 deletions rimraf.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
module.exports = rimraf
rimraf.sync = rimrafSync

const assert = require("assert")
const path = require("path")
const fs = require("fs")
Expand All @@ -21,7 +18,7 @@ let timeout = 0

const isWindows = (process.platform === "win32")

function defaults (options) {
const defaults = options => {
const methods = [
'unlink',
'chmod',
Expand All @@ -30,7 +27,7 @@ function defaults (options) {
'rmdir',
'readdir'
]
methods.forEach(function(m) {
methods.forEach(m => {
options[m] = options[m] || fs[m]
m = m + 'Sync'
options[m] = options[m] || fs[m]
Expand All @@ -48,7 +45,7 @@ function defaults (options) {
options.glob = options.glob || defaultGlobOpts
}

function rimraf (p, options, cb) {
const rimraf = (p, options, cb) => {
if (typeof options === 'function') {
cb = options
options = {}
Expand All @@ -66,47 +63,33 @@ function rimraf (p, options, cb) {
let errState = null
let n = 0

if (options.disableGlob || !glob.hasMagic(p))
return afterGlob(null, [p])

options.lstat(p, function (er, stat) {
if (!er)
return afterGlob(null, [p])

glob(p, options.glob, afterGlob)
})

function next (er) {
const next = (er) => {
errState = errState || er
if (--n === 0)
cb(errState)
}

function afterGlob (er, results) {
const afterGlob = (er, results) => {
if (er)
return cb(er)

n = results.length
if (n === 0)
return cb()

results.forEach(function (p) {
rimraf_(p, options, function CB (er) {
results.forEach(p => {
const CB = (er) => {
if (er) {
if ((er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") &&
busyTries < options.maxBusyTries) {
busyTries ++
// try again, with the same exact callback as this one.
return setTimeout(function () {
rimraf_(p, options, CB)
}, busyTries * 100)
return setTimeout(() => rimraf_(p, options, CB), busyTries * 100)
}

// this one won't happen if graceful-fs is used.
if (er.code === "EMFILE" && timeout < options.emfileWait) {
return setTimeout(function () {
rimraf_(p, options, CB)
}, timeout ++)
return setTimeout(() => rimraf_(p, options, CB), timeout ++)
}

// already gone
Expand All @@ -115,9 +98,21 @@ function rimraf (p, options, cb) {

timeout = 0
next(er)
})
}
rimraf_(p, options, CB)
})
}

if (options.disableGlob || !glob.hasMagic(p))
return afterGlob(null, [p])

options.lstat(p, (er, stat) => {
if (!er)
return afterGlob(null, [p])

glob(p, options.glob, afterGlob)
})

}

// Two possible strategies.
Expand All @@ -131,14 +126,14 @@ function rimraf (p, options, cb) {
//
// If anyone ever complains about this, then I guess the strategy could
// be made configurable somehow. But until then, YAGNI.
function rimraf_ (p, options, cb) {
const rimraf_ = (p, options, cb) => {
assert(p)
assert(options)
assert(typeof cb === 'function')

// sunos lets the root user unlink directories, which is... weird.
// so we have to lstat here and make sure it's not a dir.
options.lstat(p, function (er, st) {
options.lstat(p, (er, st) => {
if (er && er.code === "ENOENT")
return cb(null)

Expand All @@ -149,7 +144,7 @@ function rimraf_ (p, options, cb) {
if (st && st.isDirectory())
return rmdir(p, options, er, cb)

options.unlink(p, function (er) {
options.unlink(p, er => {
if (er) {
if (er.code === "ENOENT")
return cb(null)
Expand All @@ -165,18 +160,18 @@ function rimraf_ (p, options, cb) {
})
}

function fixWinEPERM (p, options, er, cb) {
const fixWinEPERM = (p, options, er, cb) => {
assert(p)
assert(options)
assert(typeof cb === 'function')
if (er)
assert(er instanceof Error)

options.chmod(p, 0o666, function (er2) {
options.chmod(p, 0o666, er2 => {
if (er2)
cb(er2.code === "ENOENT" ? null : er)
else
options.stat(p, function(er3, stats) {
options.stat(p, (er3, stats) => {
if (er3)
cb(er3.code === "ENOENT" ? null : er)
else if (stats.isDirectory())
Expand All @@ -187,7 +182,7 @@ function fixWinEPERM (p, options, er, cb) {
})
}

function fixWinEPERMSync (p, options, er) {
const fixWinEPERMSync = (p, options, er) => {
assert(p)
assert(options)
if (er)
Expand Down Expand Up @@ -218,7 +213,7 @@ function fixWinEPERMSync (p, options, er) {
options.unlinkSync(p)
}

function rmdir (p, options, originalEr, cb) {
const rmdir = (p, options, originalEr, cb) => {
assert(p)
assert(options)
if (originalEr)
Expand All @@ -228,7 +223,7 @@ function rmdir (p, options, originalEr, cb) {
// try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
// if we guessed wrong, and it's not a directory, then
// raise the original error.
options.rmdir(p, function (er) {
options.rmdir(p, er => {
if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM"))
rmkids(p, options, cb)
else if (er && er.code === "ENOTDIR")
Expand All @@ -238,20 +233,20 @@ function rmdir (p, options, originalEr, cb) {
})
}

function rmkids(p, options, cb) {
const rmkids = (p, options, cb) => {
assert(p)
assert(options)
assert(typeof cb === 'function')

options.readdir(p, function (er, files) {
options.readdir(p, (er, files) => {
if (er)
return cb(er)
let n = files.length
if (n === 0)
return options.rmdir(p, cb)
let errState
files.forEach(function (f) {
rimraf(path.join(p, f), options, function (er) {
files.forEach(f => {
rimraf(path.join(p, f), options, er => {
if (errState)
return
if (er)
Expand All @@ -266,7 +261,7 @@ function rmkids(p, options, cb) {
// this looks simpler, and is strictly *faster*, but will
// tie up the JavaScript thread and fail on excessively
// deep directory trees.
function rimrafSync (p, options) {
const rimrafSync = (p, options) => {
options = options || {}
defaults(options)

Expand Down Expand Up @@ -325,7 +320,7 @@ function rimrafSync (p, options) {
}
}

function rmdirSync (p, options, originalEr) {
const rmdirSync = (p, options, originalEr) => {
assert(p)
assert(options)
if (originalEr)
Expand All @@ -343,12 +338,10 @@ function rmdirSync (p, options, originalEr) {
}
}

function rmkidsSync (p, options) {
const rmkidsSync = (p, options) => {
assert(p)
assert(options)
options.readdirSync(p).forEach(function (f) {
rimrafSync(path.join(p, f), options)
})
options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options))

// We only end up here once we got ENOTEMPTY at least once, and
// at this point, we are guaranteed to have removed all the kids.
Expand All @@ -370,3 +363,6 @@ function rmkidsSync (p, options) {
}
} while (true)
}

module.exports = rimraf
rimraf.sync = rimrafSync

0 comments on commit d7e41a2

Please sign in to comment.