|  | 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'; | 
|  | }) | 
|  | ); | 
|  | } | 
|  | }; | 
|  | }; |