1 var chalk = require('chalk');
2 var _ = require('lodash');
3 var defaultFormatter = require('./formatter');
4 var util = require('./util');
6 module.exports = function(opts) {
7 var options = opts || {};
9 var formatter = options.formatter || defaultFormatter({
10 sortByPosition: (typeof options.sortByPosition !== 'undefined') ? options.sortByPosition : true,
11 positionless: options.positionless || 'first',
12 noIcon: options.noIcon,
13 noPlugin: options.noPlugin,
17 if (!options.plugins) {
19 pluginFilter = function() { return true; };
20 } else if (options.plugins.every(function(plugin) { return plugin[0] === '!'; })) {
22 pluginFilter = function(message) {
23 return options.plugins.indexOf('!' + message.plugin) === -1;
27 pluginFilter = function(message) {
28 return options.plugins.indexOf(message.plugin) !== -1;
32 var messageFilter = options.filter || function(message) { return (message.type === 'warning'); };
34 return function(css, result) {
35 var messagesToLog = result.messages
37 .filter(messageFilter);
39 var resultSource = (!result.root.source) ? ''
40 : result.root.source.input.file || result.root.source.input.id
42 var sourceGroupedMessages = _.groupBy(messagesToLog, function(message) {
43 return util.getLocation(message).file || resultSource;
47 _.forOwn(sourceGroupedMessages, function(messages, source) {
54 if (options.clearReportedMessages) {
55 result.messages = _.difference(result.messages, messagesToLog);
58 if (options.clearAllMessages) {
59 var messagesToClear = result.messages.filter(pluginFilter);
60 result.messages = _.difference(result.messages, messagesToClear);
68 if (options.throwError && shouldThrowError()) {
69 throw new Error(chalk.red.bold('\n** postcss-reporter: warnings or errors were found **'));
72 function shouldThrowError() {
75 && messagesToLog.some(function(message) {
76 return message.type === 'warning' || message.type === 'error';