Source

services/SparkLogger.ts

/**
 * This logger class provides a set of utility logging functions to SPARK developers.
 *
 * The intent is to provide a single system to use for logging, which can be modified/updated to meet future logging
 * needs without requiring developers to modify existing applications use of the service.
 *
 * Currently the logger only provides some basic wrapper functions to allow developers to log messages to the console
 * while the react build is not production (e.g. during local development).
 *
 * In future, the logger should:
 *  - Support multiple logging destinations (including remote destinations)
 *  - Contain additional debugging features
 *  - Contain performance logging capacity
 *
 *  A singleton instance of the `SparkLogger` is exported as `logger`, and can be imported with
 *  `import {logger} from '@jcu/spark'`
 *
 *  @category Services
 */
export class SparkLogger {
    console: Console = window.console

    _devMode: boolean = false

    /**
     * A wrapper function for `console.warn` that only logs if `devMode` is true, i.e. not a production build.
     *
     * Has the same parameters and return values as `console.warn`
     */
    devWarn(message?: any, ...optionalParams: any[]): void {
        //TODO: Update this to use styled console.log instead of console.warn to prevent unnecessary stack tracing
        if (this._devMode) {
            return this.console.warn(message, ...optionalParams)
        } else {
            return undefined
        }
    }

    /**
     * A wrapper function for `console.error` that only logs if `devMode` is true, i.e. not a production build.
     *
     * Has the same parameters and return values as `console.error`
     */
    devError(message?: any, ...optionalParams: any[]): void {
        if (this._devMode) {
            return this.console.error(message, ...optionalParams)
        } else {
            return undefined
        }
    }

    /**
     * A wrapper function for `console.log` that only logs if `devMode` is true, i.e. not a production build.
     *
     * Has the same parameters and return values as `console.log`
     */
    devLog(message?: any, ...optionalParams: any[]): void {
        if (this._devMode) {
            return this.console.log(message, ...optionalParams)
        } else {
            return undefined
        }
    }

    set devMode(devMode: boolean) {
        this._devMode = devMode
    }

    get devMode() {
        return this._devMode
    }

    /**
     * Constructor currently sets `devMode` during instantiation
     */
    constructor() {
        //TODO: Convert this to use the useEnvironmentCheck hook (may need a bigger refactor)
        this._devMode = process.env.NODE_ENV !== 'production'
    }
}

// Instantiates a singleton instance of SparkLogger.
export let logger = new SparkLogger()