{"version":3,"file":"log-browser-factory.cjs","names":["browserSupportsColors","getGlobalConsole","useNamespaceFilter","parseLogLevel","browserSelectColorByName","LoggerHandlerNoop"],"sources":["../../../src/browser/log/log-browser-factory.ts"],"sourcesContent":["import type { LoggerInterface, LogHandlerOptions, LogLevel, LogLevelAliasType } from '../../common/log/log-base'\nimport { LogLevelAll, LogLevelDebug, LogLevelError, LogLevelFatal, LogLevelInfo, LogLevelOff, LogLevelWarn } from '../../common/log/log-base'\nimport { browserSelectColorByName } from '../../common/log/log-colors'\nimport { getGlobalConsole } from '../../common/log/log-console-original'\nimport { parseLogLevel, useNamespaceFilter } from '../../common/log/log-filter'\nimport { LoggerHandlerNoop } from '../../common/log/log-noop'\nimport { browserSupportsColors } from './log-colors'\n\n/**\n * Directly use console calls, this has the advantage to show the original source of the call\n * i.e. it is possible to jump right into the code from the browser console logs. But other\n * loggers will not work any more.\n */\nexport function LoggerBrowserSetupDebugFactory(opt: LogHandlerOptions = {}) {\n  const filter = opt.filter ?? (\n    typeof localStorage !== 'undefined'\n      ? (localStorage.zeed ?? localStorage.debug)\n      : undefined)\n\n  const styleFont = 'font-family: \"JetBrains Mono\", Menlo; font-size: 11px;'\n  const styleDefault = `${styleFont}`\n  const styleBold = `font-weight: 600; ${styleFont}`\n  const useColors = browserSupportsColors()\n\n  // logCaptureConsole will override the console methods, so we need to get the original ones\n  const originalConsole = getGlobalConsole()\n\n  /**\n   * The trick is, that console called directly provides a reference to the source code.\n   * For the regular implementation this information is lost. But this approach has other\n   * drawbacks, therefore only use it in the Browser when actively debugging.\n   */\n  return function LoggerBrowserDebugFactory(\n    name = '',\n    logLevel?: LogLevelAliasType,\n  ): LoggerInterface {\n    let log: LoggerInterface\n\n    const matches = useNamespaceFilter(filter)\n    const level = parseLogLevel(logLevel ?? LogLevelAll)\n\n    if (matches(name) && level !== LogLevelOff && originalConsole) {\n      const fixedArgs: string[] = []\n      if (useColors) {\n        const color = browserSelectColorByName(name)\n        fixedArgs.push(`%c${name.padEnd(16, ' ')}%c \\t%s`)\n        fixedArgs.push(`color:${color}; ${styleBold}`)\n        fixedArgs.push(styleDefault)\n      }\n      else {\n        fixedArgs.push(`[${name}] \\t%s`)\n      }\n\n      function defineForLogLevel(fnLevel: LogLevel, fn: any) {\n        if (level <= fnLevel)\n          return fn\n        return () => {}\n      }\n\n      log = defineForLogLevel(LogLevelDebug, originalConsole.debug.bind(originalConsole.console, ...fixedArgs) as LoggerInterface)\n      log.debug = defineForLogLevel(LogLevelDebug, originalConsole.debug.bind(originalConsole.console, ...fixedArgs))\n      log.info = defineForLogLevel(LogLevelInfo, originalConsole.info.bind(originalConsole.console, ...fixedArgs))\n      log.warn = defineForLogLevel(LogLevelWarn, originalConsole.warn.bind(originalConsole.console, ...fixedArgs))\n      log.error = defineForLogLevel(LogLevelError, originalConsole.error.bind(originalConsole.console, ...fixedArgs))\n\n      // /**\n      //  * Takes log level as argument, but will fail to show all the debug info\n      //  * as the others do like file name and line number of the originating call\n      //  */\n      // log.generic = (logLevel: LogLevel, ...args) => {\n      //   if (level <= logLevel) {\n      //     if (logLevel === LogLevelError)\n      //       originalConsole.error(...fixedArgs, ...args)\n      //     else if (logLevel === LogLevelWarn)\n      //       originalConsole.warn(...fixedArgs, ...args)\n      //     else if (logLevel === LogLevelInfo)\n      //       originalConsole.info(...fixedArgs, ...args)\n      //     else\n      //       originalConsole.debug(...fixedArgs, ...args)\n      //   }\n      // }\n\n      log.fatal = defineForLogLevel(LogLevelFatal, (...args: any) => {\n        log.error(...args)\n        throw new Error(`${args.map(String).join(' ')}`)\n      })\n\n      log.assert = defineForLogLevel(LogLevelFatal, (condition: unknown, ...args: any) => {\n        if (condition == null || (typeof condition === 'number' && Number.isNaN(condition)) || !condition)\n          log.fatal(...args)\n      })\n    }\n    else {\n      log = LoggerHandlerNoop()\n    }\n\n    log.extend = (subName: string) => {\n      return LoggerBrowserDebugFactory(name ? `${name}:${subName}` : subName)\n    }\n\n    log.label = name\n\n    return log\n  }\n}\n\n// /** @deprecated This output is default for initial use of Logger in browser environments. */\n// export function activateConsoleDebug(_opt: LogHandlerOptions = {}) {\n//   console.info('activateConsoleDebug is activated by default in browsers')\n//   //   Logger.setHandlers([LoggerBrowserHandler(opt)]) // Fallback for previously registered Loggers\n//   //   Logger.setFactory(LoggerBrowserSetupDebugFactory(opt))\n// }\n\n// let klass = console\n// let debug = console.debug.bind(window.console, klass.toString() + \": \")\n\n// debug(\"test\")\n// console.debug(\"test2\")\n\n// let dd\n// if (Function.prototype.bind) {\n//   dd = Function.prototype.bind.call(console.log, console)\n// } else {\n//   dd = function () {\n//     Function.prototype.apply.call(console.log, console, arguments)\n//   }\n// }\n\n// dd(\"dd\")\n\n// let c = 1\n// Object.defineProperty(window, \"log2\", {\n//   get: () => {\n//     return console.log.bind(\n//       window.console,\n//       \"%c[log]%c %s\" + c++,\n//       \"color:red\",\n//       \"\"\n//     )\n//   },\n// })\n\n// // usage:\n// log2(\"Back to the future\")\n// log2(\"Back to the future\")\n\n// let plog = new Proxy(console.debug, {\n//   apply: function (target, that, args) {\n//     target.apply(that, args)\n//     // base.apply(that, args);\n//   },\n// })\n\n// let cons = console.debug\n// let plog = (...args) => {\n//   cons.apply(window.console, [\"|\", ...args])\n// }\n\n// plog(\"xxx\")\n\n// function a() {\n//   var err = new Error()\n//   var caller_line = err.stack.split(\"\\n\")[2]\n//   var index = caller_line.indexOf(\"at \")\n//   var clean = caller_line.slice(index + 2, caller_line.length)\n//   clean = clean.replace(/\\?t=\\d+/, \"\").replace(\"@fs/\", \"\")\n//   console.log(clean)\n//   console.log(\n//     \"http://localhost:8080/Users/dirk/work/viidoo/lib/src/browser/log-browser.ts:188:1 log-browser.ts:291:10\"\n//   )\n// }\n// function b() {\n//   a()\n// }\n// b()\n"],"mappings":";;;;;;;;;;;;;;AAaA,SAAgB,+BAA+B,MAAyB,EAAE,EAAE;CAC1E,MAAM,SAAS,IAAI,WACjB,OAAO,iBAAiB,cACnB,aAAa,QAAQ,aAAa,QACnC;CAEN,MAAM,YAAY;CAClB,MAAM,eAAe,GAAG;CACxB,MAAM,YAAY,qBAAqB;CACvC,MAAM,YAAYA,sDAAuB;CAGzC,MAAM,kBAAkBC,0DAAkB;;;;;;AAO1C,QAAO,SAAS,0BACd,OAAO,IACP,UACiB;EACjB,IAAI;EAEJ,MAAM,UAAUC,iDAAmB,OAAO;EAC1C,MAAM,QAAQC,4CAAc,eAAwB;AAEpD,MAAI,QAAQ,KAAK,IAAI,8BAAyB,iBAAiB;GAC7D,MAAM,YAAsB,EAAE;AAC9B,OAAI,WAAW;IACb,MAAM,QAAQC,uDAAyB,KAAK;AAC5C,cAAU,KAAK,KAAK,KAAK,OAAO,IAAI,IAAI,CAAC,SAAS;AAClD,cAAU,KAAK,SAAS,MAAM,IAAI,YAAY;AAC9C,cAAU,KAAK,aAAa;SAG5B,WAAU,KAAK,IAAI,KAAK,QAAQ;GAGlC,SAAS,kBAAkB,SAAmB,IAAS;AACrD,QAAI,SAAS,QACX,QAAO;AACT,iBAAa;;AAGf,SAAM,qBAAiC,gBAAgB,MAAM,KAAK,gBAAgB,SAAS,GAAG,UAAU,CAAoB;AAC5H,OAAI,QAAQ,qBAAiC,gBAAgB,MAAM,KAAK,gBAAgB,SAAS,GAAG,UAAU,CAAC;AAC/G,OAAI,OAAO,qBAAgC,gBAAgB,KAAK,KAAK,gBAAgB,SAAS,GAAG,UAAU,CAAC;AAC5G,OAAI,OAAO,qBAAgC,gBAAgB,KAAK,KAAK,gBAAgB,SAAS,GAAG,UAAU,CAAC;AAC5G,OAAI,QAAQ,qBAAiC,gBAAgB,MAAM,KAAK,gBAAgB,SAAS,GAAG,UAAU,CAAC;AAmB/G,OAAI,QAAQ,sBAAkC,GAAG,SAAc;AAC7D,QAAI,MAAM,GAAG,KAAK;AAClB,UAAM,IAAI,MAAM,GAAG,KAAK,IAAI,OAAO,CAAC,KAAK,IAAI,GAAG;KAChD;AAEF,OAAI,SAAS,sBAAkC,WAAoB,GAAG,SAAc;AAClF,QAAI,aAAa,QAAS,OAAO,cAAc,YAAY,OAAO,MAAM,UAAU,IAAK,CAAC,UACtF,KAAI,MAAM,GAAG,KAAK;KACpB;QAGF,OAAMC,+CAAmB;AAG3B,MAAI,UAAU,YAAoB;AAChC,UAAO,0BAA0B,OAAO,GAAG,KAAK,GAAG,YAAY,QAAQ;;AAGzE,MAAI,QAAQ;AAEZ,SAAO"}