bigint-crypto-utils/node_modules/mkdirp2/index.js

108 lines
2.3 KiB
JavaScript

var path = require('path')
var fs = require('fs')
var _0777 = parseInt('0777', 8)
module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP
function mkdirP (p, opts, f, made) {
if (typeof opts === 'function') {
f = opts
opts = {}
} else if (!opts || typeof opts !== 'object') {
opts = { mode: opts }
}
var mode = opts.mode
var xfs = opts.fs || fs
if (mode === undefined) {
mode = _0777 & (~process.umask())
}
if (!made) made = null
var cb = f || function () {}
p = path.resolve(p)
xfs.mkdir(p, mode, function (er) {
if (!er) {
made = made || p
return cb(null, made)
}
switch (er.code) {
case 'ENOENT':
mkdirP(path.dirname(p), opts, function (er, made) {
if (er) cb(er, made)
else mkdirP(p, opts, cb, made)
})
break
// In the case of any other error, just see if there's a dir
// there already. If so, then hooray! If not, then something
// is borked.
default:
xfs.stat(p, function (er2, stat) {
// if the stat fails, then that's super weird.
// let the original error be the failure reason.
if (er2 || !stat.isDirectory()) cb(er, made)
else cb(null, made)
})
break
}
})
}
mkdirP.sync = function sync (p, opts, made) {
if (!opts || typeof opts !== 'object') {
opts = { mode: opts }
}
var mode = opts.mode
var xfs = opts.fs || fs
if (mode === undefined) {
mode = _0777 & (~process.umask())
}
if (!made) made = null
p = path.resolve(p)
try {
xfs.mkdirSync(p, mode)
made = made || p
} catch (err0) {
switch (err0.code) {
case 'ENOENT' :
made = sync(path.dirname(p), opts, made)
sync(p, opts, made)
break
// In the case of any other error, just see if there's a dir
// there already. If so, then hooray! If not, then something
// is borked.
default:
var stat
try {
stat = xfs.statSync(p)
} catch (err1) {
throw err0
}
if (!stat.isDirectory()) throw err0
break
}
}
return made
}
mkdirP.promise = function (p, opts) {
return new Promise(function (resolve, reject) {
mkdirP(p, opts, function (err) {
if (err) {
reject(err)
} else {
resolve()
}
})
})
}