gulp-fs-cache
Version:
Gulp plugin for caching processed files to filesystem
131 lines (98 loc) • 2.98 kB
JavaScript
;
var crypto = require('crypto');
var fs = require('fs');
var path = require('path');
var async = require('async');
var through = require('through2');
var fsExtra = require('fs-extra');
var gutil = require('gulp-util');
function gulpFsCache(basePath) {
var filesChecksums = {};
var cachedFiles = [];
function cacheFilePath(filePath, checksum) {
var pathHash = crypto.createHash('md5').update(filePath).digest('hex');
return path.join(basePath, pathHash + '-' + checksum);
}
function transform(file, enc, callback) {
var _this = this;
if (file.isNull()) {
return callback(null, file);
}
if (file.isStream()) {
return callback(new gutil.PluginError('gulp-fs-cache', {
message: file.path + ': Streaming not supported'
}));
}
var checksum = file.checksum;
if (!checksum) {
var contents = file.contents.toString('utf8');
checksum = crypto.createHash('md5').update(contents).digest('hex');
}
var cachePath = cacheFilePath(file.path, checksum);
fs.stat(cachePath, function (err) {
if (err) {
filesChecksums[file.path] = checksum;
_this.push(file);
callback();
} else {
cachedFiles.push({
file: file,
checksum: checksum
});
callback();
}
});
}
var stream = through.obj(transform);
function restoreTransform(file, enc, callback) {
var _this = this;
var checksum = filesChecksums[file.path];
var cachePath = cacheFilePath(file.path, checksum);
fsExtra.outputFile(cachePath, file.contents, function (err) {
if (err != null) {
return callback(err);
}
if (file.sourceMap) {
var sourceMapCachePath = cachePath + '.map';
fsExtra.outputJson(sourceMapCachePath, file.sourceMap, function (err) {
if (err != null) {
return callback(err);
}
_this.push(file);
callback();
});
} else {
_this.push(file);
callback();
}
});
}
function restoreFlush(callback) {
var _this = this;
async.each(cachedFiles, function (cachedFile, cb) {
var file = cachedFile.file;
var checksum = cachedFile.checksum;
var cachePath = cacheFilePath(file.path, checksum);
fsExtra.readFile(cachePath, function (err, contents) {
if (err != null) {
return cb(err);
}
file.contents = contents;
var sourceMapCachePath = cachePath + '.map';
fsExtra.readJson(sourceMapCachePath, function (err, sourceMap) {
if (err == null) {
file.sourceMap = sourceMap;
}
_this.push(file);
cb();
});
});
}, function (err) {
callback(err);
});
}
var restoreStream = through.obj(restoreTransform, restoreFlush);
stream.restore = restoreStream;
return stream;
}
module.exports = gulpFsCache;