webgme-engine
Version:
WebGME server and Client API without a GUI
81 lines (64 loc) • 1.88 kB
JavaScript
/*eslint-env node*/
/*eslint no-bitwise: 0*/
/**
* @module EnsureDir
* @author lattmann / https://github.com/lattmann
* @author https://github.com/samxxu/ensureDir
*/
;
var path = require('path'),
fs = require('fs'),
Q = require('q');
function _ensureDir(dir, mode, callback) {
var existsFunction = fs.exists || path.exists;
existsFunction(dir, function (exists) {
if (exists) {
return callback(null);
}
var current = path.resolve(dir);
var parent = path.dirname(current);
_ensureDir(parent, mode, function (err) {
if (err) {
return callback(err);
}
fs.mkdir(current, mode, function (err) {
if (err) {
if (err.code === 'EEXIST') {
// this is ok as long as the directory exists
// FIXME: can it be a file?
callback(null);
return;
} else {
callback(err);
return;
}
}
callback(null);
});
});
});
}
/**
* ensure a directory exists, create it recursively if not.
*
* @param dir The directory you want to ensure it exists
* @param mode Refer to fs.mkdir()
* @param callback
*/
function ensureDir(dir, mode, callback) {
var deferred = Q.defer();
if (mode && typeof mode === 'function') {
callback = mode;
mode = null;
}
mode = mode || parseInt('0777', 8) & (~process.umask());
_ensureDir(dir, mode, function (err) {
if (err) {
deferred.reject(err);
} else {
deferred.resolve();
}
});
return deferred.promise.nodeify(callback);
}
module.exports = ensureDir;