gulp-diff
Version:
Show diffs for files in the stream against those in a target directory
90 lines (82 loc) • 2.47 kB
JavaScript
var through2 = require('through2');
var diffLines = require('diff').diffLines;
var clc = require('cli-color');
var fs = require('fs');
var path = require('path');
var PluginError = require('gulp-util').PluginError;
function pluginError(msg) {
return new PluginError('gulp-diff', msg);
}
var diff = function diff(dest) {
var stream = through2.obj(function(file, enc, cb) {
if (file.isNull()) {
return cb(null, file);
}
var compareFile = path.resolve(dest || file.base, file.relative);
fs.stat(compareFile, function(errStat, stat) {
if (errStat) {
stream.emit('error', pluginError('Failed to stat file: ' + errStat.message));
return cb();
}
if (stat && !stat.isDirectory()) {
fs.readFile(compareFile, 'utf8', function(errRead, contents) {
if (errRead) {
stream.emit('error', pluginError('Failed to read file: ' + errRead.message));
return cb();
}
if (contents !== String(file.contents)) {
try {
file.diff = diffLines(fs.readFileSync(compareFile, 'utf8'), String(file.contents));
} catch (err) {
stream.emit('error', pluginError('Failed to diff file: ' + err.message));
return cb();
}
}
return cb(null, file);
});
} else {
if (!stat) {
stream.emit('error', pluginError('Failed to find file: ' + compareFile));
return cb();
} else {
return cb(null, file);
}
}
});
});
return stream;
};
var reporter = function reporter(opts) {
opts = opts || {};
return through2.obj(function(file, enc, cb) {
if (file.diff && Object.keys(file.diff).length) {
if (!opts.quiet) {
console.log('\n' + clc.underline(file.path), '\n');
console.log(file.diff.map(formatLine).join(''));
}
if (opts.fail) {
this.emit('error', pluginError('Files differ'));
}
}
return cb(null, file);
});
};
function formatLine(part, i) {
var indent = ' ';
return (!i ? indent : '') + part.value.split('\n').map(function(ln) {
return clc[colorLine(part)](ln);
}).join('\n' + indent);
}
function colorLine(ln) {
if (ln.added) {
return 'bgGreen';
}
if (ln.removed) {
return 'bgRed';
}
return 'blackBright';
}
module.exports = diff;
module.exports.reporter = reporter;
module.exports.diff = diff;
;