{"version":3,"file":"index.mjs","sources":["../lib/contracts.ts","../lib/ConsoleLogger.ts","../lib/LoggerBuilder.ts","../lib/index.ts"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\nexport enum LogLevel {\n\tDebug = 0,\n\tInfo = 1,\n\tWarn = 2,\n\tError = 3,\n\tFatal = 4,\n}\n\nexport type IContext = Record<string, unknown>\n\nexport interface ILogger {\n\tdebug(message: string | Error, context?: IContext): void\n\tinfo(message: string | Error, context?: IContext): void\n\twarn(message: string | Error, context?: IContext): void\n\terror(message: string | Error, context?: IContext): void\n\tfatal(message: string | Error, context?: IContext): void\n}\n\nexport interface ILoggerFactory {\n\t(context?: IContext): ILogger\n}\n","/**\n * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\nimport { IContext, ILogger, LogLevel } from './contracts'\n\nexport class ConsoleLogger implements ILogger {\n\n\tprivate context: IContext\n\n\tconstructor(context?: IContext) {\n\t\tthis.context = context || {}\n\t}\n\n\tprivate formatMessage(message: string|Error, level: LogLevel, context?: IContext): string {\n\t\tlet msg = '[' + LogLevel[level].toUpperCase() + '] '\n\n\t\tif (context && context.app) {\n\t\t\tmsg += context.app + ': '\n\t\t}\n\n\t\tif (typeof message === 'string') return msg + message\n\n\t\t// basic error formatting\n\t\tmsg += `Unexpected ${message.name}`\n\t\tif (message.message) msg += ` \"${message.message}\"`\n\t\t// only add stack trace when debugging\n\t\tif (level === LogLevel.Debug && message.stack) msg += `\\n\\nStack trace:\\n${message.stack}`\n\n\t\treturn msg\n\t}\n\n\tlog(level: LogLevel, message: string|Error, context: IContext) {\n\t\t// Skip if level is configured and this is below the level\n\t\tif (typeof this.context?.level === 'number' && level < this.context?.level) {\n\t\t\treturn\n\t\t}\n\n\t\t// Add error object to context\n\t\tif (typeof message === 'object' && context?.error === undefined) {\n\t\t\tcontext.error = message\n\t\t}\n\n\t\tswitch (level) {\n\t\tcase LogLevel.Debug:\n\t\t\tconsole.debug(this.formatMessage(message, LogLevel.Debug, context), context)\n\t\t\tbreak\n\t\tcase LogLevel.Info:\n\t\t\tconsole.info(this.formatMessage(message, LogLevel.Info, context), context)\n\t\t\tbreak\n\t\tcase LogLevel.Warn:\n\t\t\tconsole.warn(this.formatMessage(message, LogLevel.Warn, context), context)\n\t\t\tbreak\n\t\tcase LogLevel.Error:\n\t\t\tconsole.error(this.formatMessage(message, LogLevel.Error, context), context)\n\t\t\tbreak\n\t\tcase LogLevel.Fatal:\n\t\tdefault:\n\t\t\tconsole.error(this.formatMessage(message, LogLevel.Fatal, context), context)\n\t\t\tbreak\n\t\t}\n\t}\n\n\tdebug(message: string|Error, context?: IContext): void {\n\t\tthis.log(LogLevel.Debug, message, Object.assign({}, this.context, context))\n\t}\n\n\tinfo(message: string|Error, context?: IContext): void {\n\t\tthis.log(LogLevel.Info, message, Object.assign({}, this.context, context))\n\t}\n\n\twarn(message: string|Error, context?: IContext): void {\n\t\tthis.log(LogLevel.Warn, message, Object.assign({}, this.context, context))\n\t}\n\n\terror(message: string|Error, context?: IContext): void {\n\t\tthis.log(LogLevel.Error, message, Object.assign({}, this.context, context))\n\t}\n\n\tfatal(message: string|Error, context?: IContext): void {\n\t\tthis.log(LogLevel.Fatal, message, Object.assign({}, this.context, context))\n\t}\n\n}\n\n/**\n * Create a new console logger\n *\n * @param context Optional global context which should be included for all logging messages\n */\nexport function buildConsoleLogger(context?: IContext): ILogger {\n\treturn new ConsoleLogger(context)\n}\n","/**\n * SPDX-FileCopyrightText: 2020-2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { IContext, ILogger, ILoggerFactory, LogLevel } from './contracts'\n\n/**\n * @notExported\n */\nexport class LoggerBuilder {\n\n\tprotected context: IContext\n\n\tprotected factory: ILoggerFactory\n\n\tconstructor(factory: ILoggerFactory) {\n\t\tthis.context = {}\n\t\tthis.factory = factory\n\t}\n\n\t/**\n\t * Set the app name within the logging context\n\t *\n\t * @param appId App name\n\t */\n\tsetApp(appId: string): LoggerBuilder {\n\t\tthis.context.app = appId\n\t\treturn this\n\t}\n\n\t/**\n\t * Set the logging level within the logging context\n\t *\n\t * @param level Logging level\n\t */\n\tsetLogLevel(level: LogLevel) {\n\t\tthis.context.level = level\n\t\treturn this\n\t}\n\n\t/* eslint-disable jsdoc/no-undefined-types */\n\t/**\n\t * Set the user id within the logging context\n\t * @param uid User ID\n\t * @see {@link detectUser}\n\t */\n\t/* eslint-enable jsdoc/no-undefined-types */\n\tsetUid(uid: string): LoggerBuilder {\n\t\tthis.context.uid = uid\n\t\treturn this\n\t}\n\n\t/**\n\t * Detect the currently logged in user and set the user id within the logging context\n\t */\n\tdetectUser(): LoggerBuilder {\n\t\tconst user = getCurrentUser()\n\t\tif (user !== null) {\n\t\t\tthis.context.uid = user.uid\n\t\t}\n\n\t\treturn this\n\t}\n\n\t/**\n\t * Detect and use logging level configured in nextcloud config\n\t */\n\tdetectLogLevel(): LoggerBuilder {\n\t\t// eslint-disable-next-line @typescript-eslint/no-this-alias\n\t\tconst self = this\n\n\t\t// Use arrow function to prevent undefined `this` within event handler\n\t\tconst onLoaded = () => {\n\t\t\tif (document.readyState === 'complete' || (document.readyState === 'interactive')) {\n\t\t\t\t// Up to, including, nextcloud 24 the loglevel was not exposed\n\t\t\t\tself.context.level = window._oc_config?.loglevel ?? LogLevel.Warn\n\t\t\t\t// Override loglevel if we are in debug mode\n\t\t\t\tif (window._oc_debug) {\n\t\t\t\t\tself.context.level = LogLevel.Debug\n\t\t\t\t}\n\t\t\t\tdocument.removeEventListener('readystatechange', onLoaded)\n\t\t\t} else {\n\t\t\t\tdocument.addEventListener('readystatechange', onLoaded)\n\t\t\t}\n\t\t}\n\n\t\tonLoaded()\n\t\treturn this\n\t}\n\n\t/** Build a logger using the logging context and factory */\n\tbuild(): ILogger {\n\t\tif (this.context.level === undefined) {\n\t\t\t// No logging level set manually, use the configured one\n\t\t\tthis.detectLogLevel()\n\t\t}\n\n\t\treturn this.factory(this.context)\n\t}\n\n}\n","/**\n * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\nimport { buildConsoleLogger } from './ConsoleLogger'\nimport { ILogger } from './contracts'\nimport { LoggerBuilder } from './LoggerBuilder'\n\n/**\n * Build a customized logger instance\n */\nexport function getLoggerBuilder(): LoggerBuilder {\n\treturn new LoggerBuilder(buildConsoleLogger)\n}\n\n/**\n * Get a default logger instance without any configuration\n */\nexport function getLogger(): ILogger {\n\treturn getLoggerBuilder().build()\n}\n\nexport { type LoggerBuilder }\nexport { LogLevel, type ILogger, type ILoggerFactory } from './contracts'\n"],"names":["LogLevel"],"mappings":";AAIO,IAAK,6BAAAA,cAAL;AACNA,YAAAA,UAAA,WAAQ,CAAA,IAAR;AACAA,YAAAA,UAAA,UAAO,CAAA,IAAP;AACAA,YAAAA,UAAA,UAAO,CAAA,IAAP;AACAA,YAAAA,UAAA,WAAQ,CAAA,IAAR;AACAA,YAAAA,UAAA,WAAQ,CAAA,IAAR;AALW,SAAAA;AAAA,GAAA,YAAA,CAAA,CAAA;ACEL,MAAM,cAAiC;AAAA,EAErC;AAAA,EAER,YAAY,SAAoB;AAC/B,SAAK,UAAU,WAAW,CAAA;AAAA,EAC3B;AAAA,EAEQ,cAAc,SAAuB,OAAiB,SAA4B;AACzF,QAAI,MAAM,MAAM,SAAS,KAAK,EAAE,gBAAgB;AAEhD,QAAI,WAAW,QAAQ,KAAK;AAC3B,aAAO,QAAQ,MAAM;AAAA,IACtB;AAEA,QAAI,OAAO,YAAY,SAAU,QAAO,MAAM;AAG9C,WAAO,cAAc,QAAQ,IAAI;AACjC,QAAI,QAAQ,QAAS,QAAO,KAAK,QAAQ,OAAO;AAEhD,QAAI,UAAU,SAAS,SAAS,QAAQ,MAAO,QAAO;AAAA;AAAA;AAAA,EAAqB,QAAQ,KAAK;AAExF,WAAO;AAAA,EACR;AAAA,EAEA,IAAI,OAAiB,SAAuB,SAAmB;AAE9D,QAAI,OAAO,KAAK,SAAS,UAAU,YAAY,QAAQ,KAAK,SAAS,OAAO;AAC3E;AAAA,IACD;AAGA,QAAI,OAAO,YAAY,YAAY,SAAS,UAAU,QAAW;AAChE,cAAQ,QAAQ;AAAA,IACjB;AAEA,YAAQ,OAAA;AAAA,MACR,KAAK,SAAS;AACb,gBAAQ,MAAM,KAAK,cAAc,SAAS,SAAS,OAAO,OAAO,GAAG,OAAO;AAC3E;AAAA,MACD,KAAK,SAAS;AACb,gBAAQ,KAAK,KAAK,cAAc,SAAS,SAAS,MAAM,OAAO,GAAG,OAAO;AACzE;AAAA,MACD,KAAK,SAAS;AACb,gBAAQ,KAAK,KAAK,cAAc,SAAS,SAAS,MAAM,OAAO,GAAG,OAAO;AACzE;AAAA,MACD,KAAK,SAAS;AACb,gBAAQ,MAAM,KAAK,cAAc,SAAS,SAAS,OAAO,OAAO,GAAG,OAAO;AAC3E;AAAA,MACD,KAAK,SAAS;AAAA,MACd;AACC,gBAAQ,MAAM,KAAK,cAAc,SAAS,SAAS,OAAO,OAAO,GAAG,OAAO;AAC3E;AAAA,IAAA;AAAA,EAEF;AAAA,EAEA,MAAM,SAAuB,SAA0B;AACtD,SAAK,IAAI,SAAS,OAAO,SAAS,OAAO,OAAO,IAAI,KAAK,SAAS,OAAO,CAAC;AAAA,EAC3E;AAAA,EAEA,KAAK,SAAuB,SAA0B;AACrD,SAAK,IAAI,SAAS,MAAM,SAAS,OAAO,OAAO,IAAI,KAAK,SAAS,OAAO,CAAC;AAAA,EAC1E;AAAA,EAEA,KAAK,SAAuB,SAA0B;AACrD,SAAK,IAAI,SAAS,MAAM,SAAS,OAAO,OAAO,IAAI,KAAK,SAAS,OAAO,CAAC;AAAA,EAC1E;AAAA,EAEA,MAAM,SAAuB,SAA0B;AACtD,SAAK,IAAI,SAAS,OAAO,SAAS,OAAO,OAAO,IAAI,KAAK,SAAS,OAAO,CAAC;AAAA,EAC3E;AAAA,EAEA,MAAM,SAAuB,SAA0B;AACtD,SAAK,IAAI,SAAS,OAAO,SAAS,OAAO,OAAO,IAAI,KAAK,SAAS,OAAO,CAAC;AAAA,EAC3E;AAED;AAOO,SAAS,mBAAmB,SAA6B;AAC/D,SAAO,IAAI,cAAc,OAAO;AACjC;AClFO,MAAM,cAAc;AAAA,EAEhB;AAAA,EAEA;AAAA,EAEV,YAAY,SAAyB;AACpC,SAAK,UAAU,CAAA;AACf,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,OAA8B;AACpC,SAAK,QAAQ,MAAM;AACnB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,OAAiB;AAC5B,SAAK,QAAQ,QAAQ;AACrB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,KAA4B;AAClC,SAAK,QAAQ,MAAM;AACnB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,aAA4B;AAC3B,UAAM,OAAO,eAAA;AACb,QAAI,SAAS,MAAM;AAClB,WAAK,QAAQ,MAAM,KAAK;AAAA,IACzB;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAgC;AAE/B,UAAM,OAAO;AAGb,UAAM,WAAW,MAAM;AACtB,UAAI,SAAS,eAAe,cAAe,SAAS,eAAe,eAAgB;AAElF,aAAK,QAAQ,QAAQ,OAAO,YAAY,YAAY,SAAS;AAE7D,YAAI,OAAO,WAAW;AACrB,eAAK,QAAQ,QAAQ,SAAS;AAAA,QAC/B;AACA,iBAAS,oBAAoB,oBAAoB,QAAQ;AAAA,MAC1D,OAAO;AACN,iBAAS,iBAAiB,oBAAoB,QAAQ;AAAA,MACvD;AAAA,IACD;AAEA,aAAA;AACA,WAAO;AAAA,EACR;AAAA;AAAA,EAGA,QAAiB;AAChB,QAAI,KAAK,QAAQ,UAAU,QAAW;AAErC,WAAK,eAAA;AAAA,IACN;AAEA,WAAO,KAAK,QAAQ,KAAK,OAAO;AAAA,EACjC;AAED;AC1FO,SAAS,mBAAkC;AACjD,SAAO,IAAI,cAAc,kBAAkB;AAC5C;AAKO,SAAS,YAAqB;AACpC,SAAO,iBAAA,EAAmB,MAAA;AAC3B;"}