Files
2016-05-06 10:53:55 +02:00

171 lines
3.7 KiB
JavaScript

var fs = require('graceful-fs');
var mkdirp = require('mkdirp');
var destroy = require('destroy');
var rmdir = require('rmdir');
var tmp = require('tmp');
var request = require('request');
var path = require('path');
var cp = require('cp');
var cpr = require('cpr');
var Promise = require('./promise');
// Write a stream to a file
function writeStream(filename, st) {
var d = Promise.defer();
var wstream = fs.createWriteStream(filename);
var cleanup = function() {
destroy(wstream);
wstream.removeAllListeners();
};
wstream.on('finish', function () {
cleanup();
d.resolve();
});
wstream.on('error', function (err) {
cleanup();
d.reject(err);
});
st.on('error', function(err) {
cleanup();
d.reject(err);
});
st.pipe(wstream);
return d.promise;
}
// Return a promise resolved with a boolean
function fileExists(filename) {
var d = Promise.defer();
fs.exists(filename, function(exists) {
d.resolve(exists);
});
return d.promise;
}
// Generate temporary file
function genTmpFile(opts) {
return Promise.nfcall(tmp.file, opts)
.get(0);
}
// Generate temporary dir
function genTmpDir(opts) {
return Promise.nfcall(tmp.dir, opts)
.get(0);
}
// Download an image
function download(uri, dest) {
return writeStream(dest, request(uri));
}
// Find a filename available in a folder
function uniqueFilename(base, filename) {
var ext = path.extname(filename);
filename = path.resolve(base, filename);
filename = path.join(path.dirname(filename), path.basename(filename, ext));
var _filename = filename+ext;
var i = 0;
while (fs.existsSync(filename)) {
_filename = filename + '_' + i + ext;
i = i + 1;
}
return Promise(path.relative(base, _filename));
}
// Create all required folder to create a file
function ensureFile(filename) {
var base = path.dirname(filename);
return Promise.nfcall(mkdirp, base);
}
// Remove a folder
function rmDir(base) {
return Promise.nfcall(rmdir, base, {
fs: fs
});
}
/**
Assert a file, if it doesn't exist, call "generator"
@param {String} filePath
@param {Function} generator
@return {Promise}
*/
function assertFile(filePath, generator) {
return fileExists(filePath)
.then(function(exists) {
if (exists) return;
return generator();
});
}
/**
Pick a file, returns the absolute path if exists, undefined otherwise
@param {String} rootFolder
@param {String} fileName
@return {String}
*/
function pickFile(rootFolder, fileName) {
var result = path.join(rootFolder, fileName);
if (fs.existsSync(result)) {
return result;
}
return undefined;
}
/**
Ensure that a directory exists and is empty
@param {String} folder
@return {Promise}
*/
function ensureFolder(rootFolder) {
return rmDir(rootFolder)
.fail(function() {
return Promise();
})
.then(function() {
return Promise.nfcall(mkdirp, rootFolder);
});
}
module.exports = {
exists: fileExists,
existsSync: fs.existsSync,
mkdirp: Promise.nfbind(mkdirp),
readFile: Promise.nfbind(fs.readFile),
writeFile: Promise.nfbind(fs.writeFile),
assertFile: assertFile,
pickFile: pickFile,
stat: Promise.nfbind(fs.stat),
statSync: fs.statSync,
readdir: Promise.nfbind(fs.readdir),
writeStream: writeStream,
readStream: fs.createReadStream,
copy: Promise.nfbind(cp),
copyDir: Promise.nfbind(cpr),
tmpFile: genTmpFile,
tmpDir: genTmpDir,
download: download,
uniqueFilename: uniqueFilename,
ensureFile: ensureFile,
ensureFolder: ensureFolder,
rmDir: rmDir
};