logger.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. const chalk = require('chalk')
  2. const stripAnsi = require('strip-ansi')
  3. const readline = require('readline')
  4. const EventEmitter = require('events')
  5. const { stopSpinner } = require('./spinner')
  6. exports.events = new EventEmitter()
  7. function _log (type, tag, message) {
  8. if (process.env.VUE_CLI_API_MODE && message) {
  9. exports.events.emit('log', {
  10. message,
  11. type,
  12. tag
  13. })
  14. }
  15. }
  16. const format = (label, msg) => {
  17. return msg.split('\n').map((line, i) => {
  18. return i === 0
  19. ? `${label} ${line}`
  20. : line.padStart(stripAnsi(label).length)
  21. }).join('\n')
  22. }
  23. const chalkTag = msg => chalk.bgBlackBright.white.dim(` ${msg} `)
  24. exports.log = (msg = '', tag = null) => {
  25. tag ? console.log(format(chalkTag(tag), msg)) : console.log(msg)
  26. _log('log', tag, msg)
  27. }
  28. exports.info = (msg, tag = null) => {
  29. console.log(format(chalk.bgBlue.black(' INFO ') + (tag ? chalkTag(tag) : ''), msg))
  30. _log('info', tag, msg)
  31. }
  32. exports.done = (msg, tag = null) => {
  33. console.log(format(chalk.bgGreen.black(' DONE ') + (tag ? chalkTag(tag) : ''), msg))
  34. _log('done', tag, msg)
  35. }
  36. exports.warn = (msg, tag = null) => {
  37. console.warn(format(chalk.bgYellow.black(' WARN ') + (tag ? chalkTag(tag) : ''), chalk.yellow(msg)))
  38. _log('warn', tag, msg)
  39. }
  40. exports.error = (msg, tag = null) => {
  41. stopSpinner()
  42. console.error(format(chalk.bgRed(' ERROR ') + (tag ? chalkTag(tag) : ''), chalk.red(msg)))
  43. _log('error', tag, msg)
  44. if (msg instanceof Error) {
  45. console.error(msg.stack)
  46. _log('error', tag, msg.stack)
  47. }
  48. }
  49. exports.clearConsole = title => {
  50. if (process.stdout.isTTY) {
  51. const blank = '\n'.repeat(process.stdout.rows)
  52. console.log(blank)
  53. readline.cursorTo(process.stdout, 0, 0)
  54. readline.clearScreenDown(process.stdout)
  55. if (title) {
  56. console.log(title)
  57. }
  58. }
  59. }
  60. // silent all logs except errors during tests and keep record
  61. if (process.env.VUE_CLI_TEST) {
  62. require('./_silence')('logs', exports)
  63. }