log.js 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { isElement } from './utils/html.js';
  2. const LEVELS = {
  3. 'debug': 0,
  4. 'info': 1,
  5. 'warn': 2,
  6. 'error': 3,
  7. 'fatal': 4
  8. }
  9. /* eslint-disable @typescript-eslint/no-empty-function */
  10. const logger = Object.assign({
  11. 'debug': console?.log ? console.log.bind(console) : function noop () {},
  12. 'error': console?.log ? console.log.bind(console) : function noop () {},
  13. 'info': console?.log ? console.log.bind(console) : function noop () {},
  14. 'warn': console?.log ? console.log.bind(console) : function noop () {}
  15. }, console);
  16. /* eslint-enable @typescript-eslint/no-empty-function */
  17. /**
  18. * The log namespace
  19. * @namespace log
  20. */
  21. export default {
  22. /**
  23. * The the log-level, which determines how verbose the logging is.
  24. * @method log#setLogLevel
  25. * @param { string } level - The loglevel which allows for filtering of log messages
  26. */
  27. setLogLevel (level) {
  28. if (!['debug', 'info', 'warn', 'error', 'fatal'].includes(level)) {
  29. throw new Error(`Invalid loglevel: ${level}`);
  30. }
  31. this.loglevel = level;
  32. },
  33. /**
  34. * Logs messages to the browser's developer console.
  35. * Available loglevels are 0 for 'debug', 1 for 'info', 2 for 'warn',
  36. * 3 for 'error' and 4 for 'fatal'.
  37. * When using the 'error' or 'warn' loglevels, a full stacktrace will be
  38. * logged as well.
  39. * @method log#log
  40. * @param { string | Error } message - The message to be logged
  41. * @param { string } level - The loglevel which allows for filtering of log messages
  42. */
  43. log (message, level, style='') {
  44. if (LEVELS[level] < LEVELS[this.loglevel]) {
  45. return;
  46. }
  47. if (level === 'error' || level === 'fatal') {
  48. style = style || 'color: maroon';
  49. } else if (level === 'debug') {
  50. style = style || 'color: green';
  51. }
  52. if (message instanceof Error) {
  53. message = message.stack;
  54. } else if (isElement(message)) {
  55. message = message.outerHTML;
  56. }
  57. const prefix = style ? '%c' : '';
  58. if (level === 'error') {
  59. logger.error(`${prefix} ERROR: ${message}`, style);
  60. } else if (level === 'warn') {
  61. logger.warn(`${prefix} ${(new Date()).toISOString()} WARNING: ${message}`, style);
  62. } else if (level === 'fatal') {
  63. logger.error(`${prefix} FATAL: ${message}`, style);
  64. } else if (level === 'debug') {
  65. logger.debug(`${prefix} ${(new Date()).toISOString()} DEBUG: ${message}`, style);
  66. } else {
  67. logger.info(`${prefix} ${(new Date()).toISOString()} INFO: ${message}`, style);
  68. }
  69. },
  70. debug (message, style) {
  71. this.log(message, 'debug', style);
  72. },
  73. error (message, style) {
  74. this.log(message, 'error', style);
  75. },
  76. info (message, style) {
  77. this.log(message, 'info', style);
  78. },
  79. warn (message, style) {
  80. this.log(message, 'warn', style);
  81. },
  82. fatal (message, style) {
  83. this.log(message, 'fatal', style);
  84. }
  85. }