| var chalk = require('chalk'); |
| var path = require('path'); |
| var symbols = require('log-symbols'); |
| var _ = require('lodash'); |
| var util = require('./util'); |
| |
| module.exports = function(opts) { |
| var options = opts || {}; |
| var sortByPosition = (typeof options.sortByPosition !== 'undefined') ? options.sortByPosition : true; |
| var positionless = options.positionless || 'first'; |
| |
| return function(input) { |
| var messages = input.messages.filter(function(message) { |
| return typeof message.text === 'string'; |
| }); |
| var source = input.source; |
| |
| if (!messages.length) return ''; |
| |
| var orderedMessages = _.sortBy( |
| messages, |
| function(m) { |
| if (!m.line) return 1; |
| if (positionless === 'any') return 1; |
| if (positionless === 'first') return 2; |
| if (positionless === 'last') return 0; |
| }, |
| function(m) { |
| if (!sortByPosition) return 1; |
| return m.line; |
| }, |
| function(m) { |
| if (!sortByPosition) return 1; |
| return m.column; |
| } |
| ); |
| |
| var output = '\n'; |
| |
| if (source) { |
| output += chalk.bold.underline(logFrom(source)) + '\n'; |
| } |
| |
| orderedMessages.forEach(function(w) { |
| output += messageToString(w) + '\n'; |
| }); |
| |
| return output; |
| |
| function messageToString(message) { |
| var location = util.getLocation(message); |
| var str = ''; |
| |
| if (location.line) { |
| str += chalk.bold(location.line); |
| } |
| |
| if (location.column) { |
| str += chalk.bold(':' + location.column) |
| } |
| |
| if (location.line || location.column) { |
| str += '\t'; |
| } |
| |
| if (!options.noIcon && message.type === 'warning') { |
| str += chalk.yellow(symbols.warning + ' '); |
| } |
| |
| str += message.text; |
| if (!options.noPlugin) { |
| str += chalk.yellow(' [' + message.plugin + ']'); |
| } |
| return str; |
| } |
| |
| function logFrom(fromValue) { |
| if (fromValue.charAt(0) === '<') return fromValue; |
| return path.relative(process.cwd(), fromValue).split(path.sep).join('/'); |
| } |
| }; |
| }; |