82 lines
2.3 KiB
JavaScript
82 lines
2.3 KiB
JavaScript
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';
|
|
})
|
|
);
|
|
}
|
|
};
|
|
};
|