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