diff --git a/demo/App.tsx b/demo/App.tsx index 6971695b6..b99fbf122 100644 --- a/demo/App.tsx +++ b/demo/App.tsx @@ -1,9 +1,9 @@ import './src/gesture-handler'; +import { Logger, fetchWrapper, formatDate } from './src/Helpers'; import { SafeAreaInsetsContext, SafeAreaProvider, } from 'react-native-safe-area-context'; -import { fetchWrapper, formatDate } from './src/helpers'; import Behaviors from './src/Behaviors'; import { BottomTabBar } from './src/Core'; import { BottomTabBarContextProvider } from './src/Contexts'; @@ -36,6 +36,7 @@ export default () => ( entrypointUrl={`${Constants.expoConfig?.extra?.baseUrl}/hyperview/public/index.xml`} fetch={fetchWrapper} formatDate={formatDate} + logger={new Logger(Logger.Level.log)} navigationComponents={{ BottomTabBar, }} diff --git a/demo/src/Helpers/index.ts b/demo/src/Helpers/index.ts new file mode 100644 index 000000000..346f2c3ae --- /dev/null +++ b/demo/src/Helpers/index.ts @@ -0,0 +1,2 @@ +export * from './misc'; +export * from './logger'; diff --git a/demo/src/Helpers/logger.ts b/demo/src/Helpers/logger.ts new file mode 100644 index 000000000..b781ae32f --- /dev/null +++ b/demo/src/Helpers/logger.ts @@ -0,0 +1,62 @@ +// eslint-disable-next-line no-shadow +enum Level { + info = 0, + log = 1, + warn = 2, + error = 3, +} + +const Levels = [Level.info, Level.log, Level.warn, Level.error]; +const LogFunctions = { + [Level.info]: console.info, + [Level.log]: console.log, + [Level.warn]: console.warn, + [Level.error]: console.error, +}; + +/** + * Handles deferredToString objects by calling toString() prior to forwarding to console + */ +const convertDeferred = (m?: unknown): string | unknown => { + try { + return m?.toString(); + } catch (e) { + return m; + } +}; + +export class Logger { + public static Level = Level; + + protected level: number; + + constructor(level: Level) { + this.level = Levels.indexOf(level); + } + + public log = (m?: unknown, ...p: unknown[]): void => { + this.emitter(Level.log, m, ...p); + }; + + public info = (m?: unknown, ...p: unknown[]): void => { + this.emitter(Level.info, m, ...p); + }; + + public warn = (m?: unknown, ...p: unknown[]): void => { + this.emitter(Level.warn, m, ...p); + }; + + public error = (m?: unknown, ...p: unknown[]): void => { + this.emitter(Level.error, m, ...p); + }; + + protected emitter = (level: Level, m?: unknown, ...p: unknown[]): void => { + if (this.level > Levels.indexOf(level)) { + return; + } + LogFunctions[level]( + convertDeferred(m), + p.map(param => convertDeferred(param)), + ); + }; +} diff --git a/demo/src/helpers.ts b/demo/src/Helpers/misc.ts similarity index 100% rename from demo/src/helpers.ts rename to demo/src/Helpers/misc.ts diff --git a/src/services/logging/default-logger.ts b/src/services/logging/default-logger.ts deleted file mode 100644 index f3d3e3f4b..000000000 --- a/src/services/logging/default-logger.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ - -import { ToStringHelper } from './tostring-helper'; - -/** - * Handles deferredToString objects by calling toString() prior to forwarding to console - */ -export class DefaultLogger { - convertDeferred = (m?: any): any => { - if (m instanceof ToStringHelper) { - return m.toString(); - } - return m; - }; - - log = (m?: any, ...p: any[]): void => - console.log( - this.convertDeferred(m), - p.map(param => this.convertDeferred(param)), - ); - - info = (m?: any, ...p: any[]): void => - console.info( - this.convertDeferred(m), - p.map(param => this.convertDeferred(param)), - ); - - warn = (m?: any, ...p: any[]): void => - console.warn( - this.convertDeferred(m), - p.map(param => this.convertDeferred(param)), - ); - - error = (m?: any, ...p: any[]): void => - console.error( - this.convertDeferred(m), - p.map(param => this.convertDeferred(param)), - ); -} diff --git a/src/services/logging/index.ts b/src/services/logging/index.ts index 320e5cef0..896e6f11c 100644 --- a/src/services/logging/index.ts +++ b/src/services/logging/index.ts @@ -1,9 +1,8 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { DefaultLogger } from './default-logger'; import type { Logger } from './types'; -let logger: Logger = new DefaultLogger(); +let logger: Logger | null; export function initialize(loggerInstance: Logger | undefined): void { if (loggerInstance) { @@ -11,10 +10,10 @@ export function initialize(loggerInstance: Logger | undefined): void { } } -export const log = (m?: any, ...p: any[]): void => logger.log(m, ...p); -export const info = (m?: any, ...p: any[]): void => logger.info(m, ...p); -export const warn = (m?: any, ...p: any[]): void => logger.warn(m, ...p); -export const error = (m?: any, ...p: any[]): void => logger.error(m, ...p); +export const log = (m?: any, ...p: any[]): void => logger?.log(m, ...p); +export const info = (m?: any, ...p: any[]): void => logger?.info(m, ...p); +export const warn = (m?: any, ...p: any[]): void => logger?.warn(m, ...p); +export const error = (m?: any, ...p: any[]): void => logger?.error(m, ...p); export type { Logger } from './types'; export { deferredToString } from './tostring-helper'; diff --git a/src/services/logging/tostring-helper.test.ts b/src/services/logging/tostring-helper.test.ts index 12381edd4..187ab491c 100644 --- a/src/services/logging/tostring-helper.test.ts +++ b/src/services/logging/tostring-helper.test.ts @@ -1,10 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { DefaultLogger } from './default-logger'; import { deferredToString } from './tostring-helper'; -const logger = new DefaultLogger(); - describe('deferredToString', () => { describe('with string', () => { const helper = deferredToString('foo'); @@ -40,16 +37,6 @@ describe('deferredToString', () => { expect(helperSpy).toHaveBeenCalledTimes(1); expect(helperVal).toEqual('foo'); }); - - it('does call toString when using custom logger', () => { - logger.log('helper', helper); - expect(helperSpy).toHaveBeenCalledTimes(1); - }); - - it('does call toString on each param when using custom logger', () => { - logger.log('helper', helper, helper, helper); - expect(helperSpy).toHaveBeenCalledTimes(3); - }); }); describe('with func', () => { @@ -90,15 +77,5 @@ describe('deferredToString', () => { expect(expensiveMock).toHaveBeenCalledTimes(1); expect(helperVal).toEqual('this was expensive'); }); - - it('does call toString when using custom logger', () => { - logger.log('helper', helper); - expect(expensiveMock).toHaveBeenCalledTimes(1); - }); - - it('does call toString on each param when using custom logger', () => { - logger.log('helper', helper, helper, helper); - expect(expensiveMock).toHaveBeenCalledTimes(3); - }); }); });