log.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /** @typedef {"info" | "warning" | "error"} LogLevel */
  2. /** @type {LogLevel} */
  3. var logLevel = "info";
  4. function dummy() {}
  5. /**
  6. * @param {LogLevel} level log level
  7. * @returns {boolean} true, if should log
  8. */
  9. function shouldLog(level) {
  10. var shouldLog =
  11. (logLevel === "info" && level === "info") ||
  12. (["info", "warning"].indexOf(logLevel) >= 0 && level === "warning") ||
  13. (["info", "warning", "error"].indexOf(logLevel) >= 0 && level === "error");
  14. return shouldLog;
  15. }
  16. /**
  17. * @param {(msg?: string) => void} logFn log function
  18. * @returns {(level: LogLevel, msg?: string) => void} function that logs when log level is sufficient
  19. */
  20. function logGroup(logFn) {
  21. return function (level, msg) {
  22. if (shouldLog(level)) {
  23. logFn(msg);
  24. }
  25. };
  26. }
  27. /**
  28. * @param {LogLevel} level log level
  29. * @param {string|Error} msg message
  30. */
  31. module.exports = function (level, msg) {
  32. if (shouldLog(level)) {
  33. if (level === "info") {
  34. console.log(msg);
  35. } else if (level === "warning") {
  36. console.warn(msg);
  37. } else if (level === "error") {
  38. console.error(msg);
  39. }
  40. }
  41. };
  42. /* eslint-disable node/no-unsupported-features/node-builtins */
  43. var group = console.group || dummy;
  44. var groupCollapsed = console.groupCollapsed || dummy;
  45. var groupEnd = console.groupEnd || dummy;
  46. /* eslint-enable node/no-unsupported-features/node-builtins */
  47. module.exports.group = logGroup(group);
  48. module.exports.groupCollapsed = logGroup(groupCollapsed);
  49. module.exports.groupEnd = logGroup(groupEnd);
  50. /**
  51. * @param {LogLevel} level log level
  52. */
  53. module.exports.setLogLevel = function (level) {
  54. logLevel = level;
  55. };
  56. /**
  57. * @param {Error} err error
  58. * @returns {string} formatted error
  59. */
  60. module.exports.formatError = function (err) {
  61. var message = err.message;
  62. var stack = err.stack;
  63. if (!stack) {
  64. return message;
  65. } else if (stack.indexOf(message) < 0) {
  66. return message + "\n" + stack;
  67. } else {
  68. return stack;
  69. }
  70. };