blob: 70781fba073b2506a0cad7479d5babdab0042714 [file] [log] [blame]
var chalk = require('chalk');
var _ = require('lodash');
var defaultFormatter = require('./formatter');
var util = require('./util');
module.exports = function(opts) {
var options = opts || {};
var formatter = options.formatter || defaultFormatter({
sortByPosition: (typeof options.sortByPosition !== 'undefined') ? options.sortByPosition : true,
positionless: options.positionless || 'first',
noIcon: options.noIcon,
noPlugin: options.noPlugin,
});
var pluginFilter;
if (!options.plugins) {
// Every plugin
pluginFilter = function() { return true; };
} else if (options.plugins.every(function(plugin) { return plugin[0] === '!'; })) {
// Blacklist
pluginFilter = function(message) {
return options.plugins.indexOf('!' + message.plugin) === -1;
};
} else {
// Whitelist
pluginFilter = function(message) {
return options.plugins.indexOf(message.plugin) !== -1;
};
}
var messageFilter = options.filter || function(message) { return (message.type === 'warning'); };
return function(css, result) {
var messagesToLog = result.messages
.filter(pluginFilter)
.filter(messageFilter);
var resultSource = (!result.root.source) ? ''
: result.root.source.input.file || result.root.source.input.id
var sourceGroupedMessages = _.groupBy(messagesToLog, function(message) {
return util.getLocation(message).file || resultSource;
});
var report = '';
_.forOwn(sourceGroupedMessages, function(messages, source) {
report += formatter({
messages: messages,
source: source,
});
});
if (options.clearReportedMessages) {
result.messages = _.difference(result.messages, messagesToLog);
}
if (options.clearAllMessages) {
var messagesToClear = result.messages.filter(pluginFilter);
result.messages = _.difference(result.messages, messagesToClear);
}
if (!report) return;
console.log(report);
if (options.throwError && shouldThrowError()) {
throw new Error(chalk.red.bold('\n** postcss-reporter: warnings or errors were found **'));
}
function shouldThrowError() {
return (
messagesToLog.length
&& messagesToLog.some(function(message) {
return message.type === 'warning' || message.type === 'error';
})
);
}
};
};