|
|
var path = require('path'); var fs = require('fs');
module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP;
function mkdirP (p, mode, f, made) { if (typeof mode === 'function' || mode === undefined) { f = mode; mode = 0777 & (~process.umask()); } if (!made) made = null;
var cb = f || function () {}; if (typeof mode === 'string') mode = parseInt(mode, 8); p = path.resolve(p);
fs.mkdir(p, mode, function (er) { if (!er) { made = made || p; return cb(null, made); } switch (er.code) { case 'ENOENT': mkdirP(path.dirname(p), mode, function (er, made) { if (er) cb(er, made); else mkdirP(p, mode, 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: fs.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, mode, made) { if (mode === undefined) { mode = 0777 & (~process.umask()); } if (!made) made = null;
if (typeof mode === 'string') mode = parseInt(mode, 8); p = path.resolve(p);
try { fs.mkdirSync(p, mode); made = made || p; } catch (err0) { switch (err0.code) { case 'ENOENT' : made = sync(path.dirname(p), mode, made); sync(p, mode, 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 = fs.statSync(p); } catch (err1) { throw err0; } if (!stat.isDirectory()) throw err0; break; } }
return made; };
|