Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .eslintrc.json

This file was deleted.

18 changes: 18 additions & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: CC0-1.0
*/

import { recommendedLibrary } from '@nextcloud/eslint-config'
import { defineConfig } from 'eslint/config'

export default defineConfig([
{
linterOptions: {
reportUnusedDisableDirectives: 'error',
reportUnusedInlineConfigs: 'error',
},
},

...recommendedLibrary,
])
76 changes: 42 additions & 34 deletions lib/ConsoleLogger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,35 +2,44 @@
* SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: GPL-3.0-or-later
*/
import { IContext, ILogger, LogLevel } from './contracts'

export class ConsoleLogger implements ILogger {
import type { IContext, ILogger } from './contracts.ts'

import { LogLevel } from './contracts.ts'

/* eslint-disable no-console -- This class is a console logger so it needs to write to the console. */
export class ConsoleLogger implements ILogger {
private context: IContext

constructor(context?: IContext) {
this.context = context || {}
}

private formatMessage(message: string|Error, level: LogLevel, context?: IContext): string {
private formatMessage(message: string | Error, level: LogLevel, context?: IContext): string {
let msg = '[' + LogLevel[level].toUpperCase() + '] '

if (context && context.app) {
msg += context.app + ': '
}

if (typeof message === 'string') return msg + message
if (typeof message === 'string') {
return msg + message
}

// basic error formatting
msg += `Unexpected ${message.name}`
if (message.message) msg += ` "${message.message}"`
if (message.message) {
msg += ` "${message.message}"`
}
// only add stack trace when debugging
if (level === LogLevel.Debug && message.stack) msg += `\n\nStack trace:\n${message.stack}`
if (level === LogLevel.Debug && message.stack) {
msg += `\n\nStack trace:\n${message.stack}`
}

return msg
}

log(level: LogLevel, message: string|Error, context: IContext) {
log(level: LogLevel, message: string | Error, context: IContext) {
// Skip if level is configured and this is below the level
if (typeof this.context?.level === 'number' && level < this.context?.level) {
return
Expand All @@ -42,45 +51,44 @@ export class ConsoleLogger implements ILogger {
}

switch (level) {
case LogLevel.Debug:
console.debug(this.formatMessage(message, LogLevel.Debug, context), context)
break
case LogLevel.Info:
console.info(this.formatMessage(message, LogLevel.Info, context), context)
break
case LogLevel.Warn:
console.warn(this.formatMessage(message, LogLevel.Warn, context), context)
break
case LogLevel.Error:
console.error(this.formatMessage(message, LogLevel.Error, context), context)
break
case LogLevel.Fatal:
default:
console.error(this.formatMessage(message, LogLevel.Fatal, context), context)
break
case LogLevel.Debug:
console.debug(this.formatMessage(message, LogLevel.Debug, context), context)
break
case LogLevel.Info:
console.info(this.formatMessage(message, LogLevel.Info, context), context)
break
case LogLevel.Warn:
console.warn(this.formatMessage(message, LogLevel.Warn, context), context)
break
case LogLevel.Error:
console.error(this.formatMessage(message, LogLevel.Error, context), context)
break
case LogLevel.Fatal:
default:
console.error(this.formatMessage(message, LogLevel.Fatal, context), context)
break
}
}

debug(message: string|Error, context?: IContext): void {
this.log(LogLevel.Debug, message, Object.assign({}, this.context, context))
debug(message: string | Error, context?: IContext): void {
this.log(LogLevel.Debug, message, { ...this.context, ...context })
}

info(message: string|Error, context?: IContext): void {
this.log(LogLevel.Info, message, Object.assign({}, this.context, context))
info(message: string | Error, context?: IContext): void {
this.log(LogLevel.Info, message, { ...this.context, ...context })
}

warn(message: string|Error, context?: IContext): void {
this.log(LogLevel.Warn, message, Object.assign({}, this.context, context))
warn(message: string | Error, context?: IContext): void {
this.log(LogLevel.Warn, message, { ...this.context, ...context })
}

error(message: string|Error, context?: IContext): void {
this.log(LogLevel.Error, message, Object.assign({}, this.context, context))
error(message: string | Error, context?: IContext): void {
this.log(LogLevel.Error, message, { ...this.context, ...context })
}

fatal(message: string|Error, context?: IContext): void {
this.log(LogLevel.Fatal, message, Object.assign({}, this.context, context))
fatal(message: string | Error, context?: IContext): void {
this.log(LogLevel.Fatal, message, { ...this.context, ...context })
}

}

/**
Expand Down
14 changes: 6 additions & 8 deletions lib/LoggerBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,13 @@
* SPDX-FileCopyrightText: 2020-2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: GPL-3.0-or-later
*/

import type { IContext, ILogger, ILoggerFactory } from './contracts.ts'

import { getCurrentUser } from '@nextcloud/auth'
import { IContext, ILogger, ILoggerFactory, LogLevel } from './contracts'
import { LogLevel } from './contracts.ts'

/**
* @notExported
*/
export class LoggerBuilder {

protected context: IContext

protected factory: ILoggerFactory
Expand Down Expand Up @@ -39,13 +38,13 @@ export class LoggerBuilder {
return this
}

/* eslint-disable jsdoc/no-undefined-types */
/**
* Set the user id within the logging context
*
* @param uid User ID
* @see {@link detectUser}
*/
/* eslint-enable jsdoc/no-undefined-types */

setUid(uid: string): LoggerBuilder {
this.context.uid = uid
return this
Expand Down Expand Up @@ -95,5 +94,4 @@ export class LoggerBuilder {

return this.factory(this.context)
}

}
9 changes: 5 additions & 4 deletions lib/global.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: GPL-3.0-or-later or LGPL-3.0-or-later
*/
import type { LogLevel } from './contracts'

import type { LogLevel } from './contracts.ts'

declare global {
interface Window {
_oc_config: {
loglevel: LogLevel,
},
_oc_debug: boolean,
loglevel: LogLevel
}
_oc_debug: boolean
}
}

Expand Down
14 changes: 9 additions & 5 deletions lib/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,14 @@
* SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: GPL-3.0-or-later
*/
import { buildConsoleLogger } from './ConsoleLogger'
import { ILogger } from './contracts'
import { LoggerBuilder } from './LoggerBuilder'

import type { ILogger } from './contracts.ts'

import { buildConsoleLogger } from './ConsoleLogger.ts'
import { LoggerBuilder } from './LoggerBuilder.ts'

export type { LoggerBuilder }
export type { ILogger, ILoggerFactory } from './contracts.ts'

/**
* Build a customized logger instance
Expand All @@ -20,5 +25,4 @@ export function getLogger(): ILogger {
return getLoggerBuilder().build()
}

export { type LoggerBuilder }
export { LogLevel, type ILogger, type ILoggerFactory } from './contracts'
export { LogLevel } from './contracts.ts'
Loading