UI for Zipcoin Blue

logger.js 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const util = require("util");
  4. const chalk_1 = require("chalk");
  5. const guards_1 = require("../../guards");
  6. const format_1 = require("./format");
  7. exports.LOGGER_STATUS_COLORS = new Map([
  8. ['debug', chalk_1.default.magenta.dim],
  9. ['info', chalk_1.default.gray],
  10. ['ok', chalk_1.default.green],
  11. ['warn', chalk_1.default.yellow],
  12. ['error', chalk_1.default.red],
  13. ['announce', chalk_1.default.cyan],
  14. ]);
  15. class Logger {
  16. constructor({ level = 'info', prefix = '', stream = process.stdout }) {
  17. this.firstLineColored = ['warn', 'error', 'announce'];
  18. this.level = level;
  19. this.prefix = prefix;
  20. this.stream = stream;
  21. }
  22. debug(msg) {
  23. this._log('debug', msg);
  24. }
  25. info(msg) {
  26. this._log('info', msg);
  27. }
  28. ok(msg) {
  29. this._log('ok', msg);
  30. }
  31. warn(msg) {
  32. this._log('warn', msg);
  33. }
  34. error(msg) {
  35. this._log('error', msg);
  36. }
  37. announce(msg) {
  38. this._log('announce', msg);
  39. }
  40. msg(msg) {
  41. if (typeof msg === 'function') {
  42. msg = msg();
  43. }
  44. this.stream.write(this.enforceLF(msg));
  45. }
  46. log(msg) {
  47. this.msg(msg);
  48. }
  49. nl(num = 1) {
  50. this.stream.write(this.enforceLF('\n'.repeat(num)));
  51. }
  52. shouldLog(level) {
  53. return guards_1.LOG_LEVELS.indexOf(level) >= guards_1.LOG_LEVELS.indexOf(this.level);
  54. }
  55. enforceLF(str) {
  56. return str.match(/[\r\n]$/) ? str : str + '\n';
  57. }
  58. getStatusColor(level) {
  59. const color = exports.LOGGER_STATUS_COLORS.get(level);
  60. if (!color) {
  61. return chalk_1.default.reset;
  62. }
  63. return color;
  64. }
  65. _log(level, msg) {
  66. if (this.shouldLog(level)) {
  67. let prefix = this.prefix;
  68. if (typeof msg === 'function') {
  69. msg = msg();
  70. }
  71. if (prefix) {
  72. if (typeof prefix === 'function') {
  73. prefix = prefix();
  74. }
  75. msg = util.format(prefix, msg);
  76. }
  77. const color = this.getStatusColor(level);
  78. const status = color.bold.bgBlack;
  79. const b = chalk_1.default.dim;
  80. const msgLines = format_1.wordWrap(msg, { indentation: level === 'info' ? 0 : level.length + 3 }).split('\n');
  81. if (msg.trim().includes('\n')) {
  82. msg = msgLines.map((l, i) => {
  83. // We want these log messages to stand out a bit, so automatically
  84. // color the first line and separate the first line from the other
  85. // lines if the message is multi-lined.
  86. if (i === 0 && this.firstLineColored.includes(level)) {
  87. return color(l) + (msgLines.length > 1 ? '\n' : '');
  88. }
  89. return l;
  90. }).join('\n') + '\n\n';
  91. }
  92. else {
  93. msg = msgLines.join('\n');
  94. }
  95. msg = this.enforceLF(msg);
  96. const fmtLevel = () => b('[') + status(level.toUpperCase()) + b(']');
  97. if (level !== 'info') {
  98. msg = `${fmtLevel()} ${msg}`;
  99. }
  100. this.stream.write(util.format(msg));
  101. }
  102. }
  103. }
  104. exports.Logger = Logger;