.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / postcss-reporter / lib / reporter.js
1 var chalk = require('chalk');
2 var _ = require('lodash');
3 var defaultFormatter = require('./formatter');
4 var util = require('./util');
5
6 module.exports = function(opts) {
7   var options = opts || {};
8
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,
14   });
15
16   var pluginFilter;
17   if (!options.plugins) {
18     // Every plugin
19     pluginFilter = function() { return true; };
20   } else if (options.plugins.every(function(plugin) { return plugin[0] === '!'; })) {
21     // Blacklist
22     pluginFilter = function(message) {
23       return options.plugins.indexOf('!' + message.plugin) === -1;
24     };
25   } else {
26     // Whitelist
27     pluginFilter = function(message) {
28       return options.plugins.indexOf(message.plugin) !== -1;
29     };
30   }
31
32   var messageFilter = options.filter || function(message) { return (message.type === 'warning'); };
33
34   return function(css, result) {
35     var messagesToLog = result.messages
36       .filter(pluginFilter)
37       .filter(messageFilter);
38
39     var resultSource = (!result.root.source) ? ''
40       : result.root.source.input.file || result.root.source.input.id
41
42     var sourceGroupedMessages = _.groupBy(messagesToLog, function(message) {
43       return util.getLocation(message).file || resultSource;
44     });
45
46     var report = '';
47     _.forOwn(sourceGroupedMessages, function(messages, source) {
48       report += formatter({
49         messages: messages,
50         source: source,
51       });
52     });
53
54     if (options.clearReportedMessages) {
55       result.messages = _.difference(result.messages, messagesToLog);
56     }
57
58     if (options.clearAllMessages) {
59       var messagesToClear = result.messages.filter(pluginFilter);
60       result.messages = _.difference(result.messages, messagesToClear);
61     }
62
63
64     if (!report) return;
65
66     console.log(report);
67
68     if (options.throwError && shouldThrowError()) {
69       throw new Error(chalk.red.bold('\n** postcss-reporter: warnings or errors were found **'));
70     }
71
72     function shouldThrowError() {
73       return (
74         messagesToLog.length
75         && messagesToLog.some(function(message) {
76           return message.type === 'warning' || message.type === 'error';
77         })
78       );
79     }
80   };
81 };